'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); exports.default = createPrefixer; var _getBrowserInformation = require('../utils/getBrowserInformation'); var _getBrowserInformation2 = _interopRequireDefault(_getBrowserInformation); var _getPrefixedKeyframes = require('../utils/getPrefixedKeyframes'); var _getPrefixedKeyframes2 = _interopRequireDefault(_getPrefixedKeyframes); var _capitalizeString = require('../utils/capitalizeString'); var _capitalizeString2 = _interopRequireDefault(_capitalizeString); var _addNewValuesOnly = require('../utils/addNewValuesOnly'); var _addNewValuesOnly2 = _interopRequireDefault(_addNewValuesOnly); var _isObject = require('../utils/isObject'); var _isObject2 = _interopRequireDefault(_isObject); var _prefixValue = require('../utils/prefixValue'); var _prefixValue2 = _interopRequireDefault(_prefixValue); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function createPrefixer(_ref) { var prefixMap = _ref.prefixMap, plugins = _ref.plugins; var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (style) { return style; }; return function () { /** * Instantiante a new prefixer * @param {string} userAgent - userAgent to gather prefix information according to caniuse.com * @param {string} keepUnprefixed - keeps unprefixed properties and values */ function Prefixer() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Prefixer); var defaultUserAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined; this._userAgent = options.userAgent || defaultUserAgent; this._keepUnprefixed = options.keepUnprefixed || false; if (this._userAgent) { this._browserInfo = (0, _getBrowserInformation2.default)(this._userAgent); } // Checks if the userAgent was resolved correctly if (this._browserInfo && this._browserInfo.cssPrefix) { this.prefixedKeyframes = (0, _getPrefixedKeyframes2.default)(this._browserInfo.browserName, this._browserInfo.browserVersion, this._browserInfo.cssPrefix); } else { this._useFallback = true; return false; } var prefixData = this._browserInfo.browserName && prefixMap[this._browserInfo.browserName]; if (prefixData) { this._requiresPrefix = {}; for (var property in prefixData) { if (prefixData[property] >= this._browserInfo.browserVersion) { this._requiresPrefix[property] = true; } } this._hasPropsRequiringPrefix = Object.keys(this._requiresPrefix).length > 0; } else { this._useFallback = true; } this._metaData = { browserVersion: this._browserInfo.browserVersion, browserName: this._browserInfo.browserName, cssPrefix: this._browserInfo.cssPrefix, jsPrefix: this._browserInfo.jsPrefix, keepUnprefixed: this._keepUnprefixed, requiresPrefix: this._requiresPrefix }; } _createClass(Prefixer, [{ key: 'prefix', value: function prefix(style) { // use static prefixer as fallback if userAgent can not be resolved if (this._useFallback) { return fallback(style); } // only add prefixes if needed if (!this._hasPropsRequiringPrefix) { return style; } return this._prefixStyle(style); } }, { key: '_prefixStyle', value: function _prefixStyle(style) { for (var property in style) { var value = style[property]; // handle nested objects if ((0, _isObject2.default)(value)) { style[property] = this.prefix(value); // handle array values } else if (Array.isArray(value)) { var combinedValue = []; for (var i = 0, len = value.length; i < len; ++i) { var processedValue = (0, _prefixValue2.default)(plugins, property, value[i], style, this._metaData); (0, _addNewValuesOnly2.default)(combinedValue, processedValue || value[i]); } // only modify the value if it was touched // by any plugin to prevent unnecessary mutations if (combinedValue.length > 0) { style[property] = combinedValue; } } else { var _processedValue = (0, _prefixValue2.default)(plugins, property, value, style, this._metaData); // only modify the value if it was touched // by any plugin to prevent unnecessary mutations if (_processedValue) { style[property] = _processedValue; } // add prefixes to properties if (this._requiresPrefix.hasOwnProperty(property)) { style[this._browserInfo.jsPrefix + (0, _capitalizeString2.default)(property)] = value; if (!this._keepUnprefixed) { delete style[property]; } } } } return style; } /** * Returns a prefixed version of the style object using all vendor prefixes * @param {Object} styles - Style object that gets prefixed properties added * @returns {Object} - Style object with prefixed properties and values */ }], [{ key: 'prefixAll', value: function prefixAll(styles) { return fallback(styles); } }]); return Prefixer; }(); } module.exports = exports['default'];