Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

175 řádky
6.2 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. 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; }; }();
  6. exports.default = createPrefixer;
  7. var _getBrowserInformation = require('../utils/getBrowserInformation');
  8. var _getBrowserInformation2 = _interopRequireDefault(_getBrowserInformation);
  9. var _getPrefixedKeyframes = require('../utils/getPrefixedKeyframes');
  10. var _getPrefixedKeyframes2 = _interopRequireDefault(_getPrefixedKeyframes);
  11. var _capitalizeString = require('../utils/capitalizeString');
  12. var _capitalizeString2 = _interopRequireDefault(_capitalizeString);
  13. var _addNewValuesOnly = require('../utils/addNewValuesOnly');
  14. var _addNewValuesOnly2 = _interopRequireDefault(_addNewValuesOnly);
  15. var _isObject = require('../utils/isObject');
  16. var _isObject2 = _interopRequireDefault(_isObject);
  17. var _prefixValue = require('../utils/prefixValue');
  18. var _prefixValue2 = _interopRequireDefault(_prefixValue);
  19. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  20. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  21. function createPrefixer(_ref) {
  22. var prefixMap = _ref.prefixMap,
  23. plugins = _ref.plugins;
  24. var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (style) {
  25. return style;
  26. };
  27. return function () {
  28. /**
  29. * Instantiante a new prefixer
  30. * @param {string} userAgent - userAgent to gather prefix information according to caniuse.com
  31. * @param {string} keepUnprefixed - keeps unprefixed properties and values
  32. */
  33. function Prefixer() {
  34. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  35. _classCallCheck(this, Prefixer);
  36. var defaultUserAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;
  37. this._userAgent = options.userAgent || defaultUserAgent;
  38. this._keepUnprefixed = options.keepUnprefixed || false;
  39. if (this._userAgent) {
  40. this._browserInfo = (0, _getBrowserInformation2.default)(this._userAgent);
  41. }
  42. // Checks if the userAgent was resolved correctly
  43. if (this._browserInfo && this._browserInfo.cssPrefix) {
  44. this.prefixedKeyframes = (0, _getPrefixedKeyframes2.default)(this._browserInfo.browserName, this._browserInfo.browserVersion, this._browserInfo.cssPrefix);
  45. } else {
  46. this._useFallback = true;
  47. return false;
  48. }
  49. var prefixData = this._browserInfo.browserName && prefixMap[this._browserInfo.browserName];
  50. if (prefixData) {
  51. this._requiresPrefix = {};
  52. for (var property in prefixData) {
  53. if (prefixData[property] >= this._browserInfo.browserVersion) {
  54. this._requiresPrefix[property] = true;
  55. }
  56. }
  57. this._hasPropsRequiringPrefix = Object.keys(this._requiresPrefix).length > 0;
  58. } else {
  59. this._useFallback = true;
  60. }
  61. this._metaData = {
  62. browserVersion: this._browserInfo.browserVersion,
  63. browserName: this._browserInfo.browserName,
  64. cssPrefix: this._browserInfo.cssPrefix,
  65. jsPrefix: this._browserInfo.jsPrefix,
  66. keepUnprefixed: this._keepUnprefixed,
  67. requiresPrefix: this._requiresPrefix
  68. };
  69. }
  70. _createClass(Prefixer, [{
  71. key: 'prefix',
  72. value: function prefix(style) {
  73. // use static prefixer as fallback if userAgent can not be resolved
  74. if (this._useFallback) {
  75. return fallback(style);
  76. }
  77. // only add prefixes if needed
  78. if (!this._hasPropsRequiringPrefix) {
  79. return style;
  80. }
  81. return this._prefixStyle(style);
  82. }
  83. }, {
  84. key: '_prefixStyle',
  85. value: function _prefixStyle(style) {
  86. for (var property in style) {
  87. var value = style[property];
  88. // handle nested objects
  89. if ((0, _isObject2.default)(value)) {
  90. style[property] = this.prefix(value);
  91. // handle array values
  92. } else if (Array.isArray(value)) {
  93. var combinedValue = [];
  94. for (var i = 0, len = value.length; i < len; ++i) {
  95. var processedValue = (0, _prefixValue2.default)(plugins, property, value[i], style, this._metaData);
  96. (0, _addNewValuesOnly2.default)(combinedValue, processedValue || value[i]);
  97. }
  98. // only modify the value if it was touched
  99. // by any plugin to prevent unnecessary mutations
  100. if (combinedValue.length > 0) {
  101. style[property] = combinedValue;
  102. }
  103. } else {
  104. var _processedValue = (0, _prefixValue2.default)(plugins, property, value, style, this._metaData);
  105. // only modify the value if it was touched
  106. // by any plugin to prevent unnecessary mutations
  107. if (_processedValue) {
  108. style[property] = _processedValue;
  109. }
  110. // add prefixes to properties
  111. if (this._requiresPrefix.hasOwnProperty(property)) {
  112. style[this._browserInfo.jsPrefix + (0, _capitalizeString2.default)(property)] = value;
  113. if (!this._keepUnprefixed) {
  114. delete style[property];
  115. }
  116. }
  117. }
  118. }
  119. return style;
  120. }
  121. /**
  122. * Returns a prefixed version of the style object using all vendor prefixes
  123. * @param {Object} styles - Style object that gets prefixed properties added
  124. * @returns {Object} - Style object with prefixed properties and values
  125. */
  126. }], [{
  127. key: 'prefixAll',
  128. value: function prefixAll(styles) {
  129. return fallback(styles);
  130. }
  131. }]);
  132. return Prefixer;
  133. }();
  134. }
  135. module.exports = exports['default'];