UNPKG

vite

Version:

Native-ESM powered web dev build tool

1,685 lines (1,391 loc) 355 kB
'use strict'; var require$$0 = require('os'); var require$$0$1 = require('http'); var require$$1 = require('https'); var require$$0$2 = require('url'); var path$8 = require('path'); var build = require('./dep-cc49d7be.js'); var fs$3 = require('fs'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e['default'] : e; } var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1); var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1); var require$$0__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$0$2); var path__default = /*#__PURE__*/_interopDefaultLegacy(path$8); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs$3); var clean = {exports: {}}; function level0Optimize$1(tokens) { // noop as level 0 means no optimizations! return tokens; } var optimize$4 = level0Optimize$1; // adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956 var NUMBER_PATTERN = /([0-9]+)/; function naturalCompare$1(value1, value2) { var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt); var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt); var key1; var key2; var compareFirst = Math.min(keys1.length, keys2.length); var i, l; for (i = 0, l = compareFirst; i < l; i++) { key1 = keys1[i]; key2 = keys2[i]; if (key1 != key2) { return key1 > key2 ? 1 : -1; } } return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1); } function tryParseInt(value) { return ('' + parseInt(value)) == value ? parseInt(value) : value; } var naturalCompare_1 = naturalCompare$1; var naturalCompare = naturalCompare_1; function naturalSorter$1(scope1, scope2) { return naturalCompare(scope1[1], scope2[1]); } function standardSorter(scope1, scope2) { return scope1[1] > scope2[1] ? 1 : -1; } function sortSelectors$3(selectors, method) { switch (method) { case 'natural': return selectors.sort(naturalSorter$1); case 'standard': return selectors.sort(standardSorter); case 'none': case false: return selectors; } } var sortSelectors_1 = sortSelectors$3; function override$7(source1, source2) { var target = {}; var key1; var key2; var item; for (key1 in source1) { item = source1[key1]; if (Array.isArray(item)) { target[key1] = item.slice(0); } else if (typeof item == 'object' && item !== null) { target[key1] = override$7(item, {}); } else { target[key1] = item; } } for (key2 in source2) { item = source2[key2]; if (key2 in target && Array.isArray(item)) { target[key2] = item.slice(0); } else if (key2 in target && typeof item == 'object' && item !== null) { target[key2] = override$7(target[key2], item); } else { target[key2] = item; } } return target; } var override_1 = override$7; var systemLineBreak = require$$0__default.EOL; var override$6 = override_1; var Breaks$1 = { AfterAtRule: 'afterAtRule', AfterBlockBegins: 'afterBlockBegins', AfterBlockEnds: 'afterBlockEnds', AfterComment: 'afterComment', AfterProperty: 'afterProperty', AfterRuleBegins: 'afterRuleBegins', AfterRuleEnds: 'afterRuleEnds', BeforeBlockEnds: 'beforeBlockEnds', BetweenSelectors: 'betweenSelectors' }; var BreakWith = { CarriageReturnLineFeed: '\r\n', LineFeed: '\n', System: systemLineBreak }; var IndentWith = { Space: ' ', Tab: '\t' }; var Spaces$2 = { AroundSelectorRelation: 'aroundSelectorRelation', BeforeBlockBegins: 'beforeBlockBegins', BeforeValue: 'beforeValue' }; var DEFAULTS$2 = { breaks: breaks(false), breakWith: BreakWith.System, indentBy: 0, indentWith: IndentWith.Space, spaces: spaces(false), wrapAt: false, semicolonAfterLastProperty: false }; var BEAUTIFY_ALIAS = 'beautify'; var KEEP_BREAKS_ALIAS = 'keep-breaks'; var OPTION_SEPARATOR$1 = ';'; var OPTION_NAME_VALUE_SEPARATOR = ':'; var HASH_VALUES_OPTION_SEPARATOR = ','; var HASH_VALUES_NAME_VALUE_SEPARATOR = '='; var FALSE_KEYWORD_1$1 = 'false'; var FALSE_KEYWORD_2$1 = 'off'; var TRUE_KEYWORD_1$1 = 'true'; var TRUE_KEYWORD_2$1 = 'on'; function breaks(value) { var breakOptions = {}; breakOptions[Breaks$1.AfterAtRule] = value; breakOptions[Breaks$1.AfterBlockBegins] = value; breakOptions[Breaks$1.AfterBlockEnds] = value; breakOptions[Breaks$1.AfterComment] = value; breakOptions[Breaks$1.AfterProperty] = value; breakOptions[Breaks$1.AfterRuleBegins] = value; breakOptions[Breaks$1.AfterRuleEnds] = value; breakOptions[Breaks$1.BeforeBlockEnds] = value; breakOptions[Breaks$1.BetweenSelectors] = value; return breakOptions; } function spaces(value) { var spaceOptions = {}; spaceOptions[Spaces$2.AroundSelectorRelation] = value; spaceOptions[Spaces$2.BeforeBlockBegins] = value; spaceOptions[Spaces$2.BeforeValue] = value; return spaceOptions; } function formatFrom$1(source) { if (source === undefined || source === false) { return false; } if (typeof source == 'object' && 'breakWith' in source) { source = override$6(source, { breakWith: mapBreakWith(source.breakWith) }); } if (typeof source == 'object' && 'indentBy' in source) { source = override$6(source, { indentBy: parseInt(source.indentBy) }); } if (typeof source == 'object' && 'indentWith' in source) { source = override$6(source, { indentWith: mapIndentWith(source.indentWith) }); } if (typeof source == 'object') { return remapBreaks(override$6(DEFAULTS$2, source)); } if (typeof source == 'string' && source == BEAUTIFY_ALIAS) { return remapBreaks( override$6(DEFAULTS$2, { breaks: breaks(true), indentBy: 2, spaces: spaces(true) }) ); } if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) { return remapBreaks( override$6(DEFAULTS$2, { breaks: { afterAtRule: true, afterBlockBegins: true, afterBlockEnds: true, afterComment: true, afterRuleEnds: true, beforeBlockEnds: true } }) ); } if (typeof source == 'string') { return remapBreaks(override$6(DEFAULTS$2, toHash(source))); } return DEFAULTS$2; } function toHash(string) { return string .split(OPTION_SEPARATOR$1) .reduce(function (accumulator, directive) { var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; if (name == 'breaks' || name == 'spaces') { accumulator[name] = hashValuesToHash(value); } else if (name == 'indentBy' || name == 'wrapAt') { accumulator[name] = parseInt(value); } else if (name == 'indentWith') { accumulator[name] = mapIndentWith(value); } else if (name == 'breakWith') { accumulator[name] = mapBreakWith(value); } return accumulator; }, {}); } function hashValuesToHash(string) { return string .split(HASH_VALUES_OPTION_SEPARATOR) .reduce(function (accumulator, directive) { var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; accumulator[name] = normalizeValue$1(value); return accumulator; }, {}); } function normalizeValue$1(value) { switch (value) { case FALSE_KEYWORD_1$1: case FALSE_KEYWORD_2$1: return false; case TRUE_KEYWORD_1$1: case TRUE_KEYWORD_2$1: return true; default: return value; } } function mapBreakWith(value) { switch (value) { case 'windows': case 'crlf': case BreakWith.CarriageReturnLineFeed: return BreakWith.CarriageReturnLineFeed; case 'unix': case 'lf': case BreakWith.LineFeed: return BreakWith.LineFeed; default: return systemLineBreak; } } function mapIndentWith(value) { switch (value) { case 'space': return IndentWith.Space; case 'tab': return IndentWith.Tab; default: return value; } } function remapBreaks(source) { for (var key in Breaks$1) { var breakName = Breaks$1[key]; var breakValue = source.breaks[breakName]; if (breakValue === true) { source.breaks[breakName] = source.breakWith; } else if (breakValue === false) { source.breaks[breakName] = ''; } else { source.breaks[breakName] = source.breakWith.repeat(parseInt(breakValue)); } } return source; } var format = { Breaks: Breaks$1, Spaces: Spaces$2, formatFrom: formatFrom$1 }; var Marker$g = { ASTERISK: '*', AT: '@', BACK_SLASH: '\\', CARRIAGE_RETURN: '\r', CLOSE_CURLY_BRACKET: '}', CLOSE_ROUND_BRACKET: ')', CLOSE_SQUARE_BRACKET: ']', COLON: ':', COMMA: ',', DOUBLE_QUOTE: '"', EXCLAMATION: '!', FORWARD_SLASH: '/', INTERNAL: '-clean-css-', NEW_LINE_NIX: '\n', OPEN_CURLY_BRACKET: '{', OPEN_ROUND_BRACKET: '(', OPEN_SQUARE_BRACKET: '[', SEMICOLON: ';', SINGLE_QUOTE: '\'', SPACE: ' ', TAB: '\t', UNDERSCORE: '_' }; var marker = Marker$g; function formatPosition$4(metadata) { var line = metadata[0]; var column = metadata[1]; var source = metadata[2]; return source ? source + ':' + line + ':' + column : line + ':' + column; } var formatPosition_1 = formatPosition$4; var Spaces$1 = format.Spaces; var Marker$f = marker; var formatPosition$3 = formatPosition_1; var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/; var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g; var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g; var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g; var HTML_COMMENT_PATTERN = /^(?:(?:<!--|-->)\s*)+/; var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g; var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g; var RELATION_PATTERN$1 = /[>\+~]/; var WHITESPACE_PATTERN$2 = /\s/; var ASTERISK_PLUS_HTML_HACK = '*+html '; var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html '; var LESS_THAN = '<'; var PSEUDO_CLASSES_WITH_SELECTORS = [ ':current', ':future', ':has', ':host', ':host-context', ':is', ':not', ':past', ':where' ]; function hasInvalidCharacters(value) { var isEscaped; var isInvalid = false; var character; var isQuote = false; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; if (isEscaped) ; else if (character == Marker$f.SINGLE_QUOTE || character == Marker$f.DOUBLE_QUOTE) { isQuote = !isQuote; } else if (!isQuote && (character == Marker$f.CLOSE_CURLY_BRACKET || character == Marker$f.EXCLAMATION || character == LESS_THAN || character == Marker$f.SEMICOLON)) { isInvalid = true; break; } else if (!isQuote && i === 0 && RELATION_PATTERN$1.test(character)) { isInvalid = true; break; } isEscaped = character == Marker$f.BACK_SLASH; } return isInvalid; } function removeWhitespace(value, format) { var stripped = []; var character; var isNewLineNix; var isNewLineWin; var isEscaped; var wasEscaped; var isQuoted; var isSingleQuoted; var isDoubleQuoted; var isAttribute; var isRelation; var isWhitespace; var isSpaceAwarePseudoClass; var roundBracketLevel = 0; var wasComma = false; var wasRelation = false; var wasWhitespace = false; var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value); var spaceAroundRelation = format && format.spaces[Spaces$1.AroundSelectorRelation]; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; isNewLineNix = character == Marker$f.NEW_LINE_NIX; isNewLineWin = character == Marker$f.NEW_LINE_NIX && value[i - 1] == Marker$f.CARRIAGE_RETURN; isQuoted = isSingleQuoted || isDoubleQuoted; isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN$1.test(character); isWhitespace = WHITESPACE_PATTERN$2.test(character); isSpaceAwarePseudoClass = roundBracketLevel == 1 && character == Marker$f.CLOSE_ROUND_BRACKET ? false : isSpaceAwarePseudoClass || (roundBracketLevel === 0 && character == Marker$f.COLON && isPseudoClassWithSelectors(value, i)); if (wasEscaped && isQuoted && isNewLineWin) { // swallow escaped new windows lines in comments stripped.pop(); stripped.pop(); } else if (isEscaped && isQuoted && isNewLineNix) { // swallow escaped new *nix lines in comments stripped.pop(); } else if (isEscaped) { stripped.push(character); } else if (character == Marker$f.OPEN_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = true; } else if (character == Marker$f.CLOSE_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = false; } else if (character == Marker$f.OPEN_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel++; } else if (character == Marker$f.CLOSE_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel--; } else if (character == Marker$f.SINGLE_QUOTE && !isQuoted) { stripped.push(character); isSingleQuoted = true; } else if (character == Marker$f.DOUBLE_QUOTE && !isQuoted) { stripped.push(character); isDoubleQuoted = true; } else if (character == Marker$f.SINGLE_QUOTE && isQuoted) { stripped.push(character); isSingleQuoted = false; } else if (character == Marker$f.DOUBLE_QUOTE && isQuoted) { stripped.push(character); isDoubleQuoted = false; } else if (isWhitespace && wasRelation && !spaceAroundRelation) { continue; } else if (!isWhitespace && wasRelation && spaceAroundRelation) { stripped.push(Marker$f.SPACE); stripped.push(character); } else if (isWhitespace && !wasWhitespace && wasComma && roundBracketLevel > 0 && isSpaceAwarePseudoClass) ; else if (isWhitespace && !wasWhitespace && roundBracketLevel > 0 && isSpaceAwarePseudoClass) { stripped.push(character); } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) ; else if (isWhitespace && wasWhitespace && !isQuoted) ; else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) ; else if (isRelation && wasWhitespace && !spaceAroundRelation) { stripped.pop(); stripped.push(character); } else if (isRelation && !wasWhitespace && spaceAroundRelation) { stripped.push(Marker$f.SPACE); stripped.push(character); } else if (isWhitespace) { stripped.push(Marker$f.SPACE); } else { stripped.push(character); } wasEscaped = isEscaped; isEscaped = character == Marker$f.BACK_SLASH; wasRelation = isRelation; wasWhitespace = isWhitespace; wasComma = character == Marker$f.COMMA; } return withCaseAttribute ? stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') : stripped.join(''); } function isPseudoClassWithSelectors(value, colonPosition) { var pseudoClass = value.substring(colonPosition, value.indexOf(Marker$f.OPEN_ROUND_BRACKET, colonPosition)); return PSEUDO_CLASSES_WITH_SELECTORS.indexOf(pseudoClass) > -1; } function removeQuotes(value) { if (value.indexOf('\'') == -1 && value.indexOf('"') == -1) { return value; } return value .replace(SINGLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(SINGLE_QUOTE_PATTERN, '=$1$2') .replace(DOUBLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(DOUBLE_QUOTE_PATTERN, '=$1$2'); } function tidyRules$3(rules, removeUnsupported, adjacentSpace, format, warnings) { var list = []; var repeated = []; function removeHTMLComment(rule, match) { warnings.push('HTML comment \'' + match + '\' at ' + formatPosition$3(rule[2][0]) + '. Removing.'); return ''; } for (var i = 0, l = rules.length; i < l; i++) { var rule = rules[i]; var reduced = rule[1]; reduced = reduced.replace(HTML_COMMENT_PATTERN, removeHTMLComment.bind(null, rule)); if (hasInvalidCharacters(reduced)) { warnings.push('Invalid selector \'' + rule[1] + '\' at ' + formatPosition$3(rule[2][0]) + '. Ignoring.'); continue; } reduced = removeWhitespace(reduced, format); reduced = removeQuotes(reduced); if (adjacentSpace && reduced.indexOf('nav') > 0) { reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1'); } if (removeUnsupported && reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1) { continue; } if (removeUnsupported && reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1) { continue; } if (reduced.indexOf('*') > -1) { reduced = reduced .replace(/\*([:#\.\[])/g, '$1') .replace(/^(\:first\-child)?\+html/, '*$1+html'); } if (repeated.indexOf(reduced) > -1) { continue; } rule[1] = reduced; repeated.push(reduced); list.push(rule); } if (list.length == 1 && list[0][1].length === 0) { warnings.push('Empty selector \'' + list[0][1] + '\' at ' + formatPosition$3(list[0][2][0]) + '. Ignoring.'); list = []; } return list; } var tidyRules_1 = tidyRules$3; var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/; var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/; function tidyBlock$1(values, spaceAfterClosingBrace) { var withoutSpaceAfterClosingBrace; var withoutQuotes; var i; for (i = values.length - 1; i >= 0; i--) { withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]); withoutQuotes = SUPPORTED_QUOTE_REMOVAL_MATCHER.test(values[i][1]); values[i][1] = values[i][1] .replace(/\n|\r\n/g, ' ') .replace(/\s+/g, ' ') .replace(/(,|:|\() /g, '$1') .replace(/ \)/g, ')'); if (withoutQuotes) { values[i][1] = values[i][1] .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1') .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1'); } if (withoutSpaceAfterClosingBrace) { values[i][1] = values[i][1] .replace(/\) /g, ')'); } } return values; } var tidyBlock_1 = tidyBlock$1; function tidyAtRule$1(value) { return value .replace(/\s+/g, ' ') .replace(/url\(\s+/g, 'url(') .replace(/\s+\)/g, ')') .trim(); } var tidyAtRule_1 = tidyAtRule$1; var Hack$3 = { ASTERISK: 'asterisk', BANG: 'bang', BACKSLASH: 'backslash', UNDERSCORE: 'underscore' }; var hack = Hack$3; function removeUnused$2(properties) { for (var i = properties.length - 1; i >= 0; i--) { var property = properties[i]; if (property.unused) { property.all.splice(property.position, 1); } } } var removeUnused_1 = removeUnused$2; var Hack$2 = hack; var Marker$e = marker; var ASTERISK_HACK = '*'; var BACKSLASH_HACK = '\\'; var IMPORTANT_TOKEN = '!important'; var UNDERSCORE_HACK = '_'; var BANG_HACK = '!ie'; function restoreFromOptimizing$5(properties, restoreCallback) { var property; var restored; var current; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property.dynamic && property.important) { restoreImportant(property); continue; } if (property.dynamic) { continue; } if (property.unused) { continue; } if (!property.dirty && !property.important && !property.hack) { continue; } if (property.optimizable && restoreCallback) { restored = restoreCallback(property); property.value = restored; } else { restored = property.value; } if (property.important) { restoreImportant(property); } if (property.hack) { restoreHack(property); } if ('all' in property) { current = property.all[property.position]; current[1][1] = property.name; current.splice(2, current.length - 1); Array.prototype.push.apply(current, restored); } } } function restoreImportant(property) { property.value[property.value.length - 1][1] += IMPORTANT_TOKEN; } function restoreHack(property) { if (property.hack[0] == Hack$2.UNDERSCORE) { property.name = UNDERSCORE_HACK + property.name; } else if (property.hack[0] == Hack$2.ASTERISK) { property.name = ASTERISK_HACK + property.name; } else if (property.hack[0] == Hack$2.BACKSLASH) { property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1]; } else if (property.hack[0] == Hack$2.BANG) { property.value[property.value.length - 1][1] += Marker$e.SPACE + BANG_HACK; } } var restoreFromOptimizing_1 = restoreFromOptimizing$5; var Token$o = { AT_RULE: 'at-rule', // e.g. `@import`, `@charset` AT_RULE_BLOCK: 'at-rule-block', // e.g. `@font-face{...}` AT_RULE_BLOCK_SCOPE: 'at-rule-block-scope', // e.g. `@font-face` COMMENT: 'comment', // e.g. `/* comment */` NESTED_BLOCK: 'nested-block', // e.g. `@media screen{...}`, `@keyframes animation {...}` NESTED_BLOCK_SCOPE: 'nested-block-scope', // e.g. `@media`, `@keyframes` PROPERTY: 'property', // e.g. `color:red` PROPERTY_BLOCK: 'property-block', // e.g. `--var:{color:red}` PROPERTY_NAME: 'property-name', // e.g. `color` PROPERTY_VALUE: 'property-value', // e.g. `red` RAW: 'raw', // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments RULE: 'rule', // e.g `div > a{...}` RULE_SCOPE: 'rule-scope' // e.g `div > a` }; var token = Token$o; var Hack$1 = hack; var Marker$d = marker; var Token$n = token; var Match = { ASTERISK: '*', BACKSLASH: '\\', BANG: '!', BANG_SUFFIX_PATTERN: /!\w+$/, IMPORTANT_TOKEN: '!important', IMPORTANT_TOKEN_PATTERN: new RegExp('!important$', 'i'), IMPORTANT_WORD: 'important', IMPORTANT_WORD_PATTERN: new RegExp('important$', 'i'), SUFFIX_BANG_PATTERN: /!$/, UNDERSCORE: '_', VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/ }; function wrapAll(properties, skipProperties) { var wrapped = []; var single; var property; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property[0] != Token$n.PROPERTY) { continue; } if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) { continue; } single = wrapSingle$3(property); single.all = properties; single.position = i; wrapped.unshift(single); } return wrapped; } function someVariableReferences(property) { var i, l; var value; // skipping `property` and property name tokens for (i = 2, l = property.length; i < l; i++) { value = property[i]; if (value[0] != Token$n.PROPERTY_VALUE) { continue; } if (isVariableReference(value[1])) { return true; } } return false; } function isVariableReference(value) { return Match.VARIABLE_REFERENCE_PATTERN.test(value); } function isMultiplex(property) { var value; var i, l; for (i = 3, l = property.length; i < l; i++) { value = property[i]; if (value[0] == Token$n.PROPERTY_VALUE && (value[1] == Marker$d.COMMA || value[1] == Marker$d.FORWARD_SLASH)) { return true; } } return false; } function hackFrom(property) { var match = false; var name = property[1][1]; var lastValue = property[property.length - 1]; if (name[0] == Match.UNDERSCORE) { match = [Hack$1.UNDERSCORE]; } else if (name[0] == Match.ASTERISK) { match = [Hack$1.ASTERISK]; } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) { match = [Hack$1.BANG]; } else if (lastValue[1].indexOf(Match.BANG) > 0 && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && Match.BANG_SUFFIX_PATTERN.test(lastValue[1])) { match = [Hack$1.BANG]; } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) { match = [Hack$1.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)]; } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) { match = [Hack$1.BACKSLASH, lastValue[1].substring(1)]; } return match; } function isImportant(property) { if (property.length < 3) return false; var lastValue = property[property.length - 1]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { return true; } else if (Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1])) { return true; } return false; } function stripImportant(property) { var lastValue = property[property.length - 1]; var oneButLastValue = property[property.length - 2]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_TOKEN_PATTERN, ''); } else { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_WORD_PATTERN, ''); oneButLastValue[1] = oneButLastValue[1].replace(Match.SUFFIX_BANG_PATTERN, ''); } if (lastValue[1].length === 0) { property.pop(); } if (oneButLastValue[1].length === 0) { property.pop(); } } function stripPrefixHack(property) { property[1][1] = property[1][1].substring(1); } function stripSuffixHack(property, hackFrom) { var lastValue = property[property.length - 1]; lastValue[1] = lastValue[1] .substring(0, lastValue[1].indexOf(hackFrom[0] == Hack$1.BACKSLASH ? Match.BACKSLASH : Match.BANG)) .trim(); if (lastValue[1].length === 0) { property.pop(); } } function wrapSingle$3(property) { var importantProperty = isImportant(property); if (importantProperty) { stripImportant(property); } var whichHack = hackFrom(property); if (whichHack[0] == Hack$1.ASTERISK || whichHack[0] == Hack$1.UNDERSCORE) { stripPrefixHack(property); } else if (whichHack[0] == Hack$1.BACKSLASH || whichHack[0] == Hack$1.BANG) { stripSuffixHack(property, whichHack); } return { block: property[2] && property[2][0] == Token$n.PROPERTY_BLOCK, components: [], dirty: false, dynamic: someVariableReferences(property), hack: whichHack, important: importantProperty, name: property[1][1], multiplex: property.length > 3 ? isMultiplex(property) : false, optimizable: true, position: 0, shorthand: false, unused: false, value: property.slice(2) }; } var wrapForOptimizing$3 = { all: wrapAll, single: wrapSingle$3 }; function InvalidPropertyError$2(message) { this.name = 'InvalidPropertyError'; this.message = message; this.stack = (new Error()).stack; } InvalidPropertyError$2.prototype = Object.create(Error.prototype); InvalidPropertyError$2.prototype.constructor = InvalidPropertyError$2; var invalidPropertyError = InvalidPropertyError$2; var InvalidPropertyError$1 = invalidPropertyError; var wrapSingle$2 = wrapForOptimizing$3.single; var Token$m = token; var Marker$c = marker; var formatPosition$2 = formatPosition_1; function _anyIsInherit(values) { var i, l; for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == 'inherit') { return true; } } return false; } function _colorFilter(validator) { return function (value) { return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]); }; } function _styleFilter(validator) { return function (value) { return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function _wrapDefault(name, property, configuration) { var descriptor = configuration[name]; if (descriptor.doubleValues && descriptor.defaultValue.length == 2) { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[0]], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[1]] ]); } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[0]] ]); } else { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue] ]); } } function _widthFilter(validator) { return function (value) { return value[1] != 'inherit' && (validator.isWidth(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) && !validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function animation(property, configuration, validator) { var duration = _wrapDefault(property.name + '-duration', property, configuration); var timing = _wrapDefault(property.name + '-timing-function', property, configuration); var delay = _wrapDefault(property.name + '-delay', property, configuration); var iteration = _wrapDefault(property.name + '-iteration-count', property, configuration); var direction = _wrapDefault(property.name + '-direction', property, configuration); var fill = _wrapDefault(property.name + '-fill-mode', property, configuration); var play = _wrapDefault(property.name + '-play-state', property, configuration); var name = _wrapDefault(property.name + '-name', property, configuration); var components = [duration, timing, delay, iteration, direction, fill, play, name]; var values = property.value; var value; var durationSet = false; var timingSet = false; var delaySet = false; var iterationSet = false; var directionSet = false; var fillSet = false; var playSet = false; var nameSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid animation values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) { iteration.value = [value]; iterationSet = true; } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) { direction.value = [value]; directionSet = true; } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) { fill.value = [value]; fillSet = true; } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) { play.value = [value]; playSet = true; } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) { name.value = [value]; nameSet = true; } else { throw new InvalidPropertyError$1('Invalid animation value at ' + formatPosition$2(value[2][0]) + '. Ignoring.'); } } return components; } function background$2(property, configuration, validator) { var image = _wrapDefault('background-image', property, configuration); var position = _wrapDefault('background-position', property, configuration); var size = _wrapDefault('background-size', property, configuration); var repeat = _wrapDefault('background-repeat', property, configuration); var attachment = _wrapDefault('background-attachment', property, configuration); var origin = _wrapDefault('background-origin', property, configuration); var clip = _wrapDefault('background-clip', property, configuration); var color = _wrapDefault('background-color', property, configuration); var components = [image, position, size, repeat, attachment, origin, clip, color]; var values = property.value; var positionSet = false; var clipSet = false; var originSet = false; var repeatSet = false; var anyValueSet = false; if (property.value.length == 1 && property.value[0][1] == 'inherit') { // NOTE: 'inherit' is not a valid value for background-attachment color.value = image.value = repeat.value = position.value = size.value = origin.value = clip.value = property.value; return components; } if (property.value.length == 1 && property.value[0][1] == '0 0') { return components; } for (var i = values.length - 1; i >= 0; i--) { var value = values[i]; if (validator.isBackgroundAttachmentKeyword(value[1])) { attachment.value = [value]; anyValueSet = true; } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) { if (clipSet) { origin.value = [value]; originSet = true; } else { clip.value = [value]; clipSet = true; } anyValueSet = true; } else if (validator.isBackgroundRepeatKeyword(value[1])) { if (repeatSet) { repeat.value.unshift(value); } else { repeat.value = [value]; repeatSet = true; } anyValueSet = true; } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) { if (i > 0) { var previousValue = values[i - 1]; if (previousValue[1] == Marker$c.FORWARD_SLASH) { size.value = [value]; } else if (i > 1 && values[i - 2][1] == Marker$c.FORWARD_SLASH) { size.value = [previousValue, value]; i -= 2; } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } anyValueSet = true; } else if ((color.value[0][1] == configuration[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) { color.value = [value]; anyValueSet = true; } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) { image.value = [value]; anyValueSet = true; } } if (clipSet && !originSet) origin.value = clip.value.slice(0); if (!anyValueSet) { throw new InvalidPropertyError$1('Invalid background value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } return components; } function borderRadius$2(property, configuration) { var values = property.value; var splitAt = -1; for (var i = 0, l = values.length; i < l; i++) { if (values[i][1] == Marker$c.FORWARD_SLASH) { splitAt = i; break; } } if (splitAt === 0 || splitAt === values.length - 1) { throw new InvalidPropertyError$1('Invalid border-radius value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } var target = _wrapDefault(property.name, property, configuration); target.value = splitAt > -1 ? values.slice(0, splitAt) : values.slice(0); target.components = fourValues$1(target, configuration); var remainder = _wrapDefault(property.name, property, configuration); remainder.value = splitAt > -1 ? values.slice(splitAt + 1) : values.slice(0); remainder.components = fourValues$1(remainder, configuration); for (var j = 0; j < 4; j++) { target.components[j].multiplex = true; target.components[j].value = target.components[j].value.concat(remainder.components[j].value); } return target.components; } function font$1(property, configuration, validator) { var style = _wrapDefault('font-style', property, configuration); var variant = _wrapDefault('font-variant', property, configuration); var weight = _wrapDefault('font-weight', property, configuration); var stretch = _wrapDefault('font-stretch', property, configuration); var size = _wrapDefault('font-size', property, configuration); var height = _wrapDefault('line-height', property, configuration); var family = _wrapDefault('font-family', property, configuration); var components = [style, variant, weight, stretch, size, height, family]; var values = property.value; var fuzzyMatched = 4; // style, variant, weight, and stretch var index = 0; var isStretchSet = false; var isStretchValid; var isStyleSet = false; var isStyleValid; var isVariantSet = false; var isVariantValid; var isWeightSet = false; var isWeightValid; var isSizeSet = false; var appendableFamilyName = false; if (!values[index]) { throw new InvalidPropertyError$1('Missing font values at ' + formatPosition$2(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length == 1 && values[0][1] == 'inherit') { style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) { values[0][1] = Marker$c.INTERNAL + values[0][1]; style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) { throw new InvalidPropertyError$1('Invalid font values at ' + formatPosition$2(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid font values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } // fuzzy match style, variant, weight, and stretch on first elements while (index < fuzzyMatched) { isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]); if (isStyleValid && !isStyleSet) { style.value = [values[index]]; isStyleSet = true; } else if (isVariantValid && !isVariantSet) { variant.value = [values[index]]; isVariantSet = true; } else if (isWeightValid && !isWeightSet) { weight.value = [values[index]]; isWeightSet = true; } else if (isStretchValid && !isStretchSet) { stretch.value = [values[index]]; isStretchSet = true; } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) { throw new InvalidPropertyError$1('Invalid font style / variant / weight / stretch value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } else { break; } index++; } // now comes font-size ... if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) { size.value = [values[index]]; isSizeSet = true; index++; } else { throw new InvalidPropertyError$1('Missing font size at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } if (!values[index]) { throw new InvalidPropertyError$1('Missing font family at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } // ... and perhaps line-height if (isSizeSet && values[index] && values[index][1] == Marker$c.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) { height.value = [values[index + 1]]; index++; index++; } // ... and whatever comes next is font-family family.value = []; while (values[index]) { if (values[index][1] == Marker$c.COMMA) { appendableFamilyName = false; } else { if (appendableFamilyName) { family.value[family.value.length - 1][1] += Marker$c.SPACE + values[index][1]; } else { family.value.push(values[index]); } appendableFamilyName = true; } index++; } if (family.value.length === 0) { throw new InvalidPropertyError$1('Missing font family at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } return components; } function _anyIsFontSize(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) { return true; } } return false; } function _anyIsFontFamily(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isIdentifier(value[1]) || validator.isQuotedText(value[1])) { return true; } } return false; } function fourValues$1(property, configuration) { var componentNames = configuration[property.name].components; var components = []; var value = property.value; if (value.length < 1) return []; if (value.length < 2) value[1] = value[0].slice(0); if (value.length < 3) value[2] = value[0].slice(0); if (value.length < 4) value[3] = value[1].slice(0); for (var i = componentNames.length - 1; i >= 0; i--) { var component = wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, componentNames[i]] ]); component.value = [value[i]]; components.unshift(component); } return components; } function multiplex$1(splitWith) { return function (property, configuration, validator) { var splitsAt = []; var values = property.value; var i, j, l, m; // find split commas for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == ',') splitsAt.push(i); } if (splitsAt.length === 0) return splitWith(property, configuration, validator); var splitComponents = []; // split over commas, and into components for (i = 0, l = splitsAt.length; i <= l; i++) { var from = i === 0 ? 0 : splitsAt[i - 1] + 1; var to = i < l ? splitsAt[i] : values.length; var _property = _wrapDefault(property.name, property, configuration); _property.value = values.slice(from, to); if (_property.value.length > 0) { splitComponents.push(splitWith(_property, configuration, validator)); } } var components = splitComponents[0]; // group component values from each split for (i = 0, l = components.length; i < l; i++) { components[i].multiplex = true; for (j = 1, m = splitComponents.length; j < m; j++) { components[i].value.push([Token$m.PROPERTY_VALUE, Marker$c.COMMA]); Array.prototype.push.apply(components[i].value, splitComponents[j][i].value); } } return components; }; } function listStyle(property, configuration, validator) { var type = _wrapDefault('list-style-type', property, configuration); var position = _wrapDefault('list-style-position', property, configuration); var image = _wrapDefault('list-style-image', property, configuration); var components = [type, position, image]; if (property.value.length == 1 && property.value[0][1] == 'inherit') { type.value = position.value = image.value = [property.value[0]]; return components; } var values = property.value.slice(0); var total = values.length; var index = 0; // `image` first... for (index = 0, total = values.length; index < total; index++) { if (validator.isUrl(values[index][1]) || values[index][1] == '0') { image.value = [values[index]]; values.splice(index, 1); break; } } // ... then `position` for (index = 0, total = values.length; index < total; index++) { if (validator.isListStylePositionKeyword(values[index][1])) { position.value = [values[index]]; values.splice(index, 1); break; } } // ... and what's left is a `type` if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) { type.value = [values[0]]; } return components; } function transition(property, configuration, validator) { var prop = _wrapDefault(property.name + '-property', property, configuration); var duration = _wrapDefault(property.name + '-duration', property, configuration); var timing = _wrapDefault(property.name + '-timing-function', property, configuration); var delay = _wrapDefault(property.name + '-delay', property, configuration); var components = [prop, duration, timing, delay]; var values = property.value; var value; var durationSet = false; var delaySet = false; var propSet = false; var timingSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { prop.value = duration.value = timing.value = delay.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid animation values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if (validator.isIdentifier(value[1]) && !propSet) { prop.value = [value]; propSet = true; } else { throw new InvalidPropertyError$1('Invalid animation value at ' + formatPosition$2(value[2][0]) + '. Ignoring.'); } } return components; } function widthStyleColor(property, configuration, validator) { var descriptor = configuration[property.name]; var components = [ _wrapDefault(descriptor.components[0], property, configuration), _wrapDefault(descriptor.components[1], property, configuration), _wrapDefault(descriptor.components[2], property, configuration) ]; var color, style, width; for (var i = 0; i < 3; i++) { var component = components[i]; if (component.name.indexOf('color') > 0) color = component; else if (component.name.indexOf('style') > 0) style = component; else width = component; } if ((property.value.length == 1 && property.value[0][1] == 'inherit') || (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) { color.value = style.value = width.value = [property.value[0]]; return components; } var values = property.value.slice(0); var match, matches; // NOTE: usually users don't follow the required order of parts in this shorthand, // so we'll try to parse it caring as little about order as possible if (values.length > 0) { matches = values.filter(_widthFilter(validator)); match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0]; if (match) { width.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_styleFilter(validator))[0]; if (match) { style.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_colorFilter(validator))[0]; if (match) { color.value = [match]; values.splice(values.indexOf(match), 1); } } return components; } var breakUp$1 = { animation: animation, background: background$2, border: widthStyleColor, borderRadius: borderRadius$2, font: font$1, fourValues: fourValues$1, listStyle: listStyle, multiplex: multiplex$1, outline: widthStyleColor, transition: transition }; var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g; function unique(value) { var prefixes = []; var match; while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) { if (prefixes.indexOf(match[0]) == -1) { prefixes.push(match[0]); } } return prefixes; } function same(value1, value2) { return unique(value1).sort().join(',') == unique(value2).sort().join(','); } var vendorPrefixes = { unique: unique, same: same }; var sameVendorPrefixes = vendorPrefixes.same; function understandable$1(validator, value1, value2, _position, isPaired) { if (!sameVendorPrefixes(value1, value2)) { return false; } if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) { return false; } return true; } var understandable_1 = understandable$1; var understandable = understandable_1; function animationIterationCount(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(valu