You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							865 lines
						
					
					
						
							24 KiB
						
					
					
				
			
		
		
	
	
							865 lines
						
					
					
						
							24 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true
 | |
| });
 | |
| 
 | |
| function _interopDefault(ex) {
 | |
|   return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;
 | |
| }
 | |
| 
 | |
| var parse = require('postcss-value-parser');
 | |
| 
 | |
| var parse__default = _interopDefault(parse);
 | |
| 
 | |
| var camelizeStyleName = _interopDefault(require('camelize'));
 | |
| 
 | |
| var cssColorKeywords = _interopDefault(require('css-color-keywords'));
 | |
| 
 | |
| var matchString = function matchString(node) {
 | |
|   if (node.type !== 'string') return null;
 | |
|   return node.value.replace(/\\([0-9a-f]{1,6})(?:\s|$)/gi, function (match, charCode) {
 | |
|     return String.fromCharCode(parseInt(charCode, 16));
 | |
|   }).replace(/\\/g, '');
 | |
| };
 | |
| 
 | |
| var hexColorRe = /^(#(?:[0-9a-f]{3,4}){1,2})$/i;
 | |
| var cssFunctionNameRe = /^(rgba?|hsla?|hwb|lab|lch|gray|color)$/;
 | |
| 
 | |
| var matchColor = function matchColor(node) {
 | |
|   if (node.type === 'word' && (hexColorRe.test(node.value) || node.value in cssColorKeywords || node.value === 'transparent')) {
 | |
|     return node.value;
 | |
|   } else if (node.type === 'function' && cssFunctionNameRe.test(node.value)) {
 | |
|     return parse.stringify(node);
 | |
|   }
 | |
| 
 | |
|   return null;
 | |
| };
 | |
| 
 | |
| var noneRe = /^(none)$/i;
 | |
| var autoRe = /^(auto)$/i;
 | |
| var identRe = /(^-?[_a-z][_a-z0-9-]*$)/i; // Note if these are wrong, you'll need to change index.js too
 | |
| 
 | |
| var numberRe = /^([+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?)$/i; // Note lengthRe is sneaky: you can omit units for 0
 | |
| 
 | |
| var lengthRe = /^(0$|(?:[+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?)(?=px$))/i;
 | |
| var unsupportedUnitRe = /^([+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?(ch|em|ex|rem|vh|vw|vmin|vmax|cm|mm|in|pc|pt))$/i;
 | |
| var angleRe = /^([+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?(?:deg|rad))$/i;
 | |
| var percentRe = /^([+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?%)$/i;
 | |
| 
 | |
| var noopToken = function noopToken(predicate) {
 | |
|   return function (node) {
 | |
|     return predicate(node) ? '<token>' : null;
 | |
|   };
 | |
| };
 | |
| 
 | |
| var valueForTypeToken = function valueForTypeToken(type) {
 | |
|   return function (node) {
 | |
|     return node.type === type ? node.value : null;
 | |
|   };
 | |
| };
 | |
| 
 | |
| var regExpToken = function regExpToken(regExp, transform) {
 | |
|   if (transform === void 0) {
 | |
|     transform = String;
 | |
|   }
 | |
| 
 | |
|   return function (node) {
 | |
|     if (node.type !== 'word') return null;
 | |
|     var match = node.value.match(regExp);
 | |
|     if (match === null) return null;
 | |
|     var value = transform(match[1]);
 | |
|     return value;
 | |
|   };
 | |
| };
 | |
| 
 | |
| var SPACE = noopToken(function (node) {
 | |
|   return node.type === 'space';
 | |
| });
 | |
| var SLASH = noopToken(function (node) {
 | |
|   return node.type === 'div' && node.value === '/';
 | |
| });
 | |
| var COMMA = noopToken(function (node) {
 | |
|   return node.type === 'div' && node.value === ',';
 | |
| });
 | |
| var WORD = valueForTypeToken('word');
 | |
| var NONE = regExpToken(noneRe);
 | |
| var AUTO = regExpToken(autoRe);
 | |
| var NUMBER = regExpToken(numberRe, Number);
 | |
| var LENGTH = regExpToken(lengthRe, Number);
 | |
| var UNSUPPORTED_LENGTH_UNIT = regExpToken(unsupportedUnitRe);
 | |
| var ANGLE = regExpToken(angleRe, function (angle) {
 | |
|   return angle.toLowerCase();
 | |
| });
 | |
| var PERCENT = regExpToken(percentRe);
 | |
| var IDENT = regExpToken(identRe);
 | |
| var STRING = matchString;
 | |
| var COLOR = matchColor;
 | |
| var LINE = regExpToken(/^(none|underline|line-through)$/i);
 | |
| var BORDER_STYLE = regExpToken(/^(solid|dashed|dotted)$/);
 | |
| var defaultBorderWidth = 1;
 | |
| var defaultBorderColor = 'black';
 | |
| var defaultBorderStyle = 'solid';
 | |
| 
 | |
| var border = function border(tokenStream) {
 | |
|   var borderWidth;
 | |
|   var borderColor;
 | |
|   var borderStyle;
 | |
| 
 | |
|   if (tokenStream.matches(NONE)) {
 | |
|     tokenStream.expectEmpty();
 | |
|     return {
 | |
|       borderWidth: 0,
 | |
|       borderColor: 'black',
 | |
|       borderStyle: 'solid'
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   var partsParsed = 0;
 | |
| 
 | |
|   while (partsParsed < 3 && tokenStream.hasTokens()) {
 | |
|     if (partsParsed !== 0) tokenStream.expect(SPACE);
 | |
| 
 | |
|     if (borderWidth === undefined && tokenStream.matches(LENGTH, UNSUPPORTED_LENGTH_UNIT)) {
 | |
|       borderWidth = tokenStream.lastValue;
 | |
|     } else if (borderColor === undefined && tokenStream.matches(COLOR)) {
 | |
|       borderColor = tokenStream.lastValue;
 | |
|     } else if (borderStyle === undefined && tokenStream.matches(BORDER_STYLE)) {
 | |
|       borderStyle = tokenStream.lastValue;
 | |
|     } else {
 | |
|       tokenStream["throw"]();
 | |
|     }
 | |
| 
 | |
|     partsParsed += 1;
 | |
|   }
 | |
| 
 | |
|   tokenStream.expectEmpty();
 | |
|   if (borderWidth === undefined) borderWidth = defaultBorderWidth;
 | |
|   if (borderColor === undefined) borderColor = defaultBorderColor;
 | |
|   if (borderStyle === undefined) borderStyle = defaultBorderStyle;
 | |
|   return {
 | |
|     borderWidth: borderWidth,
 | |
|     borderColor: borderColor,
 | |
|     borderStyle: borderStyle
 | |
|   };
 | |
| };
 | |
| 
 | |
| var directionFactory = function directionFactory(_ref) {
 | |
|   var _ref$types = _ref.types,
 | |
|       types = _ref$types === void 0 ? [LENGTH, UNSUPPORTED_LENGTH_UNIT, PERCENT] : _ref$types,
 | |
|       _ref$directions = _ref.directions,
 | |
|       directions = _ref$directions === void 0 ? ['Top', 'Right', 'Bottom', 'Left'] : _ref$directions,
 | |
|       _ref$prefix = _ref.prefix,
 | |
|       prefix = _ref$prefix === void 0 ? '' : _ref$prefix,
 | |
|       _ref$suffix = _ref.suffix,
 | |
|       suffix = _ref$suffix === void 0 ? '' : _ref$suffix;
 | |
|   return function (tokenStream) {
 | |
|     var _ref2;
 | |
| 
 | |
|     var values = []; // borderWidth doesn't currently allow a percent value, but may do in the future
 | |
| 
 | |
|     values.push(tokenStream.expect.apply(tokenStream, types));
 | |
| 
 | |
|     while (values.length < 4 && tokenStream.hasTokens()) {
 | |
|       tokenStream.expect(SPACE);
 | |
|       values.push(tokenStream.expect.apply(tokenStream, types));
 | |
|     }
 | |
| 
 | |
|     tokenStream.expectEmpty();
 | |
|     var top = values[0],
 | |
|         _values$ = values[1],
 | |
|         right = _values$ === void 0 ? top : _values$,
 | |
|         _values$2 = values[2],
 | |
|         bottom = _values$2 === void 0 ? top : _values$2,
 | |
|         _values$3 = values[3],
 | |
|         left = _values$3 === void 0 ? right : _values$3;
 | |
| 
 | |
|     var keyFor = function keyFor(n) {
 | |
|       return "" + prefix + directions[n] + suffix;
 | |
|     };
 | |
| 
 | |
|     return _ref2 = {}, _ref2[keyFor(0)] = top, _ref2[keyFor(1)] = right, _ref2[keyFor(2)] = bottom, _ref2[keyFor(3)] = left, _ref2;
 | |
|   };
 | |
| };
 | |
| 
 | |
| var parseShadowOffset = function parseShadowOffset(tokenStream) {
 | |
|   var width = tokenStream.expect(LENGTH);
 | |
|   var height = tokenStream.matches(SPACE) ? tokenStream.expect(LENGTH) : width;
 | |
|   tokenStream.expectEmpty();
 | |
|   return {
 | |
|     width: width,
 | |
|     height: height
 | |
|   };
 | |
| };
 | |
| 
 | |
| var parseShadow = function parseShadow(tokenStream) {
 | |
|   var offsetX;
 | |
|   var offsetY;
 | |
|   var radius;
 | |
|   var color;
 | |
| 
 | |
|   if (tokenStream.matches(NONE)) {
 | |
|     tokenStream.expectEmpty();
 | |
|     return {
 | |
|       offset: {
 | |
|         width: 0,
 | |
|         height: 0
 | |
|       },
 | |
|       radius: 0,
 | |
|       color: 'black'
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   var didParseFirst = false;
 | |
| 
 | |
|   while (tokenStream.hasTokens()) {
 | |
|     if (didParseFirst) tokenStream.expect(SPACE);
 | |
| 
 | |
|     if (offsetX === undefined && tokenStream.matches(LENGTH, UNSUPPORTED_LENGTH_UNIT)) {
 | |
|       offsetX = tokenStream.lastValue;
 | |
|       tokenStream.expect(SPACE);
 | |
|       offsetY = tokenStream.expect(LENGTH, UNSUPPORTED_LENGTH_UNIT);
 | |
|       tokenStream.saveRewindPoint();
 | |
| 
 | |
|       if (tokenStream.matches(SPACE) && tokenStream.matches(LENGTH, UNSUPPORTED_LENGTH_UNIT)) {
 | |
|         radius = tokenStream.lastValue;
 | |
|       } else {
 | |
|         tokenStream.rewind();
 | |
|       }
 | |
|     } else if (color === undefined && tokenStream.matches(COLOR)) {
 | |
|       color = tokenStream.lastValue;
 | |
|     } else {
 | |
|       tokenStream["throw"]();
 | |
|     }
 | |
| 
 | |
|     didParseFirst = true;
 | |
|   }
 | |
| 
 | |
|   if (offsetX === undefined) tokenStream["throw"]();
 | |
|   return {
 | |
|     offset: {
 | |
|       width: offsetX,
 | |
|       height: offsetY
 | |
|     },
 | |
|     radius: radius !== undefined ? radius : 0,
 | |
|     color: color !== undefined ? color : 'black'
 | |
|   };
 | |
| };
 | |
| 
 | |
| var boxShadow = function boxShadow(tokenStream) {
 | |
|   var _parseShadow = parseShadow(tokenStream),
 | |
|       offset = _parseShadow.offset,
 | |
|       radius = _parseShadow.radius,
 | |
|       color = _parseShadow.color;
 | |
| 
 | |
|   return {
 | |
|     shadowOffset: offset,
 | |
|     shadowRadius: radius,
 | |
|     shadowColor: color,
 | |
|     shadowOpacity: 1
 | |
|   };
 | |
| };
 | |
| 
 | |
| var defaultFlexGrow = 1;
 | |
| var defaultFlexShrink = 1;
 | |
| var defaultFlexBasis = 0;
 | |
| 
 | |
| var flex = function flex(tokenStream) {
 | |
|   var flexGrow;
 | |
|   var flexShrink;
 | |
|   var flexBasis;
 | |
| 
 | |
|   if (tokenStream.matches(NONE)) {
 | |
|     tokenStream.expectEmpty();
 | |
|     return {
 | |
|       flexGrow: 0,
 | |
|       flexShrink: 0,
 | |
|       flexBasis: 'auto'
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   tokenStream.saveRewindPoint();
 | |
| 
 | |
|   if (tokenStream.matches(AUTO) && !tokenStream.hasTokens()) {
 | |
|     return {
 | |
|       flexGrow: 1,
 | |
|       flexShrink: 1,
 | |
|       flexBasis: 'auto'
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   tokenStream.rewind();
 | |
|   var partsParsed = 0;
 | |
| 
 | |
|   while (partsParsed < 2 && tokenStream.hasTokens()) {
 | |
|     if (partsParsed !== 0) tokenStream.expect(SPACE);
 | |
| 
 | |
|     if (flexGrow === undefined && tokenStream.matches(NUMBER)) {
 | |
|       flexGrow = tokenStream.lastValue;
 | |
|       tokenStream.saveRewindPoint();
 | |
| 
 | |
|       if (tokenStream.matches(SPACE) && tokenStream.matches(NUMBER)) {
 | |
|         flexShrink = tokenStream.lastValue;
 | |
|       } else {
 | |
|         tokenStream.rewind();
 | |
|       }
 | |
|     } else if (flexBasis === undefined && tokenStream.matches(LENGTH, UNSUPPORTED_LENGTH_UNIT, PERCENT)) {
 | |
|       flexBasis = tokenStream.lastValue;
 | |
|     } else if (flexBasis === undefined && tokenStream.matches(AUTO)) {
 | |
|       flexBasis = 'auto';
 | |
|     } else {
 | |
|       tokenStream["throw"]();
 | |
|     }
 | |
| 
 | |
|     partsParsed += 1;
 | |
|   }
 | |
| 
 | |
|   tokenStream.expectEmpty();
 | |
|   if (flexGrow === undefined) flexGrow = defaultFlexGrow;
 | |
|   if (flexShrink === undefined) flexShrink = defaultFlexShrink;
 | |
|   if (flexBasis === undefined) flexBasis = defaultFlexBasis;
 | |
|   return {
 | |
|     flexGrow: flexGrow,
 | |
|     flexShrink: flexShrink,
 | |
|     flexBasis: flexBasis
 | |
|   };
 | |
| };
 | |
| 
 | |
| var FLEX_WRAP = regExpToken(/(nowrap|wrap|wrap-reverse)/);
 | |
| var FLEX_DIRECTION = regExpToken(/(row|row-reverse|column|column-reverse)/);
 | |
| var defaultFlexWrap = 'nowrap';
 | |
| var defaultFlexDirection = 'row';
 | |
| 
 | |
| var flexFlow = function flexFlow(tokenStream) {
 | |
|   var flexWrap;
 | |
|   var flexDirection;
 | |
|   var partsParsed = 0;
 | |
| 
 | |
|   while (partsParsed < 2 && tokenStream.hasTokens()) {
 | |
|     if (partsParsed !== 0) tokenStream.expect(SPACE);
 | |
| 
 | |
|     if (flexWrap === undefined && tokenStream.matches(FLEX_WRAP)) {
 | |
|       flexWrap = tokenStream.lastValue;
 | |
|     } else if (flexDirection === undefined && tokenStream.matches(FLEX_DIRECTION)) {
 | |
|       flexDirection = tokenStream.lastValue;
 | |
|     } else {
 | |
|       tokenStream["throw"]();
 | |
|     }
 | |
| 
 | |
|     partsParsed += 1;
 | |
|   }
 | |
| 
 | |
|   tokenStream.expectEmpty();
 | |
|   if (flexWrap === undefined) flexWrap = defaultFlexWrap;
 | |
|   if (flexDirection === undefined) flexDirection = defaultFlexDirection;
 | |
|   return {
 | |
|     flexWrap: flexWrap,
 | |
|     flexDirection: flexDirection
 | |
|   };
 | |
| };
 | |
| 
 | |
| var fontFamily = function fontFamily(tokenStream) {
 | |
|   var fontFamily;
 | |
| 
 | |
|   if (tokenStream.matches(STRING)) {
 | |
|     fontFamily = tokenStream.lastValue;
 | |
|   } else {
 | |
|     fontFamily = tokenStream.expect(IDENT);
 | |
| 
 | |
|     while (tokenStream.hasTokens()) {
 | |
|       tokenStream.expect(SPACE);
 | |
|       var nextIdent = tokenStream.expect(IDENT);
 | |
|       fontFamily += " " + nextIdent;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   tokenStream.expectEmpty();
 | |
|   return {
 | |
|     fontFamily: fontFamily
 | |
|   };
 | |
| };
 | |
| 
 | |
| var NORMAL = regExpToken(/^(normal)$/);
 | |
| var STYLE = regExpToken(/^(italic)$/);
 | |
| var WEIGHT = regExpToken(/^([1-9]00|bold)$/);
 | |
| var VARIANT = regExpToken(/^(small-caps)$/);
 | |
| var defaultFontStyle = 'normal';
 | |
| var defaultFontWeight = 'normal';
 | |
| var defaultFontVariant = [];
 | |
| 
 | |
| var font = function font(tokenStream) {
 | |
|   var fontStyle;
 | |
|   var fontWeight;
 | |
|   var fontVariant; // let fontSize;
 | |
| 
 | |
|   var lineHeight; // let fontFamily;
 | |
| 
 | |
|   var numStyleWeightVariantMatched = 0;
 | |
| 
 | |
|   while (numStyleWeightVariantMatched < 3 && tokenStream.hasTokens()) {
 | |
|     if (tokenStream.matches(NORMAL)) ;else if (fontStyle === undefined && tokenStream.matches(STYLE)) {
 | |
|       fontStyle = tokenStream.lastValue;
 | |
|     } else if (fontWeight === undefined && tokenStream.matches(WEIGHT)) {
 | |
|       fontWeight = tokenStream.lastValue;
 | |
|     } else if (fontVariant === undefined && tokenStream.matches(VARIANT)) {
 | |
|       fontVariant = [tokenStream.lastValue];
 | |
|     } else {
 | |
|       break;
 | |
|     }
 | |
|     tokenStream.expect(SPACE);
 | |
|     numStyleWeightVariantMatched += 1;
 | |
|   }
 | |
| 
 | |
|   var fontSize = tokenStream.expect(LENGTH, UNSUPPORTED_LENGTH_UNIT);
 | |
| 
 | |
|   if (tokenStream.matches(SLASH)) {
 | |
|     lineHeight = tokenStream.expect(LENGTH, UNSUPPORTED_LENGTH_UNIT);
 | |
|   }
 | |
| 
 | |
|   tokenStream.expect(SPACE);
 | |
| 
 | |
|   var _fontFamily = fontFamily(tokenStream),
 | |
|       fontFamily$1 = _fontFamily.fontFamily;
 | |
| 
 | |
|   if (fontStyle === undefined) fontStyle = defaultFontStyle;
 | |
|   if (fontWeight === undefined) fontWeight = defaultFontWeight;
 | |
|   if (fontVariant === undefined) fontVariant = defaultFontVariant;
 | |
|   var out = {
 | |
|     fontStyle: fontStyle,
 | |
|     fontWeight: fontWeight,
 | |
|     fontVariant: fontVariant,
 | |
|     fontSize: fontSize,
 | |
|     fontFamily: fontFamily$1
 | |
|   };
 | |
|   if (lineHeight !== undefined) out.lineHeight = lineHeight;
 | |
|   return out;
 | |
| };
 | |
| 
 | |
| var ALIGN_CONTENT = regExpToken(/(flex-(?:start|end)|center|stretch|space-(?:between|around))/);
 | |
| var JUSTIFY_CONTENT = regExpToken(/(flex-(?:start|end)|center|space-(?:between|around|evenly))/);
 | |
| 
 | |
| var placeContent = function placeContent(tokenStream) {
 | |
|   var alignContent = tokenStream.expect(ALIGN_CONTENT);
 | |
|   var justifyContent;
 | |
| 
 | |
|   if (tokenStream.hasTokens()) {
 | |
|     tokenStream.expect(SPACE);
 | |
|     justifyContent = tokenStream.expect(JUSTIFY_CONTENT);
 | |
|   } else {
 | |
|     justifyContent = 'stretch';
 | |
|   }
 | |
| 
 | |
|   tokenStream.expectEmpty();
 | |
|   return {
 | |
|     alignContent: alignContent,
 | |
|     justifyContent: justifyContent
 | |
|   };
 | |
| };
 | |
| 
 | |
| var STYLE$1 = regExpToken(/^(solid|double|dotted|dashed)$/);
 | |
| var defaultTextDecorationLine = 'none';
 | |
| var defaultTextDecorationStyle = 'solid';
 | |
| var defaultTextDecorationColor = 'black';
 | |
| 
 | |
| var textDecoration = function textDecoration(tokenStream) {
 | |
|   var line;
 | |
|   var style;
 | |
|   var color;
 | |
|   var didParseFirst = false;
 | |
| 
 | |
|   while (tokenStream.hasTokens()) {
 | |
|     if (didParseFirst) tokenStream.expect(SPACE);
 | |
| 
 | |
|     if (line === undefined && tokenStream.matches(LINE)) {
 | |
|       var lines = [tokenStream.lastValue.toLowerCase()];
 | |
|       tokenStream.saveRewindPoint();
 | |
| 
 | |
|       if (lines[0] !== 'none' && tokenStream.matches(SPACE) && tokenStream.matches(LINE)) {
 | |
|         lines.push(tokenStream.lastValue.toLowerCase()); // Underline comes before line-through
 | |
| 
 | |
|         lines.sort().reverse();
 | |
|       } else {
 | |
|         tokenStream.rewind();
 | |
|       }
 | |
| 
 | |
|       line = lines.join(' ');
 | |
|     } else if (style === undefined && tokenStream.matches(STYLE$1)) {
 | |
|       style = tokenStream.lastValue;
 | |
|     } else if (color === undefined && tokenStream.matches(COLOR)) {
 | |
|       color = tokenStream.lastValue;
 | |
|     } else {
 | |
|       tokenStream["throw"]();
 | |
|     }
 | |
| 
 | |
|     didParseFirst = true;
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     textDecorationLine: line !== undefined ? line : defaultTextDecorationLine,
 | |
|     textDecorationColor: color !== undefined ? color : defaultTextDecorationColor,
 | |
|     textDecorationStyle: style !== undefined ? style : defaultTextDecorationStyle
 | |
|   };
 | |
| };
 | |
| 
 | |
| var textDecorationLine = function textDecorationLine(tokenStream) {
 | |
|   var lines = [];
 | |
|   var didParseFirst = false;
 | |
| 
 | |
|   while (tokenStream.hasTokens()) {
 | |
|     if (didParseFirst) tokenStream.expect(SPACE);
 | |
|     lines.push(tokenStream.expect(LINE).toLowerCase());
 | |
|     didParseFirst = true;
 | |
|   }
 | |
| 
 | |
|   lines.sort().reverse();
 | |
|   return {
 | |
|     textDecorationLine: lines.join(' ')
 | |
|   };
 | |
| };
 | |
| 
 | |
| var textShadow = function textShadow(tokenStream) {
 | |
|   var _parseShadow2 = parseShadow(tokenStream),
 | |
|       offset = _parseShadow2.offset,
 | |
|       radius = _parseShadow2.radius,
 | |
|       color = _parseShadow2.color;
 | |
| 
 | |
|   return {
 | |
|     textShadowOffset: offset,
 | |
|     textShadowRadius: radius,
 | |
|     textShadowColor: color
 | |
|   };
 | |
| };
 | |
| 
 | |
| var oneOfType = function oneOfType(tokenType) {
 | |
|   return function (functionStream) {
 | |
|     var value = functionStream.expect(tokenType);
 | |
|     functionStream.expectEmpty();
 | |
|     return value;
 | |
|   };
 | |
| };
 | |
| 
 | |
| var singleNumber = oneOfType(NUMBER);
 | |
| var singleLength = oneOfType(LENGTH);
 | |
| var singleAngle = oneOfType(ANGLE);
 | |
| 
 | |
| var xyTransformFactory = function xyTransformFactory(tokenType) {
 | |
|   return function (key, valueIfOmitted) {
 | |
|     return function (functionStream) {
 | |
|       var _ref3, _ref4;
 | |
| 
 | |
|       var x = functionStream.expect(tokenType);
 | |
|       var y;
 | |
| 
 | |
|       if (functionStream.hasTokens()) {
 | |
|         functionStream.expect(COMMA);
 | |
|         y = functionStream.expect(tokenType);
 | |
|       } else if (valueIfOmitted !== undefined) {
 | |
|         y = valueIfOmitted;
 | |
|       } else {
 | |
|         // Assumption, if x === y, then we can omit XY
 | |
|         // I.e. scale(5) => [{ scale: 5 }] rather than [{ scaleX: 5 }, { scaleY: 5 }]
 | |
|         return x;
 | |
|       }
 | |
| 
 | |
|       functionStream.expectEmpty();
 | |
|       return [(_ref3 = {}, _ref3[key + "Y"] = y, _ref3), (_ref4 = {}, _ref4[key + "X"] = x, _ref4)];
 | |
|     };
 | |
|   };
 | |
| };
 | |
| 
 | |
| var xyNumber = xyTransformFactory(NUMBER);
 | |
| var xyLength = xyTransformFactory(LENGTH);
 | |
| var xyAngle = xyTransformFactory(ANGLE);
 | |
| var partTransforms = {
 | |
|   perspective: singleNumber,
 | |
|   scale: xyNumber('scale'),
 | |
|   scaleX: singleNumber,
 | |
|   scaleY: singleNumber,
 | |
|   translate: xyLength('translate', 0),
 | |
|   translateX: singleLength,
 | |
|   translateY: singleLength,
 | |
|   rotate: singleAngle,
 | |
|   rotateX: singleAngle,
 | |
|   rotateY: singleAngle,
 | |
|   rotateZ: singleAngle,
 | |
|   skewX: singleAngle,
 | |
|   skewY: singleAngle,
 | |
|   skew: xyAngle('skew', '0deg')
 | |
| };
 | |
| 
 | |
| var transform = function transform(tokenStream) {
 | |
|   var transforms = [];
 | |
|   var didParseFirst = false;
 | |
| 
 | |
|   while (tokenStream.hasTokens()) {
 | |
|     if (didParseFirst) tokenStream.expect(SPACE);
 | |
|     var functionStream = tokenStream.expectFunction();
 | |
|     var functionName = functionStream.functionName;
 | |
|     var transformedValues = partTransforms[functionName](functionStream);
 | |
| 
 | |
|     if (!Array.isArray(transformedValues)) {
 | |
|       var _ref5;
 | |
| 
 | |
|       transformedValues = [(_ref5 = {}, _ref5[functionName] = transformedValues, _ref5)];
 | |
|     }
 | |
| 
 | |
|     transforms = transformedValues.concat(transforms);
 | |
|     didParseFirst = true;
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     transform: transforms
 | |
|   };
 | |
| };
 | |
| 
 | |
| var background = function background(tokenStream) {
 | |
|   return {
 | |
|     backgroundColor: tokenStream.expect(COLOR)
 | |
|   };
 | |
| };
 | |
| 
 | |
| var borderColor = directionFactory({
 | |
|   types: [COLOR],
 | |
|   prefix: 'border',
 | |
|   suffix: 'Color'
 | |
| });
 | |
| var borderRadius = directionFactory({
 | |
|   directions: ['TopLeft', 'TopRight', 'BottomRight', 'BottomLeft'],
 | |
|   prefix: 'border',
 | |
|   suffix: 'Radius'
 | |
| });
 | |
| var borderWidth = directionFactory({
 | |
|   prefix: 'border',
 | |
|   suffix: 'Width'
 | |
| });
 | |
| var margin = directionFactory({
 | |
|   types: [LENGTH, UNSUPPORTED_LENGTH_UNIT, PERCENT, AUTO],
 | |
|   prefix: 'margin'
 | |
| });
 | |
| var padding = directionFactory({
 | |
|   prefix: 'padding'
 | |
| });
 | |
| 
 | |
| var fontVariant = function fontVariant(tokenStream) {
 | |
|   return {
 | |
|     fontVariant: [tokenStream.expect(IDENT)]
 | |
|   };
 | |
| };
 | |
| 
 | |
| var fontWeight = function fontWeight(tokenStream) {
 | |
|   return {
 | |
|     fontWeight: tokenStream.expect(WORD) // Also match numbers as strings
 | |
| 
 | |
|   };
 | |
| };
 | |
| 
 | |
| var shadowOffset = function shadowOffset(tokenStream) {
 | |
|   return {
 | |
|     shadowOffset: parseShadowOffset(tokenStream)
 | |
|   };
 | |
| };
 | |
| 
 | |
| var textShadowOffset = function textShadowOffset(tokenStream) {
 | |
|   return {
 | |
|     textShadowOffset: parseShadowOffset(tokenStream)
 | |
|   };
 | |
| };
 | |
| 
 | |
| var transforms = {
 | |
|   background: background,
 | |
|   border: border,
 | |
|   borderColor: borderColor,
 | |
|   borderRadius: borderRadius,
 | |
|   borderWidth: borderWidth,
 | |
|   boxShadow: boxShadow,
 | |
|   flex: flex,
 | |
|   flexFlow: flexFlow,
 | |
|   font: font,
 | |
|   fontFamily: fontFamily,
 | |
|   fontVariant: fontVariant,
 | |
|   fontWeight: fontWeight,
 | |
|   margin: margin,
 | |
|   padding: padding,
 | |
|   placeContent: placeContent,
 | |
|   shadowOffset: shadowOffset,
 | |
|   textShadow: textShadow,
 | |
|   textShadowOffset: textShadowOffset,
 | |
|   textDecoration: textDecoration,
 | |
|   textDecorationLine: textDecorationLine,
 | |
|   transform: transform
 | |
| };
 | |
| var propertiesWithoutUnits;
 | |
| 
 | |
| if (process.env.NODE_ENV !== 'production') {
 | |
|   propertiesWithoutUnits = ['aspectRatio', 'elevation', 'flexGrow', 'flexShrink', 'opacity', 'shadowOpacity', 'zIndex'];
 | |
| }
 | |
| 
 | |
| var devPropertiesWithUnitsRegExp = propertiesWithoutUnits != null ? new RegExp(propertiesWithoutUnits.join('|')) : null;
 | |
| var SYMBOL_MATCH = 'SYMBOL_MATCH';
 | |
| 
 | |
| var TokenStream =
 | |
| /*#__PURE__*/
 | |
| function () {
 | |
|   function TokenStream(nodes, parent) {
 | |
|     this.index = 0;
 | |
|     this.nodes = nodes;
 | |
|     this.functionName = parent != null ? parent.value : null;
 | |
|     this.lastValue = null;
 | |
|     this.rewindIndex = -1;
 | |
|   }
 | |
| 
 | |
|   var _proto = TokenStream.prototype;
 | |
| 
 | |
|   _proto.hasTokens = function hasTokens() {
 | |
|     return this.index <= this.nodes.length - 1;
 | |
|   };
 | |
| 
 | |
|   _proto[SYMBOL_MATCH] = function () {
 | |
|     if (!this.hasTokens()) return null;
 | |
|     var node = this.nodes[this.index];
 | |
| 
 | |
|     for (var i = 0; i < arguments.length; i += 1) {
 | |
|       var tokenDescriptor = i < 0 || arguments.length <= i ? undefined : arguments[i];
 | |
|       var value = tokenDescriptor(node);
 | |
| 
 | |
|       if (value !== null) {
 | |
|         this.index += 1;
 | |
|         this.lastValue = value;
 | |
|         return value;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return null;
 | |
|   };
 | |
| 
 | |
|   _proto.matches = function matches() {
 | |
|     return this[SYMBOL_MATCH].apply(this, arguments) !== null;
 | |
|   };
 | |
| 
 | |
|   _proto.expect = function expect() {
 | |
|     var value = this[SYMBOL_MATCH].apply(this, arguments);
 | |
|     return value !== null ? value : this["throw"]();
 | |
|   };
 | |
| 
 | |
|   _proto.matchesFunction = function matchesFunction() {
 | |
|     var node = this.nodes[this.index];
 | |
|     if (node.type !== 'function') return null;
 | |
|     var value = new TokenStream(node.nodes, node);
 | |
|     this.index += 1;
 | |
|     this.lastValue = null;
 | |
|     return value;
 | |
|   };
 | |
| 
 | |
|   _proto.expectFunction = function expectFunction() {
 | |
|     var value = this.matchesFunction();
 | |
|     return value !== null ? value : this["throw"]();
 | |
|   };
 | |
| 
 | |
|   _proto.expectEmpty = function expectEmpty() {
 | |
|     if (this.hasTokens()) this["throw"]();
 | |
|   };
 | |
| 
 | |
|   _proto["throw"] = function _throw() {
 | |
|     throw new Error("Unexpected token type: " + this.nodes[this.index].type);
 | |
|   };
 | |
| 
 | |
|   _proto.saveRewindPoint = function saveRewindPoint() {
 | |
|     this.rewindIndex = this.index;
 | |
|   };
 | |
| 
 | |
|   _proto.rewind = function rewind() {
 | |
|     if (this.rewindIndex === -1) throw new Error('Internal error');
 | |
|     this.index = this.rewindIndex;
 | |
|     this.lastValue = null;
 | |
|   };
 | |
| 
 | |
|   return TokenStream;
 | |
| }();
 | |
| /* eslint-disable no-param-reassign */
 | |
| // Note if this is wrong, you'll need to change tokenTypes.js too
 | |
| 
 | |
| 
 | |
| var numberOrLengthRe = /^([+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?)(?:px)?$/i;
 | |
| var numberOnlyRe = /^[+-]?(?:\d*\.\d*|[1-9]\d*)(?:e[+-]?\d+)?$/i;
 | |
| var boolRe = /^true|false$/i;
 | |
| var nullRe = /^null$/i;
 | |
| var undefinedRe = /^undefined$/i; // Undocumented export
 | |
| 
 | |
| var transformRawValue = function transformRawValue(propName, value) {
 | |
|   if (process.env.NODE_ENV !== 'production') {
 | |
|     var needsUnit = !devPropertiesWithUnitsRegExp.test(propName);
 | |
|     var isNumberWithoutUnit = numberOnlyRe.test(value);
 | |
| 
 | |
|     if (needsUnit && isNumberWithoutUnit) {
 | |
|       // eslint-disable-next-line no-console
 | |
|       console.warn("Expected style \"" + propName + ": " + value + "\" to contain units");
 | |
|     }
 | |
| 
 | |
|     if (!needsUnit && value !== '0' && !isNumberWithoutUnit) {
 | |
|       // eslint-disable-next-line no-console
 | |
|       console.warn("Expected style \"" + propName + ": " + value + "\" to be unitless");
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   var numberMatch = value.match(numberOrLengthRe);
 | |
|   if (numberMatch !== null) return Number(numberMatch[1]);
 | |
|   var boolMatch = value.match(boolRe);
 | |
|   if (boolMatch !== null) return boolMatch[0].toLowerCase() === 'true';
 | |
|   var nullMatch = value.match(nullRe);
 | |
|   if (nullMatch !== null) return null;
 | |
|   var undefinedMatch = value.match(undefinedRe);
 | |
|   if (undefinedMatch !== null) return undefined;
 | |
|   return value;
 | |
| };
 | |
| 
 | |
| var baseTransformShorthandValue = function baseTransformShorthandValue(propName, value) {
 | |
|   var ast = parse__default(value);
 | |
|   var tokenStream = new TokenStream(ast.nodes);
 | |
|   return transforms[propName](tokenStream);
 | |
| };
 | |
| 
 | |
| var transformShorthandValue = process.env.NODE_ENV === 'production' ? baseTransformShorthandValue : function (propName, value) {
 | |
|   try {
 | |
|     return baseTransformShorthandValue(propName, value);
 | |
|   } catch (e) {
 | |
|     throw new Error("Failed to parse declaration \"" + propName + ": " + value + "\"");
 | |
|   }
 | |
| };
 | |
| 
 | |
| var getStylesForProperty = function getStylesForProperty(propName, inputValue, allowShorthand) {
 | |
|   var _ref6;
 | |
| 
 | |
|   var isRawValue = allowShorthand === false || !(propName in transforms);
 | |
|   var value = inputValue.trim();
 | |
|   var propValues = isRawValue ? (_ref6 = {}, _ref6[propName] = transformRawValue(propName, value), _ref6) : transformShorthandValue(propName, value);
 | |
|   return propValues;
 | |
| };
 | |
| 
 | |
| var getPropertyName = function getPropertyName(propName) {
 | |
|   var isCustomProp = /^--\w+/.test(propName);
 | |
| 
 | |
|   if (isCustomProp) {
 | |
|     return propName;
 | |
|   }
 | |
| 
 | |
|   return camelizeStyleName(propName);
 | |
| };
 | |
| 
 | |
| var index = function index(rules, shorthandBlacklist) {
 | |
|   if (shorthandBlacklist === void 0) {
 | |
|     shorthandBlacklist = [];
 | |
|   }
 | |
| 
 | |
|   return rules.reduce(function (accum, rule) {
 | |
|     var propertyName = getPropertyName(rule[0]);
 | |
|     var value = rule[1];
 | |
|     var allowShorthand = shorthandBlacklist.indexOf(propertyName) === -1;
 | |
|     return Object.assign(accum, getStylesForProperty(propertyName, value, allowShorthand));
 | |
|   }, {});
 | |
| };
 | |
| 
 | |
| exports["default"] = index;
 | |
| exports.getPropertyName = getPropertyName;
 | |
| exports.getStylesForProperty = getStylesForProperty;
 | |
| exports.transformRawValue = transformRawValue;
 |