'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; }; }(); // special flexbox specifications var _prefixAll2 = require('./static/prefixAll'); var _prefixAll3 = _interopRequireDefault(_prefixAll2); 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 _sortPrefixedStyle = require('./utils/sortPrefixedStyle'); var _sortPrefixedStyle2 = _interopRequireDefault(_sortPrefixedStyle); var _prefixProps = require('./prefixProps'); var _prefixProps2 = _interopRequireDefault(_prefixProps); var _position = require('./plugins/position'); var _position2 = _interopRequireDefault(_position); var _calc = require('./plugins/calc'); var _calc2 = _interopRequireDefault(_calc); var _zoomCursor = require('./plugins/zoomCursor'); var _zoomCursor2 = _interopRequireDefault(_zoomCursor); var _grabCursor = require('./plugins/grabCursor'); var _grabCursor2 = _interopRequireDefault(_grabCursor); var _flex = require('./plugins/flex'); var _flex2 = _interopRequireDefault(_flex); var _sizing = require('./plugins/sizing'); var _sizing2 = _interopRequireDefault(_sizing); var _gradient = require('./plugins/gradient'); var _gradient2 = _interopRequireDefault(_gradient); var _transition = require('./plugins/transition'); var _transition2 = _interopRequireDefault(_transition); var _flexboxIE = require('./plugins/flexboxIE'); var _flexboxIE2 = _interopRequireDefault(_flexboxIE); var _flexboxOld = require('./plugins/flexboxOld'); var _flexboxOld2 = _interopRequireDefault(_flexboxOld); 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"); } } var plugins = [_position2.default, _calc2.default, _zoomCursor2.default, _grabCursor2.default, _sizing2.default, _gradient2.default, _transition2.default, _flexboxIE2.default, _flexboxOld2.default, // this must be run AFTER the flexbox specs _flex2.default]; var Prefixer = 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 _this = this; 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; this._browserInfo = (0, _getBrowserInformation2.default)(this._userAgent); // Checks if the userAgent was resolved correctly if (this._browserInfo && this._browserInfo.prefix) { // set additional prefix information this.cssPrefix = this._browserInfo.prefix.css; this.jsPrefix = this._browserInfo.prefix.inline; this.prefixedKeyframes = (0, _getPrefixedKeyframes2.default)(this._browserInfo); } else { this._usePrefixAllFallback = true; return false; } var data = this._browserInfo.browser && _prefixProps2.default[this._browserInfo.browser]; if (data) { this._requiresPrefix = Object.keys(data).filter(function (key) { return data[key] >= _this._browserInfo.version; }).reduce(function (result, name) { result[name] = true; return result; }, {}); this._hasPropsRequiringPrefix = Object.keys(this._requiresPrefix).length > 0; } else { this._usePrefixAllFallback = true; } } /** * Returns a prefixed version of the style object * @param {Object} styles - Style object that gets prefixed properties added * @returns {Object} - Style object with prefixed properties and values */ _createClass(Prefixer, [{ key: 'prefix', value: function prefix(styles) { var _this2 = this; // use prefixAll as fallback if userAgent can not be resolved if (this._usePrefixAllFallback) { return (0, _prefixAll3.default)(styles); } // only add prefixes if needed if (!this._hasPropsRequiringPrefix) { return styles; } Object.keys(styles).forEach(function (property) { var value = styles[property]; if (value instanceof Object && !Array.isArray(value)) { // recurse through nested style objects styles[property] = _this2.prefix(value); } else { // add prefixes if needed if (_this2._requiresPrefix[property]) { styles[_this2.jsPrefix + (0, _capitalizeString2.default)(property)] = value; if (!_this2._keepUnprefixed) { delete styles[property]; } } } }); Object.keys(styles).forEach(function (property) { [].concat(styles[property]).forEach(function (value) { // resolve plugins plugins.forEach(function (plugin) { // generates a new plugin interface with current data assignStyles(styles, plugin({ property: property, value: value, styles: styles, browserInfo: _this2._browserInfo, prefix: { js: _this2.jsPrefix, css: _this2.cssPrefix, keyframes: _this2.prefixedKeyframes }, keepUnprefixed: _this2._keepUnprefixed, requiresPrefix: _this2._requiresPrefix }), value, _this2._keepUnprefixed); }); }); }); return (0, _sortPrefixedStyle2.default)(styles); } /** * 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 (0, _prefixAll3.default)(styles); } }]); return Prefixer; }(); exports.default = Prefixer; function assignStyles(base) { var extend = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var value = arguments[2]; var keepUnprefixed = arguments[3]; Object.keys(extend).forEach(function (property) { var baseValue = base[property]; if (Array.isArray(baseValue)) { [].concat(extend[property]).forEach(function (val) { if (base[property].indexOf(val) === -1) { base[property].splice(baseValue.indexOf(value), keepUnprefixed ? 0 : 1, val); } }); } else { base[property] = extend[property]; } }); } module.exports = exports['default'];