aboutsummaryrefslogtreecommitdiff
path: root/node_modules/clean-css
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/clean-css')
-rw-r--r--node_modules/clean-css/History.md1358
-rw-r--r--node_modules/clean-css/LICENSE19
-rw-r--r--node_modules/clean-css/README.md764
-rw-r--r--node_modules/clean-css/index.js1
-rw-r--r--node_modules/clean-css/lib/clean.js172
-rw-r--r--node_modules/clean-css/lib/optimizer/hack.js8
-rw-r--r--node_modules/clean-css/lib/optimizer/level-0/optimize.js6
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/optimize.js676
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js189
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js61
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js10
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js23
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js9
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/tidy-block.js23
-rw-r--r--node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js213
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/break-up.js644
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/can-override.js283
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/clone.js33
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/compactable.js1063
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/extract-properties.js73
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js10
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js259
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js50
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js103
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js80
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js78
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/optimize.js134
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js28
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js40
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js10
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js22
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js11
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js445
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js40
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js484
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js9
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js42
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js15
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js23
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js180
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js30
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js30
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js43
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js249
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/reorderable.js93
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js13
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/restore.js303
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/restructure.js389
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js32
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js34
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/specificity.js77
-rw-r--r--node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js21
-rw-r--r--node_modules/clean-css/lib/optimizer/remove-unused.js11
-rw-r--r--node_modules/clean-css/lib/optimizer/restore-from-optimizing.js69
-rw-r--r--node_modules/clean-css/lib/optimizer/validator.js529
-rw-r--r--node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js191
-rw-r--r--node_modules/clean-css/lib/options/compatibility.js183
-rw-r--r--node_modules/clean-css/lib/options/fetch.js7
-rw-r--r--node_modules/clean-css/lib/options/format.js216
-rw-r--r--node_modules/clean-css/lib/options/inline-request.js22
-rw-r--r--node_modules/clean-css/lib/options/inline-timeout.js7
-rw-r--r--node_modules/clean-css/lib/options/inline.js15
-rw-r--r--node_modules/clean-css/lib/options/optimization-level.js221
-rw-r--r--node_modules/clean-css/lib/options/rebase-to.js7
-rw-r--r--node_modules/clean-css/lib/options/rebase.js5
-rw-r--r--node_modules/clean-css/lib/options/rounding-precision.js88
-rw-r--r--node_modules/clean-css/lib/reader/apply-source-maps.js245
-rw-r--r--node_modules/clean-css/lib/reader/extract-import-url-and-media.js35
-rw-r--r--node_modules/clean-css/lib/reader/input-source-map-tracker.js58
-rw-r--r--node_modules/clean-css/lib/reader/is-allowed-resource.js77
-rw-r--r--node_modules/clean-css/lib/reader/load-original-sources.js126
-rw-r--r--node_modules/clean-css/lib/reader/load-remote-resource.js74
-rw-r--r--node_modules/clean-css/lib/reader/match-data-uri.js7
-rw-r--r--node_modules/clean-css/lib/reader/normalize-path.js8
-rw-r--r--node_modules/clean-css/lib/reader/read-sources.js341
-rw-r--r--node_modules/clean-css/lib/reader/rebase-local-map.js15
-rw-r--r--node_modules/clean-css/lib/reader/rebase-remote-map.js14
-rw-r--r--node_modules/clean-css/lib/reader/rebase.js101
-rw-r--r--node_modules/clean-css/lib/reader/restore-import.js5
-rw-r--r--node_modules/clean-css/lib/reader/rewrite-url.js118
-rw-r--r--node_modules/clean-css/lib/tokenizer/marker.js26
-rw-r--r--node_modules/clean-css/lib/tokenizer/token.js17
-rw-r--r--node_modules/clean-css/lib/tokenizer/tokenize.js571
-rw-r--r--node_modules/clean-css/lib/utils/clone-array.js12
-rw-r--r--node_modules/clean-css/lib/utils/format-position.js11
-rw-r--r--node_modules/clean-css/lib/utils/has-protocol.js7
-rw-r--r--node_modules/clean-css/lib/utils/is-data-uri-resource.js7
-rw-r--r--node_modules/clean-css/lib/utils/is-http-resource.js7
-rw-r--r--node_modules/clean-css/lib/utils/is-https-resource.js7
-rw-r--r--node_modules/clean-css/lib/utils/is-import.js7
-rw-r--r--node_modules/clean-css/lib/utils/is-remote-resource.js7
-rw-r--r--node_modules/clean-css/lib/utils/natural-compare.js31
-rw-r--r--node_modules/clean-css/lib/utils/override.js34
-rw-r--r--node_modules/clean-css/lib/utils/split.js50
-rw-r--r--node_modules/clean-css/lib/writer/helpers.js243
-rw-r--r--node_modules/clean-css/lib/writer/one-time.js52
-rw-r--r--node_modules/clean-css/lib/writer/simple.js50
-rw-r--r--node_modules/clean-css/lib/writer/source-maps.js101
-rw-r--r--node_modules/clean-css/package.json48
99 files changed, 0 insertions, 13088 deletions
diff --git a/node_modules/clean-css/History.md b/node_modules/clean-css/History.md
deleted file mode 100644
index 5ebcec289..000000000
--- a/node_modules/clean-css/History.md
+++ /dev/null
@@ -1,1358 +0,0 @@
-[4.2.1 / 2018-08-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.0...v4.2.1)
-==================
-
-* Fixes giving `breakWith` option via a string.
-
-[4.2.0 / 2018-08-02](https://github.com/jakubpawlowicz/clean-css/compare/4.1...4.2.0)
-==================
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-* Fixed issue [#861](https://github.com/jakubpawlowicz/clean-css/issues/861) - new `transition` property optimizer.
-* Fixed issue [#895](https://github.com/jakubpawlowicz/clean-css/issues/895) - ignoring specific styles.
-* Fixed issue [#947](https://github.com/jakubpawlowicz/clean-css/issues/947) - selector based filtering.
-* Fixed issue [#964](https://github.com/jakubpawlowicz/clean-css/issues/964) - adds configurable line breaks.
-* Fixed issue [#986](https://github.com/jakubpawlowicz/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
-* Fixed issue [#1000](https://github.com/jakubpawlowicz/clean-css/issues/1000) - carriage return handling in tokenizer.
-* Fixed issue [#1038](https://github.com/jakubpawlowicz/clean-css/issues/1038) - `font-variation-settings` quoting.
-* Fixes ReDOS vulnerabilities in validator code.
-
-[4.1.11 / 2018-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.10...v4.1.11)
-==================
-
-* Backports fixes to ReDOS vulnerabilities in validator code.
-
-[4.1.10 / 2018-03-05](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.9...v4.1.10)
-==================
-
-* Fixed issue [#988](https://github.com/jakubpawlowicz/clean-css/issues/988) - edge case in dropping default animation-duration.
-* Fixed issue [#989](https://github.com/jakubpawlowicz/clean-css/issues/989) - edge case in removing unused at rules.
-* Fixed issue [#1001](https://github.com/jakubpawlowicz/clean-css/issues/1001) - corrupted tokenizer state.
-* Fixed issue [#1006](https://github.com/jakubpawlowicz/clean-css/issues/1006) - edge case in handling invalid source maps.
-* Fixed issue [#1008](https://github.com/jakubpawlowicz/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
-
-[4.1.9 / 2017-09-19](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.8...v4.1.9)
-==================
-
-* Fixed issue [#971](https://github.com/jakubpawlowicz/clean-css/issues/971) - edge case in removing unused at rules.
-
-[4.1.8 / 2017-09-02](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.7...v4.1.8)
-==================
-
-* Fixed issue [#959](https://github.com/jakubpawlowicz/clean-css/issues/959) - regression in shortening long hex values.
-* Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat.
-* Fixed issue [#965](https://github.com/jakubpawlowicz/clean-css/issues/965) - edge case in parsing comment endings.
-* Fixed issue [#966](https://github.com/jakubpawlowicz/clean-css/issues/966) - remote `@import`s referenced from local ones.
-
-[4.1.7 / 2017-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.6...v4.1.7)
-==================
-
-* Fixed issue [#957](https://github.com/jakubpawlowicz/clean-css/issues/957) - `0%` minification of `width` property.
-
-[4.1.6 / 2017-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.5...v4.1.6)
-==================
-
-* Fixed issue [#887](https://github.com/jakubpawlowicz/clean-css/issues/887) - edge case in serializing comments.
-* Fixed issue [#953](https://github.com/jakubpawlowicz/clean-css/issues/953) - beautify breaks attribute selectors.
-
-[4.1.5 / 2017-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.4...v4.1.5)
-==================
-
-* Fixed issue [#945](https://github.com/jakubpawlowicz/clean-css/issues/945) - hex RGBA colors in IE filters.
-* Fixed issue [#952](https://github.com/jakubpawlowicz/clean-css/issues/952) - parsing `@page` according to CSS3 spec.
-
-[4.1.4 / 2017-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.3...v4.1.4)
-==================
-
-* Fixed issue [#950](https://github.com/jakubpawlowicz/clean-css/issues/950) - bug in removing unused `@font-face` rules.
-
-[4.1.3 / 2017-05-18](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.2...v4.1.3)
-==================
-
-* Fixed issue [#946](https://github.com/jakubpawlowicz/clean-css/issues/946) - tokenizing `-ms-grid-columns` repeat syntax.
-
-[4.1.2 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.1...v4.1.2)
-==================
-
-* Fixed issue [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-* Fixed issue [#940](https://github.com/jakubpawlowicz/clean-css/issues/940) - handling more `font` keywords.
-* Fixed issue [#941](https://github.com/jakubpawlowicz/clean-css/issues/941) - breaking up vendor prefixed `animation`.
-
-[4.1.1 / 2017-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.0...v4.1.1)
-==================
-
-* Fixed issue [#938](https://github.com/jakubpawlowicz/clean-css/issues/938) - removing unused at-rules with `!important`.
-
-[4.1.0 / 2017-05-07](https://github.com/jakubpawlowicz/clean-css/compare/4.0...v4.1.0)
-==================
-
-* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
-* Fixed issue [#254](https://github.com/jakubpawlowicz/clean-css/issues/254) - adds `font` property optimizer.
-* Fixed issue [#525](https://github.com/jakubpawlowicz/clean-css/issues/525) - restores `inherit`-based merging.
-* Fixed issue [#755](https://github.com/jakubpawlowicz/clean-css/issues/755) - adds custom handling of remote requests.
-* Fixed issue [#860](https://github.com/jakubpawlowicz/clean-css/issues/860) - adds `animation` property optimizer.
-* Fixed issue [#862](https://github.com/jakubpawlowicz/clean-css/issues/862) - allows removing unused at rules.
-* Fixed issue [#886](https://github.com/jakubpawlowicz/clean-css/issues/886) - better multi pseudo class / element merging.
-* Fixed issue [#890](https://github.com/jakubpawlowicz/clean-css/issues/890) - adds toggle to disable empty tokens removal.
-* Fixed issue [#893](https://github.com/jakubpawlowicz/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
-* Fixed issue [#905](https://github.com/jakubpawlowicz/clean-css/issues/905) - allows disabling selector sorting.
-* Fixed issue [#906](https://github.com/jakubpawlowicz/clean-css/issues/906) - improves usability of web UI settings.
-* Fixed issue [#908](https://github.com/jakubpawlowicz/clean-css/issues/908) - improved `minify` method signature.
-* Fixed issue [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Fixed issue [#920](https://github.com/jakubpawlowicz/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
-* Fixed issue [#934](https://github.com/jakubpawlowicz/clean-css/issues/934) - smarter longhand into shorthand merging.
-
-[4.0.13 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.12...v4.0.13)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-
-[4.0.12 / 2017-04-12](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.11...v4.0.12)
-==================
-
-* Fixed issue [#930](https://github.com/jakubpawlowicz/clean-css/issues/930) - regression in tidying selectors.
-
-[4.0.11 / 2017-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.10...v4.0.11)
-==================
-
-* Fixed issue [#924](https://github.com/jakubpawlowicz/clean-css/issues/924) - `hsl` zero percent eager optimization.
-
-[4.0.10 / 2017-03-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.9...v4.0.10)
-==================
-
-* Fixed issue [#917](https://github.com/jakubpawlowicz/clean-css/issues/917) - prevents grid area unquoting.
-* Backported [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Refixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - IE backslash hacks.
-
-[4.0.9 / 2017-03-15](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.8...v4.0.9)
-==================
-
-* Fixed issue [#902](https://github.com/jakubpawlowicz/clean-css/issues/902) - case insensitive attribute matchers.
-* Fixed issue [#903](https://github.com/jakubpawlowicz/clean-css/issues/903) - web UI and source maps.
-* Fixed issue [#907](https://github.com/jakubpawlowicz/clean-css/issues/907) - space after closing brace in `@supports`.
-* Fixed issue [#910](https://github.com/jakubpawlowicz/clean-css/issues/910) - too aggressive precision optimizations.
-
-[4.0.8 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.7...v4.0.8)
-==================
-
-* Fixes edge case in remote stylesheet fetching.
-* Fixed issue [#899](https://github.com/jakubpawlowicz/clean-css/issues/899) - regression in optimizing pseudo class arguments.
-
-[4.0.7 / 2017-02-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.6...v4.0.7)
-==================
-
-* Fixed issue [#891](https://github.com/jakubpawlowicz/clean-css/issues/891) - merging vendor-prefixed pseudo-classes.
-
-[4.0.6 / 2017-02-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.5...v4.0.6)
-==================
-
-* Fixed issue [#885](https://github.com/jakubpawlowicz/clean-css/issues/885) - unquoting `font-feature-settings`.
-
-[4.0.5 / 2017-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.4...v4.0.5)
-==================
-
-* Fixed issue [#884](https://github.com/jakubpawlowicz/clean-css/issues/884) - handling absolute paths on Windows.
-* Fixed issue [#881](https://github.com/jakubpawlowicz/clean-css/issues/881) - incorrect `require` arity.
-* Fixed issue [#880](https://github.com/jakubpawlowicz/clean-css/issues/880) - incorrect token type identification.
-
-[4.0.4 / 2017-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.3...v4.0.4)
-==================
-
-* Fixed issue [#879](https://github.com/jakubpawlowicz/clean-css/issues/879) - incorrect handling of spaces in paths.
-* Fixed issue [#878](https://github.com/jakubpawlowicz/clean-css/issues/878) - invalid double backslash tokenization.
-
-[4.0.3 / 2017-01-30](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.2...v4.0.3)
-==================
-
-* Fixed issue [#875](https://github.com/jakubpawlowicz/clean-css/issues/875) - invalid traversing in semantic merging.
-
-[4.0.2 / 2017-01-26](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.1...v4.0.2)
-==================
-
-* Fixed issue [#874](https://github.com/jakubpawlowicz/clean-css/issues/874) - regression in at-rule tokenization.
-
-[4.0.1 / 2017-01-25](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.0...v4.0.1)
-==================
-
-* Fixed issue [#866](https://github.com/jakubpawlowicz/clean-css/issues/866) - edge case in `inline` option.
-* Fixed issue [#867](https://github.com/jakubpawlowicz/clean-css/issues/867) - skip optimizing variable values.
-* Fixed issue [#868](https://github.com/jakubpawlowicz/clean-css/issues/868) - accept absolute paths in input hash.
-* Fixed issue [#872](https://github.com/jakubpawlowicz/clean-css/issues/872) - edge case in CSS tokenization.
-
-[4.0.0 / 2017-01-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v4.0.0)
-==================
-
-* Adds more detailed error & warning messages on top of the new tokenizer.
-* Disables restructuring optimizations by default until optimized in #533.
-* Fixes a bug ignoring incorrect properties in complex restructuring.
-* Requires Node.js 4.0+ to run.
-* Removes `benchmark` API option as total time is always reported under `stats` property.
-* Removes `debug` API switch as stats are always gathered and available under `stats` property.
-* Replaces the old tokenizer with a new one which doesn't use any escaping.
-* Replaces the old `@import` inlining with one on top of the new tokenizer.
-* Re-enables `background-(clip|origin|size)` merging with `background` shorthand.
-* Simplifies URL rebasing with a single `rebaseTo` option in API or inferred from `--output` in CLI.
-* Splits `inliner` option into `inlineRequest` and `inlineTimeout`.
-* Fixed issue [#209](https://github.com/jakubpawlowicz/clean-css/issues/209) - adds output formatting via `format` flag.
-* Fixed issue [#290](https://github.com/jakubpawlowicz/clean-css/issues/290) - removes aggressive merging.
-* Fixed issue [#432](https://github.com/jakubpawlowicz/clean-css/issues/432) - adds URLs normalization.
-* Fixed issue [#460](https://github.com/jakubpawlowicz/clean-css/issues/460) - unescaped semicolon in selector.
-* Fixed issue [#657](https://github.com/jakubpawlowicz/clean-css/issues/657) - adds property name validation.
-* Fixed issue [#685](https://github.com/jakubpawlowicz/clean-css/issues/685) - adds lowercasing hex colors optimization.
-* Fixed issue [#686](https://github.com/jakubpawlowicz/clean-css/issues/686) - adds rounding precision for all units.
-* Fixed issue [#703](https://github.com/jakubpawlowicz/clean-css/issues/703) - changes default IE compatibility to 10+.
-* Fixed issue [#731](https://github.com/jakubpawlowicz/clean-css/issues/731) - adds granular control over level 2 optimizations.
-* Fixed issue [#739](https://github.com/jakubpawlowicz/clean-css/issues/739) - error when a closing brace is missing.
-* Fixed issue [#750](https://github.com/jakubpawlowicz/clean-css/issues/750) - allows `width` overriding.
-* Fixed issue [#756](https://github.com/jakubpawlowicz/clean-css/issues/756) - adds disabling font-weight optimizations.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - ignores rules with empty selector.
-* Fixed issue [#767](https://github.com/jakubpawlowicz/clean-css/issues/767) - disables remote `@import` inlining by default.
-* Fixed issue [#773](https://github.com/jakubpawlowicz/clean-css/issues/773) - adds reordering based on selector specificity.
-* Fixed issue [#785](https://github.com/jakubpawlowicz/clean-css/issues/785) - adds `@font-face` de-duplication.
-* Fixed issue [#791](https://github.com/jakubpawlowicz/clean-css/issues/791) - resolves imports in-memory if possible.
-* Fixed issue [#796](https://github.com/jakubpawlowicz/clean-css/issues/796) - semantic merging for `@media` blocks.
-* Fixed issue [#801](https://github.com/jakubpawlowicz/clean-css/issues/801) - smarter `@import` inlining.
-* Fixed issue [#806](https://github.com/jakubpawlowicz/clean-css/issues/806) - skip optimizing variable properties.
-* Fixed issue [#817](https://github.com/jakubpawlowicz/clean-css/issues/817) - makes `off` disable rounding.
-* Fixed issue [#818](https://github.com/jakubpawlowicz/clean-css/issues/818) - disables `px` rounding by default.
-* Fixed issue [#828](https://github.com/jakubpawlowicz/clean-css/issues/828) - `-chrome-` hack support.
-* Fixed issue [#829](https://github.com/jakubpawlowicz/clean-css/issues/829) - adds more strict selector merging rules.
-* Fixed issue [#834](https://github.com/jakubpawlowicz/clean-css/issues/834) - adds extra line break in nested blocks.
-* Fixed issue [#836](https://github.com/jakubpawlowicz/clean-css/issues/836) - enables level `0` optimizations.
-* Fixed issue [#839](https://github.com/jakubpawlowicz/clean-css/issues/839) - allows URIs in import inlining rules.
-* Fixed issue [#840](https://github.com/jakubpawlowicz/clean-css/issues/840) - allows input source map as map object.
-* Fixed issue [#843](https://github.com/jakubpawlowicz/clean-css/issues/843) - regression in selector handling.
-* Fixed issue [#845](https://github.com/jakubpawlowicz/clean-css/issues/845) - web compatibility of 4.0 branch.
-* Fixed issue [#847](https://github.com/jakubpawlowicz/clean-css/issues/847) - regression in handling invalid selectors.
-* Fixed issue [#849](https://github.com/jakubpawlowicz/clean-css/issues/849) - disables inlining protocol-less resources.
-* Fixed issue [#856](https://github.com/jakubpawlowicz/clean-css/issues/856) - allows `minify` to return a promise.
-* Fixed issue [#857](https://github.com/jakubpawlowicz/clean-css/issues/857) - normalizes CleanCSS API interface.
-* Fixed issue [#863](https://github.com/jakubpawlowicz/clean-css/issues/863) - adds `transform` callback for custom optimizations.
-
-[3.4.26 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.25...v3.4.26)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at-rule.
-
-[3.4.25 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v3.4.25)
-==================
-
-* Fixed issue [#897](https://github.com/jakubpawlowicz/clean-css/issues/897) - tokenization with escaped markers.
-
-[3.4.24 / 2017-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.23...v3.4.24)
-==================
-
-* Fixed issue [#859](https://github.com/jakubpawlowicz/clean-css/issues/859) - avoid `-webkit-border-radius` optimizations.
-
-[3.4.23 / 2016-12-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.22...v3.4.23)
-==================
-
-* Fixed issue [#844](https://github.com/jakubpawlowicz/clean-css/issues/844) - regression in property values extraction.
-
-[3.4.22 / 2016-12-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.21...v3.4.22)
-==================
-
-* Fixed issue [#841](https://github.com/jakubpawlowicz/clean-css/issues/841) - disabled importing and files passed as array.
-* Ignores `@import` at-rules if appearing after any non-`@import` rules.
-
-[3.4.21 / 2016-11-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.20...v3.4.21)
-==================
-
-* Fixed issue [#821](https://github.com/jakubpawlowicz/clean-css/issues/821) - reducing non-adjacent rules.
-* Fixed issue [#830](https://github.com/jakubpawlowicz/clean-css/issues/830) - reordering border-* properties.
-* Fixed issue [#833](https://github.com/jakubpawlowicz/clean-css/issues/833) - moving `@media` queries.
-
-[3.4.20 / 2016-09-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.19...v3.4.20)
-==================
-
-* Fixed issue [#814](https://github.com/jakubpawlowicz/clean-css/issues/814) - `:selection` rule merging.
-
-[3.4.19 / 2016-07-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.18...v3.4.19)
-==================
-
-* Fixed issue [#795](https://github.com/jakubpawlowicz/clean-css/issues/795) - `!important` and override compacting.
-
-[3.4.18 / 2016-06-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.17...v3.4.18)
-==================
-
-* Fixed issue [#787](https://github.com/jakubpawlowicz/clean-css/issues/787) - regression in processing data URIs.
-
-[3.4.17 / 2016-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.16...v3.4.17)
-==================
-
-* Fixed issue [#783](https://github.com/jakubpawlowicz/clean-css/issues/783) - regression in processing data URIs.
-
-[3.4.16 / 2016-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.15...v3.4.16)
-==================
-
-* Fixed issue [#781](https://github.com/jakubpawlowicz/clean-css/issues/781) - regression in override compacting.
-* Fixed issue [#782](https://github.com/jakubpawlowicz/clean-css/issues/782) - regression in processing data URIs.
-
-[3.4.15 / 2016-06-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.14...v3.4.15)
-==================
-
-* Fixed issue [#776](https://github.com/jakubpawlowicz/clean-css/issues/776) - edge case in quoted data URIs.
-* Fixed issue [#779](https://github.com/jakubpawlowicz/clean-css/issues/779) - merging `background-(position|size)`.
-* Fixed issue [#780](https://github.com/jakubpawlowicz/clean-css/issues/780) - space after inlined variables.
-
-[3.4.14 / 2016-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.13...v3.4.14)
-==================
-
-* Fixed issue [#751](https://github.com/jakubpawlowicz/clean-css/issues/751) - stringifying CSS variables.
-* Fixed issue [#763](https://github.com/jakubpawlowicz/clean-css/issues/763) - data URI SVG and quoting.
-* Fixed issue [#765](https://github.com/jakubpawlowicz/clean-css/issues/765) - two values of border-radius.
-* Fixed issue [#768](https://github.com/jakubpawlowicz/clean-css/issues/768) - invalid border-radius property.
-
-[3.4.13 / 2016-05-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.12...v3.4.13)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/769) - Node.js 6.x support.
-
-[3.4.12 / 2016-04-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.11...v3.4.12)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/734) - `--root` option edge case.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - treats empty rule as unmergeable.
-
-[3.4.11 / 2016-04-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.10...v3.4.11)
-==================
-
-* Fixed issue [#738](https://github.com/jakubpawlowicz/clean-css/issues/738) - edge case in comment processing.
-* Fixed issue [#741](https://github.com/jakubpawlowicz/clean-css/issues/741) - HTTP proxy with HTTPS inlining.
-* Fixed issue [#743](https://github.com/jakubpawlowicz/clean-css/issues/743) - background shorthand and source maps.
-* Fixed issue [#745](https://github.com/jakubpawlowicz/clean-css/issues/745) - matching mixed case `!important`.
-
-[3.4.10 / 2016-02-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.9...v3.4.10)
-==================
-
-* Fixed issue [#735](https://github.com/jakubpawlowicz/clean-css/issues/735) - whitespace removal with escaped chars.
-
-[3.4.9 / 2016-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.8...v3.4.9)
-==================
-
-* Sped up merging by body advanced optimization.
-* Fixed issue [#693](https://github.com/jakubpawlowicz/clean-css/issues/693) - restructuring edge case.
-* Fixed issue [#711](https://github.com/jakubpawlowicz/clean-css/issues/711) - border fuzzy matching.
-* Fixed issue [#714](https://github.com/jakubpawlowicz/clean-css/issues/714) - stringifying property level at rules.
-* Fixed issue [#715](https://github.com/jakubpawlowicz/clean-css/issues/715) - stack too deep in comment scan.
-
-[3.4.8 / 2015-11-13](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.7...v3.4.8)
-==================
-
-* Fixed issue [#676](https://github.com/jakubpawlowicz/clean-css/issues/676) - fuzzy matching unqoted data URIs.
-
-[3.4.7 / 2015-11-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.6...v3.4.7)
-==================
-
-* Fixed issue [#692](https://github.com/jakubpawlowicz/clean-css/issues/692) - edge case in URL quoting.
-* Fixed issue [#695](https://github.com/jakubpawlowicz/clean-css/issues/695) - shorthand overriding edge case.
-* Fixed issue [#699](https://github.com/jakubpawlowicz/clean-css/issues/699) - IE9 transparent hack.
-* Fixed issue [#701](https://github.com/jakubpawlowicz/clean-css/issues/701) - `url` quoting with hash arguments.
-
-[3.4.6 / 2015-10-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.5...v3.4.6)
-==================
-
-* Fixed issue [#679](https://github.com/jakubpawlowicz/clean-css/issues/679) - wrong rebasing of remote URLs.
-
-[3.4.5 / 2015-09-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.4...v3.4.5)
-==================
-
-* Fixed issue [#681](https://github.com/jakubpawlowicz/clean-css/issues/681) - property inheritance & restructuring.
-* Fixed issue [#675](https://github.com/jakubpawlowicz/clean-css/issues/675) - overriding with `!important`.
-
-[3.4.4 / 2015-09-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.3...v3.4.4)
-==================
-
-* Fixed issue [#626](https://github.com/jakubpawlowicz/clean-css/issues/626) - edge case in import rebasing.
-* Fixed issue [#674](https://github.com/jakubpawlowicz/clean-css/issues/674) - adjacent merging order.
-
-[3.4.3 / 2015-09-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.2...v3.4.3)
-==================
-
-* Fixed issue [#668](https://github.com/jakubpawlowicz/clean-css/issues/668) - node v4 path.join.
-* Fixed issue [#669](https://github.com/jakubpawlowicz/clean-css/issues/669) - adjacent overriding with `!important`.
-
-[3.4.2 / 2015-09-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.1...v3.4.2)
-==================
-
-* Fixed issue [#598](https://github.com/jakubpawlowicz/clean-css/issues/598) - restructuring border properties.
-* Fixed issue [#654](https://github.com/jakubpawlowicz/clean-css/issues/654) - disables length optimizations.
-* Fixed issue [#655](https://github.com/jakubpawlowicz/clean-css/issues/655) - shorthands override merging.
-* Fixed issue [#660](https://github.com/jakubpawlowicz/clean-css/issues/660) - !important token overriding.
-* Fixed issue [#662](https://github.com/jakubpawlowicz/clean-css/issues/662) - !important selector reducing.
-* Fixed issue [#667](https://github.com/jakubpawlowicz/clean-css/issues/667) - rebasing remote URLs.
-
-[3.4.1 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.0...v3.4.1)
-==================
-
-* Fixed issue [#652](https://github.com/jakubpawlowicz/clean-css/issues/652) - order of restoring and removing tokens.
-
-[3.4.0 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.10...v3.4.0)
-==================
-
-* Adds an option for a fine-grained `@import` control.
-* Adds unit compatibility switches to disable length optimizations.
-* Adds inferring proxy settings from HTTP_PROXY environment variable.
-* Adds support for Polymer / Web Components special selectors.
-* Adds support for Polymer mixins.
-* Adds testing source maps in batch mode.
-* Unifies wrappers for simple & advanced optimizations.
-* Fixed issue [#596](https://github.com/jakubpawlowicz/clean-css/issues/596) - support for !ie IE<8 hack.
-* Fixed issue [#599](https://github.com/jakubpawlowicz/clean-css/issues/599) - support for inlined source maps.
-* Fixed issue [#607](https://github.com/jakubpawlowicz/clean-css/issues/607) - adds better rule reordering.
-* Fixed issue [#612](https://github.com/jakubpawlowicz/clean-css/issues/612) - adds HTTP proxy support.
-* Fixed issue [#618](https://github.com/jakubpawlowicz/clean-css/issues/618) - adds safer function validation.
-* Fixed issue [#625](https://github.com/jakubpawlowicz/clean-css/issues/625) - adds length unit optimizations.
-* Fixed issue [#632](https://github.com/jakubpawlowicz/clean-css/issues/632) - adds disabling remote `import`s.
-* Fixed issue [#635](https://github.com/jakubpawlowicz/clean-css/issues/635) - adds safer `0%` optimizations.
-* Fixed issue [#644](https://github.com/jakubpawlowicz/clean-css/issues/644) - adds time unit optimizations.
-* Fixed issue [#645](https://github.com/jakubpawlowicz/clean-css/issues/645) - adds bottom to top `media` merging.
-* Fixed issue [#648](https://github.com/jakubpawlowicz/clean-css/issues/648) - adds property level at-rule support.
-
-[3.3.10 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.9...v3.3.10)
-==================
-
-* Adds better comments + keepBreaks handling.
-* Adds better text normalizing in source maps mode.
-* Fixes non-adjacent optimizations for source maps.
-* Fixes removing unused items.
-* Improves `outline` break up with source maps.
-* Refixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-
-[3.3.9 / 2015-08-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.8...v3.3.9)
-==================
-
-* Fixed issue [#640](https://github.com/jakubpawlowicz/clean-css/issues/640) - URI processing regression.
-
-[3.3.8 / 2015-08-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.7...v3.3.8)
-==================
-
-* Fixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-* Fixed issue [#630](https://github.com/jakubpawlowicz/clean-css/issues/630) - vendor prefixed flex optimizations.
-* Fixed issue [#633](https://github.com/jakubpawlowicz/clean-css/issues/633) - handling data URI with brackets.
-* Fixed issue [#634](https://github.com/jakubpawlowicz/clean-css/issues/634) - merging :placeholder selectors.
-
-[3.3.7 / 2015-07-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.6...v3.3.7)
-==================
-
-* Fixed issue [#616](https://github.com/jakubpawlowicz/clean-css/issues/616) - ordering in restructuring.
-
-[3.3.6 / 2015-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.5...v3.3.6)
-==================
-
-* Fixed issue [#620](https://github.com/jakubpawlowicz/clean-css/issues/620) - `bold` style in font shorthands.
-
-[3.3.5 / 2015-07-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.4...v3.3.5)
-==================
-
-* Fixed issue [#608](https://github.com/jakubpawlowicz/clean-css/issues/608) - custom URI protocols handling.
-
-[3.3.4 / 2015-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.3...v3.3.4)
-==================
-
-* Fixed issue [#610](https://github.com/jakubpawlowicz/clean-css/issues/610) - `border:inherit` restoring.
-* Fixed issue [#611](https://github.com/jakubpawlowicz/clean-css/issues/611) - edge case in quote stripping.
-
-[3.3.3 / 2015-06-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.2...v3.3.3)
-==================
-
-* Fixed issue [#603](https://github.com/jakubpawlowicz/clean-css/issues/603) - IE suffix hack defaults to on.
-
-[3.3.2 / 2015-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.1...v3.3.2)
-==================
-
-* Fixed issue [#595](https://github.com/jakubpawlowicz/clean-css/issues/595) - more relaxed block matching.
-* Fixed issue [#601](https://github.com/jakubpawlowicz/clean-css/issues/601) - percentage minifying inside `flex`.
-* Fixed issue [#602](https://github.com/jakubpawlowicz/clean-css/issues/602) - backslash IE hacks after a space.
-
-[3.3.1 / 2015-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.0...v3.3.1)
-==================
-
-* Fixed issue [#590](https://github.com/jakubpawlowicz/clean-css/issues/590) - edge case in `@import` processing.
-
-[3.3.0 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.11...v3.3.0)
-==================
-
-* Cleans up url rebase code getting rid of unnecessary state.
-* Cleans up tokenizer code getting rid of unnecessary state.
-* Moves source maps tracker into lib/source-maps/track.
-* Moves tokenizer code into lib/tokenizer.
-* Moves URL scanner into lib/urls/reduce (was named incorrectly before).
-* Moves URL rebasing & rewriting into lib/urls.
-* Fixed issue [#375](https://github.com/jakubpawlowicz/clean-css/issues/375) - unit compatibility switches.
-* Fixed issue [#436](https://github.com/jakubpawlowicz/clean-css/issues/436) - refactors URI rewriting.
-* Fixed issue [#448](https://github.com/jakubpawlowicz/clean-css/issues/448) - rebasing no protocol URIs.
-* Fixed issue [#517](https://github.com/jakubpawlowicz/clean-css/issues/517) - turning off color optimizations.
-* Fixed issue [#542](https://github.com/jakubpawlowicz/clean-css/issues/542) - space after closing brace in IE.
-* Fixed issue [#562](https://github.com/jakubpawlowicz/clean-css/issues/562) - optimizing invalid color values.
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#570](https://github.com/jakubpawlowicz/clean-css/issues/570) - rebasing "no-url()" imports.
-* Fixed issue [#574](https://github.com/jakubpawlowicz/clean-css/issues/574) - rewriting internal URLs.
-* Fixed issue [#575](https://github.com/jakubpawlowicz/clean-css/issues/575) - missing directory as a `target`.
-* Fixed issue [#577](https://github.com/jakubpawlowicz/clean-css/issues/577) - `background-clip` into shorthand.
-* Fixed issue [#579](https://github.com/jakubpawlowicz/clean-css/issues/579) - `background-origin` into shorthand.
-* Fixed issue [#580](https://github.com/jakubpawlowicz/clean-css/issues/580) - mixed `@import` processing.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.11 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.10...v3.2.11)
-==================
-
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.10 / 2015-05-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.9...v3.2.10)
-==================
-
-* Fixed issue [#572](https://github.com/jakubpawlowicz/clean-css/issues/572) - empty elements removal.
-
-[3.2.9 / 2015-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.8...v3.2.9)
-==================
-
-* Fixed issue [#567](https://github.com/jakubpawlowicz/clean-css/issues/567) - merging colors as functions.
-
-[3.2.8 / 2015-05-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.7...v3.2.8)
-==================
-
-* Fixed issue [#561](https://github.com/jakubpawlowicz/clean-css/issues/561) - restructuring special selectors.
-
-[3.2.7 / 2015-05-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.6...v3.2.7)
-==================
-
-* Fixed issue [#551](https://github.com/jakubpawlowicz/clean-css/issues/551) - edge case in restructuring.
-* Fixed issue [#553](https://github.com/jakubpawlowicz/clean-css/issues/553) - another style of SVG fallback.
-* Fixed issue [#558](https://github.com/jakubpawlowicz/clean-css/issues/558) - units in same selector merging.
-
-[3.2.6 / 2015-04-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.5...v3.2.6)
-==================
-
-* Fixed issue [#550](https://github.com/jakubpawlowicz/clean-css/issues/550) - proper `contentSources` tracking.
-* Fixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - regression in IE backslash hacks.
-
-[3.2.5 / 2015-04-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.4...v3.2.5)
-==================
-
-* Fixed issue [#543](https://github.com/jakubpawlowicz/clean-css/issues/543) - better "comment in body" handling.
-* Fixed issue [#548](https://github.com/jakubpawlowicz/clean-css/issues/548) - regression in font minifying.
-* Fixed issue [#549](https://github.com/jakubpawlowicz/clean-css/issues/549) - special comments in source maps.
-
-[3.2.4 / 2015-04-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.3...v3.2.4)
-==================
-
-* Fixed issue [#544](https://github.com/jakubpawlowicz/clean-css/issues/544) - regression in same value merging.
-* Fixed issue [#546](https://github.com/jakubpawlowicz/clean-css/issues/546) - IE<11 `calc()` issue.
-
-[3.2.3 / 2015-04-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.2...v3.2.3)
-==================
-
-* Fixed issue [#541](https://github.com/jakubpawlowicz/clean-css/issues/541) - `outline-style:auto` in shorthand.
-
-[3.2.2 / 2015-04-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.1...v3.2.2)
-==================
-
-* Fixed issue [#537](https://github.com/jakubpawlowicz/clean-css/issues/537) - regression in simple optimizer.
-
-[3.2.1 / 2015-04-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.0...v3.2.1)
-==================
-
-* Fixed issue [#534](https://github.com/jakubpawlowicz/clean-css/issues/534) - wrong `@font-face` stringifying.
-
-[3.2.0 / 2015-04-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.9...v3.2.0)
-==================
-
-* Bumps commander to 2.8.x.
-* Fixes remote asset rebasing when passing data as a hash.
-* Improves path resolution inside source maps.
-* Makes `root` option implicitely default to `process.cwd()`.
-* Fixed issue [#371](https://github.com/jakubpawlowicz/clean-css/issues/371) - `background` fallback with `none`.
-* Fixed issue [#376](https://github.com/jakubpawlowicz/clean-css/issues/376) - option to disable `0[unit]` -> `0`.
-* Fixed issue [#396](https://github.com/jakubpawlowicz/clean-css/issues/396) - better input source maps tracking.
-* Fixed issue [#397](https://github.com/jakubpawlowicz/clean-css/issues/397) - support for source map sources.
-* Fixed issue [#399](https://github.com/jakubpawlowicz/clean-css/issues/399) - support compacting with source maps.
-* Fixed issue [#429](https://github.com/jakubpawlowicz/clean-css/issues/429) - unifies data tokenization.
-* Fixed issue [#446](https://github.com/jakubpawlowicz/clean-css/issues/446) - `list-style` fuzzy matching.
-* Fixed issue [#468](https://github.com/jakubpawlowicz/clean-css/issues/468) - bumps `source-map` to 0.4.x.
-* Fixed issue [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - extracting uppercase property names.
-* Fixed issue [#487](https://github.com/jakubpawlowicz/clean-css/issues/487) - source map paths under Windows.
-* Fixed issue [#490](https://github.com/jakubpawlowicz/clean-css/issues/490) - vendor prefixed multivalue `background`.
-* Fixed issue [#500](https://github.com/jakubpawlowicz/clean-css/issues/500) - merging duplicate adjacent properties.
-* Fixed issue [#504](https://github.com/jakubpawlowicz/clean-css/issues/504) - keeping `url()` quotes.
-* Fixed issue [#507](https://github.com/jakubpawlowicz/clean-css/issues/507) - merging longhands into many shorthands.
-* Fixed issue [#508](https://github.com/jakubpawlowicz/clean-css/issues/508) - removing duplicate media queries.
-* Fixed issue [#521](https://github.com/jakubpawlowicz/clean-css/issues/521) - unit optimizations inside `calc()`.
-* Fixed issue [#524](https://github.com/jakubpawlowicz/clean-css/issues/524) - timeouts in `@import` inlining.
-* Fixed issue [#526](https://github.com/jakubpawlowicz/clean-css/issues/526) - shorthand overriding into a function.
-* Fixed issue [#528](https://github.com/jakubpawlowicz/clean-css/issues/528) - better support for IE<9 hacks.
-* Fixed issue [#529](https://github.com/jakubpawlowicz/clean-css/issues/529) - wrong font weight minification.
-
-[3.1.9 / 2015-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.8...v3.1.9)
-==================
-
-* Fixes issue [#511](https://github.com/jakubpawlowicz/clean-css/issues/511) - `)` advanced processing.
-
-[3.1.8 / 2015-03-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.7...v3.1.8)
-==================
-
-* Fixes issue [#498](https://github.com/jakubpawlowicz/clean-css/issues/498) - reordering and flexbox.
-* Fixes issue [#499](https://github.com/jakubpawlowicz/clean-css/issues/499) - too aggressive `-` removal.
-
-[3.1.7 / 2015-03-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.6...v3.1.7)
-==================
-
-* Backports fix to [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - reordering and uppercase properties.
-* Fixes issue [#496](https://github.com/jakubpawlowicz/clean-css/issues/496) - space after bracket removal.
-
-[3.1.6 / 2015-03-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.5...v3.1.6)
-==================
-
-* Fixes issue [#489](https://github.com/jakubpawlowicz/clean-css/issues/489) - `AlphaImageLoader` IE filter.
-
-[3.1.5 / 2015-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.4...v3.1.5)
-==================
-
-* Fixes issue [#483](https://github.com/jakubpawlowicz/clean-css/issues/483) - property order in restructuring.
-
-[3.1.4 / 2015-03-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.3...v3.1.4)
-==================
-
-* Fixes issue [#472](https://github.com/jakubpawlowicz/clean-css/issues/472) - broken function minification.
-* Fixes issue [#477](https://github.com/jakubpawlowicz/clean-css/issues/477) - `@import`s order in restructuring.
-* Fixes issue [#478](https://github.com/jakubpawlowicz/clean-css/issues/478) - ultimate fix to brace whitespace.
-
-[3.1.3 / 2015-03-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.2...v3.1.3)
-==================
-
-* Fixes issue [#464](https://github.com/jakubpawlowicz/clean-css/issues/464) - data URI with quoted braces.
-* Fixes issue [#475](https://github.com/jakubpawlowicz/clean-css/issues/475) - whitespace after closing brace.
-
-[3.1.2 / 2015-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.1...v3.1.2)
-==================
-
-* Refixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-* Fixes issue [#466](https://github.com/jakubpawlowicz/clean-css/issues/466) - rebuilding background shorthand.
-* Fixes issue [#462](https://github.com/jakubpawlowicz/clean-css/issues/462) - escaped apostrophes in selectors.
-
-[3.1.1 / 2015-02-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.0...v3.1.1)
-==================
-
-* Fixed issue [#469](https://github.com/jakubpawlowicz/clean-css/issues/469) - extracting broken property.
-* Fixed issue [#470](https://github.com/jakubpawlowicz/clean-css/issues/470) - negative padding removal.
-* Fixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-
-[3.1.0 / 2015-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.10...v3.1.0)
-==================
-
-* Adds `0deg` to `0` minification where possible.
-* Adds better non-adjacent selector merging when body is the same.
-* Adds official support for node.js 0.12.
-* Adds official support for io.js 1.0.
-* Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
-* Fixed issue [#158](https://github.com/jakubpawlowicz/clean-css/issues/158) - adds body-based selectors reduction.
-* Fixed issue [#182](https://github.com/jakubpawlowicz/clean-css/issues/182) - removing space after closing brace.
-* Fixed issue [#204](https://github.com/jakubpawlowicz/clean-css/issues/204) - `@media` merging.
-* Fixed issue [#351](https://github.com/jakubpawlowicz/clean-css/issues/351) - remote `@import`s after content.
-* Fixed issue [#357](https://github.com/jakubpawlowicz/clean-css/issues/357) - non-standard but valid URLs.
-* Fixed issue [#416](https://github.com/jakubpawlowicz/clean-css/issues/416) - accepts hash as `minify` argument.
-* Fixed issue [#419](https://github.com/jakubpawlowicz/clean-css/issues/419) - multiple input source maps.
-* Fixed issue [#435](https://github.com/jakubpawlowicz/clean-css/issues/435) - `background-clip` in shorthand.
-* Fixed issue [#439](https://github.com/jakubpawlowicz/clean-css/issues/439) - `background-origin` in shorthand.
-* Fixed issue [#442](https://github.com/jakubpawlowicz/clean-css/issues/442) - space before adjacent `nav`.
-* Fixed issue [#445](https://github.com/jakubpawlowicz/clean-css/issues/445) - regression issue in url processor.
-* Fixed issue [#449](https://github.com/jakubpawlowicz/clean-css/issues/449) - warns of missing close braces.
-* Fixed issue [#463](https://github.com/jakubpawlowicz/clean-css/issues/463) - relative remote `@import` URLs.
-
-[3.0.10 / 2015-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.9...v3.0.10)
-==================
-
-* Fixed issue [#453](https://github.com/jakubpawlowicz/clean-css/issues/453) - double `background-repeat`.
-* Fixed issue [#455](https://github.com/jakubpawlowicz/clean-css/issues/455) - property extracting regression.
-
-[3.0.9 / 2015-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.8...v3.0.9)
-==================
-
-* Fixed issue [#452](https://github.com/jakubpawlowicz/clean-css/issues/452) - regression in advanced merging.
-
-[3.0.8 / 2015-01-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.7...v3.0.8)
-==================
-
-* Fixed issue [#447](https://github.com/jakubpawlowicz/clean-css/issues/447) - `background-color` in shorthands.
-* Fixed issue [#450](https://github.com/jakubpawlowicz/clean-css/issues/450) - name to hex color converting.
-
-[3.0.7 / 2015-01-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.6...v3.0.7)
-==================
-
-* Fixed issue [#441](https://github.com/jakubpawlowicz/clean-css/issues/441) - hex to name color converting.
-
-[3.0.6 / 2015-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.5...v3.0.6)
-==================
-
-* Refixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-
-[3.0.5 / 2015-01-18](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.4...v3.0.5)
-==================
-
-* Fixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-* Fixed issue [#433](https://github.com/jakubpawlowicz/clean-css/issues/433) - meging `!important` in shorthands.
-
-[3.0.4 / 2015-01-11](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.3...v3.0.4)
-==================
-
-* Fixed issue [#314](https://github.com/jakubpawlowicz/clean-css/issues/314) - spaces inside `calc`.
-
-[3.0.3 / 2015-01-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.2...v3.0.3)
-==================
-
-* Just a version bump as npm incorrectly things 2.2.23 is the latest one.
-
-[3.0.2 / 2015-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.1...v3.0.2)
-==================
-
-* Fixed issue [#422](https://github.com/jakubpawlowicz/clean-css/issues/422) - handling `calc` as a unit.
-
-[3.0.1 / 2014-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.0...v3.0.1)
-==================
-
-* Fixed issue [#410](https://github.com/jakubpawlowicz/clean-css/issues/410) - advanced merging and comments.
-* Fixed issue [#411](https://github.com/jakubpawlowicz/clean-css/issues/411) - properties and important comments.
-
-[3.0.0 / 2014-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.22...v3.0.0)
-==================
-
-* Adds more granular control over compatibility settings.
-* Adds support for @counter-style at-rule.
-* Adds `--source-map`/`sourceMap` switch for building input's source map.
-* Adds `--skip-shorthand-compacting`/`shorthandComacting` option for disabling shorthand compacting.
-* Allows `target` option to be a path to a folder instead of a file.
-* Allows disabling rounding precision. By [@superlukas](https://github.com/superlukas).
-* Breaks 2.x compatibility for using CleanCSS as a function.
-* Changes `minify` method output to handle multiple outputs.
-* Reworks minification to tokenize first then minify.
- See [changes](https://github.com/jakubpawlowicz/clean-css/compare/b06f37d...dd8c14a).
-* Removes support for node.js 0.8.x.
-* Renames `noAdvanced` option into `advanced`.
-* Renames `noAggressiveMerging` option into `aggressiveMerging`.
-* Renames `noRebase` option into `rebase`.
-* Speeds up advanced processing by shortening optimize loop.
-* Fixed issue [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) - source maps!
-* Fixed issue [#344](https://github.com/jakubpawlowicz/clean-css/issues/344) - merging `background-size` into shorthand.
-* Fixed issue [#352](https://github.com/jakubpawlowicz/clean-css/issues/352) - honors rebasing in imported stylesheets.
-* Fixed issue [#360](https://github.com/jakubpawlowicz/clean-css/issues/360) - adds 7 extra CSS colors.
-* Fixed issue [#363](https://github.com/jakubpawlowicz/clean-css/issues/363) - `rem` units overriding `px`.
-* Fixed issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - proper `background` shorthand merging.
-* Fixed issue [#395](https://github.com/jakubpawlowicz/clean-css/issues/395) - unescaped brackets in data URIs.
-* Fixed issue [#398](https://github.com/jakubpawlowicz/clean-css/issues/398) - restoring important comments.
-* Fixed issue [#400](https://github.com/jakubpawlowicz/clean-css/issues/400) - API to accept an array of filenames.
-* Fixed issue [#403](https://github.com/jakubpawlowicz/clean-css/issues/403) - tracking input files in source maps.
-* Fixed issue [#404](https://github.com/jakubpawlowicz/clean-css/issues/404) - no state sharing in API.
-* Fixed issue [#405](https://github.com/jakubpawlowicz/clean-css/issues/405) - disables default `background-size` merging.
-* Refixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.22 / 2014-12-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.21...v2.2.22)
-==================
-
-* Backports fix to issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.21 / 2014-12-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.20...v2.2.21)
-==================
-
-* Backports fix to issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - `background` shorthand merging.
-
-[2.2.20 / 2014-12-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.19...v2.2.20)
-==================
-
-* Backports fix to issue [#390](https://github.com/jakubpawlowicz/clean-css/issues/390) - pseudo-class merging.
-
-[2.2.19 / 2014-11-20](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.18...v2.2.19)
-==================
-
-* Fixed issue [#385](https://github.com/jakubpawlowicz/clean-css/issues/385) - edge cases in processing cut off data.
-
-[2.2.18 / 2014-11-17](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.17...v2.2.18)
-==================
-
-* Fixed issue [#383](https://github.com/jakubpawlowicz/clean-css/issues/383) - rounding fractions once again.
-
-[2.2.17 / 2014-11-09](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.16...v2.2.17)
-==================
-
-* Fixed issue [#380](https://github.com/jakubpawlowicz/clean-css/issues/380) - rounding fractions to a whole number.
-
-[2.2.16 / 2014-09-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.15...v2.2.16)
-==================
-
-* Fixed issue [#359](https://github.com/jakubpawlowicz/clean-css/issues/359) - handling escaped double backslash.
-* Fixed issue [#358](https://github.com/jakubpawlowicz/clean-css/issues/358) - property merging in compatibility mode.
-* Fixed issue [#356](https://github.com/jakubpawlowicz/clean-css/issues/356) - preserving `*+html` hack.
-* Fixed issue [#354](https://github.com/jakubpawlowicz/clean-css/issues/354) - `!important` overriding in shorthands.
-
-[2.2.15 / 2014-09-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.14...v2.2.15)
-==================
-
-* Fixed issue [#343](https://github.com/jakubpawlowicz/clean-css/issues/343) - too aggressive `rgba`/`hsla` minification.
-* Fixed issue [#345](https://github.com/jakubpawlowicz/clean-css/issues/345) - URL rebasing for document relative ones.
-* Fixed issue [#346](https://github.com/jakubpawlowicz/clean-css/issues/346) - overriding `!important` by `!important`.
-* Fixed issue [#350](https://github.com/jakubpawlowicz/clean-css/issues/350) - edge cases in `@import` processing.
-
-[2.2.14 / 2014-08-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.13...v2.2.14)
-==================
-
-* Makes multival operations idempotent.
-* Fixed issue [#339](https://github.com/jakubpawlowicz/clean-css/issues/339) - skips invalid properties.
-* Fixed issue [#341](https://github.com/jakubpawlowicz/clean-css/issues/341) - ensure output is shorter than input.
-
-[2.2.13 / 2014-08-12](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.12...v2.2.13)
-==================
-
-* Fixed issue [#337](https://github.com/jakubpawlowicz/clean-css/issues/337) - handling component importance.
-
-[2.2.12 / 2014-08-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.11...v2.2.12)
-==================
-
-* Fixed issue with tokenizer removing first selector after an unknown @ rule.
-* Fixed issue [#329](https://github.com/jakubpawlowicz/clean-css/issues/329) - `font` shorthands incorrectly processed.
-* Fixed issue [#332](https://github.com/jakubpawlowicz/clean-css/issues/332) - `background` shorthand with colors.
-* Refixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - invalid charset declarations.
-
-[2.2.11 / 2014-07-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.10...v2.2.11)
-==================
-
-* Fixed issue [#326](https://github.com/jakubpawlowicz/clean-css/issues/326) - `background-size` regression.
-
-[2.2.10 / 2014-07-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.9...v2.2.10)
-==================
-
-* Improved performance of advanced mode validators.
-* Fixed issue [#307](https://github.com/jakubpawlowicz/clean-css/issues/307) - `background-color` in multiple backgrounds.
-* Fixed issue [#322](https://github.com/jakubpawlowicz/clean-css/issues/322) - adds `background-size` support.
-* Fixed issue [#323](https://github.com/jakubpawlowicz/clean-css/issues/323) - stripping variable references.
-* Fixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - removing invalid `@charset` declarations.
-
-[2.2.9 / 2014-07-23](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.8...v2.2.9)
-==================
-
-* Adds `background` normalization according to W3C spec.
-* Fixed issue [#316](https://github.com/jakubpawlowicz/clean-css/issues/316) - incorrect `background` processing.
-
-[2.2.8 / 2014-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.7...v2.2.8)
-==================
-
-* Fixed issue [#313](https://github.com/jakubpawlowicz/clean-css/issues/313) - processing comment marks in URLs.
-* Fixed issue [#315](https://github.com/jakubpawlowicz/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
-
-[2.2.7 / 2014-07-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.6...v2.2.7)
-==================
-
-* Fixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - merging multiple backgrounds.
-* Fixed issue [#312](https://github.com/jakubpawlowicz/clean-css/issues/312) - merging with mixed repeat.
-
-[2.2.6 / 2014-07-05](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.5...v2.2.6)
-==================
-
-* Adds faster quote matching in QuoteScanner.
-* Improves QuoteScanner to handle comments correctly.
-* Fixed issue [#308](https://github.com/jakubpawlowicz/clean-css/issues/308) - parsing comments in quoted URLs.
-* Fixed issue [#311](https://github.com/jakubpawlowicz/clean-css/issues/311) - leading/trailing decimal points.
-
-[2.2.5 / 2014-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.4...v2.2.5)
-==================
-
-* Adds removing extra spaces around / in border-radius.
-* Adds replacing same horizontal & vertical value in border-radius.
-* Fixed issue [#305](https://github.com/jakubpawlowicz/clean-css/issues/305) - allows width keywords in `border-width`.
-
-[2.2.4 / 2014-06-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.3...v2.2.4)
-==================
-
-* Fixed issue [#301](https://github.com/jakubpawlowicz/clean-css/issues/301) - proper `border-radius` processing.
-* Fixed issue [#303](https://github.com/jakubpawlowicz/clean-css/issues/303) - correctly preserves viewport units.
-
-[2.2.3 / 2014-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.2...v2.2.3)
-==================
-
-* Fixed issue [#302](https://github.com/jakubpawlowicz/clean-css/issues/302) - handling of `outline-style: auto`.
-
-[2.2.2 / 2014-06-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.1...v2.2.2)
-==================
-
-* Fixed issue [#297](https://github.com/jakubpawlowicz/clean-css/issues/297) - `box-shadow` zeros minification.
-
-[2.2.1 / 2014-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.0...v2.2.1)
-==================
-
-* Fixes new property optimizer for 'none' values.
-* Fixed issue [#294](https://github.com/jakubpawlowicz/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
-
-[2.2.0 / 2014-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.8...v2.2.0)
-==================
-
-* Adds a better algorithm for quotation marks' removal.
-* Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer.
-* Adds minifying remote files directly from CLI.
-* Adds `--rounding-precision` to control rounding precision.
-* Moves quotation matching into a `QuoteScanner` class.
-* Adds `npm run browserify` for creating embeddable version of clean-css.
-* Fixed list-style-* advanced processing.
-* Fixed issue [#134](https://github.com/jakubpawlowicz/clean-css/issues/134) - merges properties into shorthand form.
-* Fixed issue [#164](https://github.com/jakubpawlowicz/clean-css/issues/164) - removes default values if not needed.
-* Fixed issue [#168](https://github.com/jakubpawlowicz/clean-css/issues/168) - adds better property merging algorithm.
-* Fixed issue [#173](https://github.com/jakubpawlowicz/clean-css/issues/173) - merges same properties if grouped.
-* Fixed issue [#184](https://github.com/jakubpawlowicz/clean-css/issues/184) - uses `!important` for optimization opportunities.
-* Fixed issue [#190](https://github.com/jakubpawlowicz/clean-css/issues/190) - uses shorthand to override another shorthand.
-* Fixed issue [#197](https://github.com/jakubpawlowicz/clean-css/issues/197) - adds borders merging by understandability.
-* Fixed issue [#210](https://github.com/jakubpawlowicz/clean-css/issues/210) - adds temporary workaround for aggressive merging.
-* Fixed issue [#246](https://github.com/jakubpawlowicz/clean-css/issues/246) - removes IE hacks when not in compatibility mode.
-* Fixed issue [#247](https://github.com/jakubpawlowicz/clean-css/issues/247) - removes deprecated `selectorsMergeMode` switch.
-* Refixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - based on new quotation marks removal.
-* Fixed issue [#257](https://github.com/jakubpawlowicz/clean-css/issues/257) - turns `rgba`/`hsla` to `transparent` if possible.
-* Fixed issue [#265](https://github.com/jakubpawlowicz/clean-css/issues/265) - adds support for multiple input files.
-* Fixed issue [#275](https://github.com/jakubpawlowicz/clean-css/issues/275) - handling transform properties.
-* Fixed issue [#276](https://github.com/jakubpawlowicz/clean-css/issues/276) - corrects unicode handling.
-* Fixed issue [#288](https://github.com/jakubpawlowicz/clean-css/issues/288) - adds smarter expression parsing.
-* Fixed issue [#293](https://github.com/jakubpawlowicz/clean-css/issues/293) - handles escaped `@` symbols in class names and IDs.
-
-[2.1.8 / 2014-03-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.7...v2.1.8)
-==================
-
-* Fixed issue [#267](https://github.com/jakubpawlowicz/clean-css/issues/267) - incorrect non-adjacent selector merging.
-
-[2.1.7 / 2014-03-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.6...v2.1.7)
-==================
-
-* Fixed issue [#264](https://github.com/jakubpawlowicz/clean-css/issues/264) - `@import` statements inside comments.
-
-[2.1.6 / 2014-03-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.5...v2.1.6)
-==================
-
-* Fixed issue [#258](https://github.com/jakubpawlowicz/clean-css/issues/258) - wrong `@import` handling in `EmptyRemoval`.
-
-[2.1.5 / 2014-03-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.4...v2.1.5)
-==================
-
-* Fixed issue [#255](https://github.com/jakubpawlowicz/clean-css/issues/255) - incorrect processing of a trailing `-0`.
-
-[2.1.4 / 2014-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.3...v2.1.4)
-==================
-
-* Fixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - correctly handle JSON data in quotations.
-
-[2.1.3 / 2014-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.2...v2.1.3)
-==================
-
-* Fixed issue [#248](https://github.com/jakubpawlowicz/clean-css/issues/248) - incorrect merging for vendor selectors.
-
-[2.1.2 / 2014-02-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.1...v2.1.2)
-==================
-
-* Fixed issue [#245](https://github.com/jakubpawlowicz/clean-css/issues/245) - incorrect handling of backslash IE hack.
-
-[2.1.1 / 2014-02-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.0...v2.1.1)
-==================
-
-* Adds faster selectors processing in advanced optimizer.
-* Fixed issue [#241](https://github.com/jakubpawlowicz/clean-css/issues/241) - incorrect handling of `:not()` selectors.
-
-[2.1.0 / 2014-02-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.8...v2.1.0)
-==================
-
-* Adds an optional callback to minify method.
-* Deprecates `--selectors-merge-mode` / `selectorsMergeMode` in favor to `--compatibility` / `compatibility`.
-* Fixes debug mode stats for stylesheets using `@import` statements.
-* Skips empty removal if advanced processing is enabled.
-* Fixed issue [#85](https://github.com/jakubpawlowicz/clean-css/issues/85) - resolving protocol `@import`s.
-* Fixed issue [#160](https://github.com/jakubpawlowicz/clean-css/issues/160) - re-runs optimizer until a clean pass.
-* Fixed issue [#161](https://github.com/jakubpawlowicz/clean-css/issues/161) - improves tokenizer performance.
-* Fixed issue [#163](https://github.com/jakubpawlowicz/clean-css/issues/163) - round pixels to 2nd decimal place.
-* Fixed issue [#165](https://github.com/jakubpawlowicz/clean-css/issues/165) - extra space after trailing parenthesis.
-* Fixed issue [#186](https://github.com/jakubpawlowicz/clean-css/issues/186) - strip unit from `0rem`.
-* Fixed issue [#207](https://github.com/jakubpawlowicz/clean-css/issues/207) - bug in parsing protocol `@import`s.
-* Fixed issue [#213](https://github.com/jakubpawlowicz/clean-css/issues/213) - faster `rgb` to `hex` transforms.
-* Fixed issue [#215](https://github.com/jakubpawlowicz/clean-css/issues/215) - leading zeros in numerical values.
-* Fixed issue [#217](https://github.com/jakubpawlowicz/clean-css/issues/217) - whitespace inside attribute selectors and URLs.
-* Fixed issue [#218](https://github.com/jakubpawlowicz/clean-css/issues/218) - `@import` statements cleanup.
-* Fixed issue [#220](https://github.com/jakubpawlowicz/clean-css/issues/220) - selector between comments.
-* Fixed issue [#223](https://github.com/jakubpawlowicz/clean-css/issues/223) - two-pass adjacent selectors merging.
-* Fixed issue [#226](https://github.com/jakubpawlowicz/clean-css/issues/226) - don't minify `border:none` to `border:0`.
-* Fixed issue [#229](https://github.com/jakubpawlowicz/clean-css/issues/229) - improved processing of fraction numbers.
-* Fixed issue [#230](https://github.com/jakubpawlowicz/clean-css/issues/230) - better handling of zero values.
-* Fixed issue [#235](https://github.com/jakubpawlowicz/clean-css/issues/235) - IE7 compatibility mode.
-* Fixed issue [#236](https://github.com/jakubpawlowicz/clean-css/issues/236) - incorrect rebasing with nested `import`s.
-
-[2.0.8 / 2014-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.7...v2.0.8)
-==================
-
-* Fixed issue [#232](https://github.com/jakubpawlowicz/clean-css/issues/232) - edge case in non-adjacent selectors merging.
-
-[2.0.7 / 2014-01-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.6...v2.0.7)
-==================
-
-* Fixed issue [#208](https://github.com/jakubpawlowicz/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
-
-[2.0.6 / 2014-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.5...v2.0.6)
-==================
-
-* Fixed issue [#198](https://github.com/jakubpawlowicz/clean-css/issues/198) - process comments and `@import`s correctly.
-* Fixed issue [#205](https://github.com/jakubpawlowicz/clean-css/issues/205) - freeze on broken `@import` declaration.
-
-[2.0.5 / 2014-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.4...v2.0.5)
-==================
-
-* Fixed issue [#199](https://github.com/jakubpawlowicz/clean-css/issues/199) - keep line breaks with no advanced optimizations.
-* Fixed issue [#203](https://github.com/jakubpawlowicz/clean-css/issues/203) - Buffer as a first argument to minify method.
-
-[2.0.4 / 2013-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.3...v2.0.4)
-==================
-
-* Fixed issue [#193](https://github.com/jakubpawlowicz/clean-css/issues/193) - HSL color space normalization.
-
-[2.0.3 / 2013-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.2...v2.0.3)
-==================
-
-* Fixed issue [#191](https://github.com/jakubpawlowicz/clean-css/issues/191) - leading numbers in `font`/`animation` names.
-* Fixed issue [#192](https://github.com/jakubpawlowicz/clean-css/issues/192) - many `@import`s inside a comment.
-
-[2.0.2 / 2013-11-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.1...v2.0.2)
-==================
-
-* Fixed issue [#177](https://github.com/jakubpawlowicz/clean-css/issues/177) - process broken content correctly.
-
-[2.0.1 / 2013-11-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.0...v2.0.1)
-==================
-
-* Fixed issue [#176](https://github.com/jakubpawlowicz/clean-css/issues/176) - hangs on `undefined` keyword.
-
-[2.0.0 / 2013-11-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.7...v2.0.0)
-==================
-
-* Adds simplified and more advanced text escaping / restoring via `EscapeStore` class.
-* Adds simplified and much faster empty elements removal.
-* Adds missing `@import` processing to our benchmark (run via `npm run bench`).
-* Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors.
-* Adds basic optimizer removing duplicate selectors from a list.
-* Adds merging duplicate properties within a single selector's body.
-* Adds merging adjacent selectors within a scope (single and multiple ones).
-* Changes behavior of `--keep-line-breaks`/`keepBreaks` option to keep breaks after trailing braces only.
-* Makes all multiple selectors ordered alphabetically (aids merging).
-* Adds property overriding so more coarse properties override more granular ones.
-* Adds reducing non-adjacent selectors.
-* Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations.
-* Adds reducing non-adjacent selectors when overridden by more complex selectors.
-* Fixed issue [#138](https://github.com/jakubpawlowicz/clean-css/issues/138) - makes CleanCSS interface OO.
-* Fixed issue [#139](https://github.com/jakubpawlowicz/clean-css/issues/138) - consistent error & warning handling.
-* Fixed issue [#145](https://github.com/jakubpawlowicz/clean-css/issues/145) - debug mode in library too.
-* Fixed issue [#157](https://github.com/jakubpawlowicz/clean-css/issues/157) - gets rid of `removeEmpty` option.
-* Fixed issue [#159](https://github.com/jakubpawlowicz/clean-css/issues/159) - escaped quotes inside content.
-* Fixed issue [#162](https://github.com/jakubpawlowicz/clean-css/issues/162) - strip quotes from Base64 encoded URLs.
-* Fixed issue [#166](https://github.com/jakubpawlowicz/clean-css/issues/166) - `debug` formatting in CLI
-* Fixed issue [#167](https://github.com/jakubpawlowicz/clean-css/issues/167) - `background:transparent` minification.
-
-[1.1.7 / 2013-10-28](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.6...v1.1.7)
-==================
-
-* Fixed issue [#156](https://github.com/jakubpawlowicz/clean-css/issues/156) - `@import`s inside comments.
-
-[1.1.6 / 2013-10-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.5...v1.1.6)
-==================
-
-* Fixed issue [#155](https://github.com/jakubpawlowicz/clean-css/issues/155) - broken irregular CSS content.
-
-[1.1.5 / 2013-10-24](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.4...v1.1.5)
-==================
-
-* Fixed issue [#153](https://github.com/jakubpawlowicz/clean-css/issues/153) - `keepSpecialComments` `0`/`1` as a string.
-
-[1.1.4 / 2013-10-23](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.3...v1.1.4)
-==================
-
-* Fixed issue [#152](https://github.com/jakubpawlowicz/clean-css/issues/152) - adds an option to disable rebasing.
-
-[1.1.3 / 2013-10-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.2...v1.1.3)
-==================
-
-* Fixed issue [#150](https://github.com/jakubpawlowicz/clean-css/issues/150) - minifying `background:none`.
-
-[1.1.2 / 2013-09-29](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.1...v1.1.2)
-==================
-
-* Fixed issue [#149](https://github.com/jakubpawlowicz/clean-css/issues/149) - shorthand `font` property.
-
-[1.1.1 / 2013-09-07](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.0...v1.1.1)
-==================
-
-* Fixed issue [#144](https://github.com/jakubpawlowicz/clean-css/issues/144) - skip URLs rebasing by default.
-
-[1.1.0 / 2013-09-06](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.12...v1.1.0)
-==================
-
-* Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking.
-* Added simplified comments processing & imports.
-* Fixed issue [#43](https://github.com/jakubpawlowicz/clean-css/issues/43) - `--debug` switch for minification stats.
-* Fixed issue [#65](https://github.com/jakubpawlowicz/clean-css/issues/65) - full color name / hex shortening.
-* Fixed issue [#84](https://github.com/jakubpawlowicz/clean-css/issues/84) - support for `@import` with media queries.
-* Fixed issue [#124](https://github.com/jakubpawlowicz/clean-css/issues/124) - raise error on broken imports.
-* Fixed issue [#126](https://github.com/jakubpawlowicz/clean-css/issues/126) - proper CSS expressions handling.
-* Fixed issue [#129](https://github.com/jakubpawlowicz/clean-css/issues/129) - rebasing imported URLs.
-* Fixed issue [#130](https://github.com/jakubpawlowicz/clean-css/issues/130) - better code modularity.
-* Fixed issue [#135](https://github.com/jakubpawlowicz/clean-css/issues/135) - require node.js 0.8+.
-
-[1.0.12 / 2013-07-19](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.11...v1.0.12)
-===================
-
-* Fixed issue [#121](https://github.com/jakubpawlowicz/clean-css/issues/121) - ability to skip `@import` processing.
-
-[1.0.11 / 2013-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.10...v1.0.11)
-===================
-
-* Fixed issue [#117](https://github.com/jakubpawlowicz/clean-css/issues/117) - line break escaping in comments.
-
-[1.0.10 / 2013-06-13](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.9...v1.0.10)
-===================
-
-* Fixed issue [#114](https://github.com/jakubpawlowicz/clean-css/issues/114) - comments in imported stylesheets.
-
-[1.0.9 / 2013-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.8...v1.0.9)
-==================
-
-* Fixed issue [#113](https://github.com/jakubpawlowicz/clean-css/issues/113) - `@import` in comments.
-
-[1.0.8 / 2013-06-10](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.7...v1.0.8)
-==================
-
-* Fixed issue [#112](https://github.com/jakubpawlowicz/clean-css/issues/112) - reducing `box-shadow` zeros.
-
-[1.0.7 / 2013-06-05](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.6...v1.0.7)
-==================
-
-* Support for `@import` URLs starting with `//`. By [@petetak](https://github.com/petetak).
-
-[1.0.6 / 2013-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.5...v1.0.6)
-==================
-
-* Fixed issue [#110](https://github.com/jakubpawlowicz/clean-css/issues/110) - data URIs in URLs.
-
-[1.0.5 / 2013-05-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.4...v1.0.5)
-==================
-
-* Fixed issue [#107](https://github.com/jakubpawlowicz/clean-css/issues/107) - data URIs in imported stylesheets.
-
-1.0.4 / 2013-05-23
-==================
-
-* Rewrite relative URLs in imported stylesheets. By [@bluej100](https://github.com/bluej100).
-
-1.0.3 / 2013-05-20
-==================
-
-* Support alternative `@import` syntax with file name not wrapped inside `url()` statement.
- By [@bluej100](https://github.com/bluej100).
-
-1.0.2 / 2013-04-29
-==================
-
-* Fixed issue [#97](https://github.com/jakubpawlowicz/clean-css/issues/97) - `--remove-empty` & FontAwesome.
-
-1.0.1 / 2013-04-08
-==================
-
-* Do not pick up `bench` and `test` while building `npm` package.
- By [@sindresorhus](https://https://github.com/sindresorhus).
-
-1.0.0 / 2013-03-30
-==================
-
-* Fixed issue [#2](https://github.com/jakubpawlowicz/clean-css/issues/2) - resolving `@import` rules.
-* Fixed issue [#44](https://github.com/jakubpawlowicz/clean-css/issues/44) - examples in `--help`.
-* Fixed issue [#46](https://github.com/jakubpawlowicz/clean-css/issues/46) - preserving special characters in URLs and attributes.
-* Fixed issue [#80](https://github.com/jakubpawlowicz/clean-css/issues/80) - quotation in multi line strings.
-* Fixed issue [#83](https://github.com/jakubpawlowicz/clean-css/issues/83) - HSL to hex color conversions.
-* Fixed issue [#86](https://github.com/jakubpawlowicz/clean-css/issues/86) - broken `@charset` replacing.
-* Fixed issue [#88](https://github.com/jakubpawlowicz/clean-css/issues/88) - removes space in `! important`.
-* Fixed issue [#92](https://github.com/jakubpawlowicz/clean-css/issues/92) - uppercase hex to short versions.
-
-0.10.2 / 2013-03-19
-===================
-
-* Fixed issue [#79](https://github.com/jakubpawlowicz/clean-css/issues/79) - node.js 0.10.x compatibility.
-
-0.10.1 / 2013-02-14
-===================
-
-* Fixed issue [#66](https://github.com/jakubpawlowicz/clean-css/issues/66) - line breaks without extra spaces should
- be handled correctly.
-
-0.10.0 / 2013-02-09
-===================
-
-* Switched from [optimist](https://github.com/substack/node-optimist) to
- [commander](https://github.com/visionmedia/commander.js) for CLI processing.
-* Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
-* Fixed performance issue with replacing multiple `@charset` declarations and issue
- with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
-* Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
-* Fixed issue [#47](https://github.com/jakubpawlowicz/clean-css/issues/47) - commandline issues on Windows.
-* Fixed issue [#49](https://github.com/jakubpawlowicz/clean-css/issues/49) - remove empty selectors from media query.
-* Fixed issue [#52](https://github.com/jakubpawlowicz/clean-css/issues/52) - strip fraction zeros if not needed.
-* Fixed issue [#58](https://github.com/jakubpawlowicz/clean-css/issues/58) - remove colon where possible.
-* Fixed issue [#59](https://github.com/jakubpawlowicz/clean-css/issues/59) - content property handling.
-
-0.9.1 / 2012-12-19
-==================
-
-* Fixed issue [#37](https://github.com/jakubpawlowicz/clean-css/issues/37) - converting
- `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
-
-0.9.0 / 2012-12-15
-==================
-
-* Added stripping quotation from font names (if possible).
-* Added stripping quotation from `@keyframes` declaration, `animation` and
- `animation-name` property.
-* Added stripping quotations from attributes' value (e.g. `[data-target='x']`).
-* Added better hex->name and name->hex color shortening.
-* Added `font: normal` and `font: bold` shortening the same way as `font-weight` is.
-* Refactored shorthand selectors and added `border-radius`, `border-style`
- and `border-color` shortening.
-* Added `margin`, `padding` and `border-width` shortening.
-* Added removing line break after commas.
-* Fixed removing whitespace inside media query definition.
-* Added removing line breaks after a comma, so all declarations are one-liners now.
-* Speed optimizations (~10% despite many new features).
-* Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`.
-
-0.8.3 / 2012-11-29
-==================
-
-* Fixed HSL/HSLA colors processing.
-
-0.8.2 / 2012-10-31
-==================
-
-* Fixed shortening hex colors and their relation to hashes in URLs.
-* Cleanup by [@XhmikosR](https://github.com/XhmikosR).
-
-0.8.1 / 2012-10-28
-==================
-
-* Added better zeros processing for `rect(...)` syntax (clip property).
-
-0.8.0 / 2012-10-21
-==================
-
-* Added removing URLs quotation if possible.
-* Rewrote breaks processing.
-* Added `keepBreaks`/`-b` option to keep line breaks in the minimized file.
-* Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules.
-* Minimized test data is now minimized with line breaks so it's easier to
- compare the changes line by line.
-
-0.7.0 / 2012-10-14
-==================
-
-* Added stripping special comments to CLI (`--s0` and `--s1` options).
-* Added stripping special comments to programmatic interface
- (`keepSpecialComments` option).
-
-0.6.0 / 2012-08-05
-==================
-
-* Full Windows support with tests (./test.bat).
-
-0.5.0 / 2012-08-02
-==================
-
-* Made path to vows local.
-* Explicit node.js 0.6 requirement.
-
-0.4.2 / 2012-06-28
-==================
-
-* Updated binary `-v` option (version).
-* Updated binary to output help when no options given (but not in piped mode).
-* Added binary tests.
-
-0.4.1 / 2012-06-10
-==================
-
-* Fixed stateless mode where calling `CleanCSS#process` directly was giving
- errors (reported by [@facelessuser](https://github.com/facelessuser)).
-
-0.4.0 / 2012-06-04
-==================
-
-* Speed improvements up to 4x thanks to the rewrite of comments and CSS' content
- processing.
-* Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details).
-* Improved debugging mode (see [test/bench.js](/test/bench.js))
-* Added `make bench` for a one-pass benchmark.
-
-0.3.3 / 2012-05-27
-==================
-
-* Fixed tests, [package.json](/package.json) for development, and regex
- for removing empty declarations (thanks to [@vvo](https://github.com/vvo)).
-
-0.3.2 / 2012-01-17
-==================
-
-* Fixed output method under node.js 0.6 which incorrectly tried to close
- `process.stdout`.
-
-0.3.1 / 2011-12-16
-==================
-
-* Fixed cleaning up `0 0 0 0` expressions.
-
-0.3.0 / 2011-11-29
-==================
-
-* Clean-css requires node.js 0.4.0+ to run.
-* Removed node.js's 0.2.x 'sys' package dependency
- (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch).
-
-0.2.6 / 2011-11-27
-==================
-
-* Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector.
-
-0.2.5 / 2011-11-27
-==================
-
-* Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations
- (thanks to [@cvan](https://github.com/cvan) for reporting it).
-* Fixed converting `#f00` to `red` in borders and gradients.
-
-0.2.4 / 2011-05-25
-==================
-
-* Fixed problem with expanding `none` to `0` in partial/full background
- declarations.
-* Fixed including clean-css library from binary (global to local).
-
-0.2.3 / 2011-04-18
-==================
-
-* Fixed problem with optimizing IE filters.
-
-0.2.2 / 2011-04-17
-==================
-
-* Fixed problem with space before color in `border` property.
-
-0.2.1 / 2011-03-19
-==================
-
-* Added stripping space before `!important` keyword.
-* Updated repository location and author information in [package.json](/package.json).
-
-0.2.0 / 2011-03-02
-==================
-
-* Added options parsing via optimist.
-* Changed code inclusion (thus the version bump).
-
-0.1.0 / 2011-02-27
-==================
-
-* First version of clean-css library.
-* Implemented all basic CSS transformations.
diff --git a/node_modules/clean-css/LICENSE b/node_modules/clean-css/LICENSE
deleted file mode 100644
index bf2f4055b..000000000
--- a/node_modules/clean-css/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2017 JakubPawlowicz.com
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/clean-css/README.md b/node_modules/clean-css/README.md
deleted file mode 100644
index 3f7965b4a..000000000
--- a/node_modules/clean-css/README.md
+++ /dev/null
@@ -1,764 +0,0 @@
-<h1 align="center">
- <br/>
- <img src="https://cdn.rawgit.com/jakubpawlowicz/clean-css/master/logo.v2.svg" alt="clean-css logo" width="525px"/>
- <br/>
- <br/>
-</h1>
-
-[![NPM version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![Linux Build Status](https://img.shields.io/travis/jakubpawlowicz/clean-css/master.svg?style=flat&label=Linux%20build)](https://travis-ci.org/jakubpawlowicz/clean-css)
-[![Windows Build status](https://img.shields.io/appveyor/ci/jakubpawlowicz/clean-css/master.svg?style=flat&label=Windows%20build)](https://ci.appveyor.com/project/jakubpawlowicz/clean-css/branch/master)
-[![Dependency Status](https://img.shields.io/david/jakubpawlowicz/clean-css.svg?style=flat)](https://david-dm.org/jakubpawlowicz/clean-css)
-[![NPM Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
-[![Twitter](https://img.shields.io/badge/Twitter-@cleancss-blue.svg)](https://twitter.com/cleancss)
-
-clean-css is a fast and efficient CSS optimizer for [Node.js](http://nodejs.org/) platform and [any modern browser](https://jakubpawlowicz.github.io/clean-css).
-
-According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
-
-**Table of Contents**
-
-- [Node.js version support](#nodejs-version-support)
-- [Install](#install)
-- [Use](#use)
- * [Important: 4.0 breaking changes](#important-40-breaking-changes)
- * [What's new in version 4.1](#whats-new-in-version-41)
- * [What's new in version 4.2](#whats-new-in-version-42)
- * [Constructor options](#constructor-options)
- * [Compatibility modes](#compatibility-modes)
- * [Fetch option](#fetch-option)
- * [Formatting options](#formatting-options)
- * [Inlining options](#inlining-options)
- * [Optimization levels](#optimization-levels)
- + [Level 0 optimizations](#level-0-optimizations)
- + [Level 1 optimizations](#level-1-optimizations)
- + [Level 2 optimizations](#level-2-optimizations)
- * [Minify method](#minify-method)
- * [Promise interface](#promise-interface)
- * [CLI utility](#cli-utility)
-- [FAQ](#faq)
- * [How to optimize multiple files?](#how-to-optimize-multiple-files)
- * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
- * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
- * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
- * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
- * [How to preserve a comment block?](#how-to-preserve-a-comment-block)
- * [How to rebase relative image URLs?](#how-to-rebase-relative-image-urls)
- * [How to work with source maps?](#how-to-work-with-source-maps)
- * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
- * [What level 2 optimizations do?](#what-level-2-optimizations-do)
- * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
- * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
-- [Contributing](#contributing)
- * [How to get started?](#how-to-get-started)
-- [Acknowledgments](#acknowledgments)
-- [License](#license)
-
-# Node.js version support
-
-clean-css requires Node.js 4.0+ (tested on Linux, OS X, and Windows)
-
-# Install
-
-```
-npm install --save-dev clean-css
-```
-
-# Use
-
-```js
-var CleanCSS = require('clean-css');
-var input = 'a{font-weight:bold;}';
-var options = { /* options */ };
-var output = new CleanCSS(options).minify(input);
-```
-
-## Important: 4.0 breaking changes
-
-clean-css 4.0 introduces some breaking changes:
-
-* API and CLI interfaces are split, so API stays in this repository while CLI moves to [clean-css-cli](https://github.com/jakubpawlowicz/clean-css-cli);
-* `root`, `relativeTo`, and `target` options are replaced by a single `rebaseTo` option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
-* `debug` option is gone as stats are always provided in output object under `stats` property;
-* `roundingPrecision` is disabled by default;
-* `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
-* `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
-* splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
-* remote resources without a protocol, e.g. `//fonts.googleapis.com/css?family=Domine:700`, are not inlined anymore;
-* changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use `{ compatibility: 'ie9' }` flag;
-* renames `keepSpecialComments` to `specialComments`;
-* moves `roundingPrecision` and `specialComments` to level 1 optimizations options, see examples;
-* moves `mediaMerging`, `restructuring`, `semanticMerging`, and `shorthandCompacting` to level 2 optimizations options, see examples below;
-* renames `shorthandCompacting` option to `mergeIntoShorthands`;
-* level 1 optimizations are the new default, up to 3.x it was level 2;
-* `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
-* `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
-* `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
-
-## What's new in version 4.1
-
-clean-css 4.1 introduces the following changes / features:
-
-* `inline: false` as an alias to `inline: ['none']`;
-* `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
-* `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
-* `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
-* `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
-* `minify` method improved signature accepting a list of hashes for a predictable traversal;
-* `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
-* `fetch` option controlling a function for handling remote requests;
-* new `font` shorthand and `font-*` longhand optimizers;
-* removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
-* `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
-* new `animation` shorthand and `animation-*` longhand optimizers;
-* `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
-* the [web interface](https://jakubpawlowicz.github.io/clean-css) gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.
-
-## What's new in version 4.2
-
-clean-css 4.2 introduces the following changes / features:
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
-* new `transition` property optimizer;
-* preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
-* allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
-* adds configurable line breaks via `format: { breakWith: 'lf' }` option.
-
-## Constructor options
-
-clean-css constructor accepts a hash as a parameter with the following options available:
-
-* `compatibility` - controls compatibility mode used; defaults to `ie10+`; see [compatibility modes](#compatibility-modes) for examples;
-* `fetch` - controls a function for handling remote requests; see [fetch option](#fetch-option) for examples (since 4.1.0);
-* `format` - controls output CSS formatting; defaults to `false`; see [formatting options](#formatting-options) for examples;
-* `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
-* `inlineRequest` - controls extra options for inlining remote `@import` rules, can be any of [HTTP(S) request options](https://nodejs.org/api/http.html#http_http_request_options_callback);
-* `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
-* `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
-* `rebase` - controls URL rebasing; defaults to `true`;
-* `rebaseTo` - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
-* `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
-* `sourceMap` - controls whether an output source map is built; defaults to `false`;
-* `sourceMapInlineSources` - controls embedding sources inside a source map's `sourcesContent` field; defaults to false.
-
-## Compatibility modes
-
-There is a certain number of compatibility mode shortcuts, namely:
-
-* `new CleanCSS({ compatibility: '*' })` (default) - Internet Explorer 10+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
-
-Each of these modes is an alias to a [fine grained configuration](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/options/compatibility.js), with the following options available:
-
-```js
-new CleanCSS({
- compatibility: {
- colors: {
- opacity: true // controls `rgba()` / `hsla()` color support
- },
- properties: {
- backgroundClipMerging: true, // controls background-clip merging into shorthand
- backgroundOriginMerging: true, // controls background-origin merging into shorthand
- backgroundSizeMerging: true, // controls background-size merging into shorthand
- colors: true, // controls color optimizations
- ieBangHack: false, // controls keeping IE bang hack
- ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
- iePrefixHack: false, // controls keeping IE prefix hack
- ieSuffixHack: false, // controls keeping IE suffix hack
- merging: true, // controls property merging based on understandability
- shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
- spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
- urlQuotes: false, // controls keeping quoting inside `url()`
- zeroUnits: true // controls removal of units `0` value
- },
- selectors: {
- adjacentSpace: false, // controls extra space before `nav` element
- ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
- mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
- mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
- mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
- multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
- },
- units: {
- ch: true, // controls treating `ch` as a supported unit
- in: true, // controls treating `in` as a supported unit
- pc: true, // controls treating `pc` as a supported unit
- pt: true, // controls treating `pt` as a supported unit
- rem: true, // controls treating `rem` as a supported unit
- vh: true, // controls treating `vh` as a supported unit
- vm: true, // controls treating `vm` as a supported unit
- vmax: true, // controls treating `vmax` as a supported unit
- vmin: true // controls treating `vmin` as a supported unit
- }
- }
-})
-```
-
-You can also use a string when setting a compatibility mode, e.g.
-
-```js
-new CleanCSS({
- compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
-})
-```
-
-## Fetch option
-
-The `fetch` option accepts a function which handles remote resource fetching, e.g.
-
-```js
-var request = require('request');
-var source = '@import url(http://example.com/path/to/stylesheet.css);';
-new CleanCSS({
- fetch: function (uri, inlineRequest, inlineTimeout, callback) {
- request(uri, function (error, response, body) {
- if (error) {
- callback(error, null);
- } else if (response && response.statusCode != 200) {
- callback(response.statusCode, null);
- } else {
- callback(null, body);
- }
- });
- }
-}).minify(source);
-```
-
-This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
-
-Unless given, the default [loadRemoteResource](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
-
-## Formatting options
-
-By default output CSS is formatted without any whitespace unless a `format` option is given.
-First of all there are two shorthands:
-
-```js
-new CleanCSS({
- format: 'beautify' // formats output in a really nice way
-})
-```
-
-and
-
-```js
-new CleanCSS({
- format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
-})
-```
-
-however `format` option also accept a fine-grained set of options:
-
-```js
-new CleanCSS({
- format: {
- breaks: { // controls where to insert breaks
- afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
- afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
- afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
- afterComment: false, // controls if a line break comes after a comment; defaults to `false`
- afterProperty: false, // controls if a line break comes after a property; defaults to `false`
- afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
- afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
- beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
- betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
- },
- breakWith: '\n', // controls the new line character, can be `'\r\n'` or `'\n'` (aliased as `'windows'` and `'unix'` or `'crlf'` and `'lf'`); defaults to system one, so former on Windows and latter on Unix
- indentBy: 0, // controls number of characters to indent with; defaults to `0`
- indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
- spaces: { // controls where to insert spaces
- aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
- beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
- beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
- },
- wrapAt: false // controls maximum line length; defaults to `false`
- }
-})
-```
-
-## Inlining options
-
-`inline` option whitelists which `@import` rules will be processed, e.g.
-
-```js
-new CleanCSS({
- inline: ['local'] // default; enables local inlining only
-})
-```
-
-```js
-new CleanCSS({
- inline: ['none'] // disables all inlining
-})
-```
-
-```js
-// introduced in clean-css 4.1.0
-
-new CleanCSS({
- inline: false // disables all inlining (alias to `['none']`)
-})
-```
-
-```js
-new CleanCSS({
- inline: ['all'] // enables all inlining, same as ['local', 'remote']
-})
-```
-
-```js
-new CleanCSS({
- inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
-})
-```
-
-```js
-new CleanCSS({
- inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
-})
-```
-
-## Optimization levels
-
-The `level` option can be either `0`, `1` (default), or `2`, e.g.
-
-```js
-new CleanCSS({
- level: 2
-})
-```
-
-or a fine-grained configuration given via a hash.
-
-Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
-
-### Level 0 optimizations
-
-Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.
-
-### Level 1 optimizations
-
-Level 1 optimizations (default) operate on single properties only, e.g. can remove units when not required, turn rgb colors to a shorter hex representation, remove comments, etc
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
- level: {
- 1: {
- cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
- normalizeUrls: true, // controls URL normalization; defaults to `true`
- optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
- optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
- optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
- optimizeFont: true, // controls `font` property optimizations; defaults to `true`
- optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
- optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
- removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
- removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
- removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
- removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
- replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
- replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
- replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
- roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
- selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
- specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
- tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
- tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
- tidySelectors: true, // controls selectors optimizing; defaults to `true`,
- semicolonAfterLastProperty: false, // controls removing trailing semicolons in rule; defaults to `false` - means remove
- transform: function () {} // defines a callback for fine-grained property optimization; defaults to no-op
- }
- }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
- level: {
- 1: {
- all: false, // set all values to `false`
- tidySelectors: true // turns on optimizing selectors
- }
- }
-});
-```
-
-### Level 2 optimizations
-
-Level 2 optimizations operate at rules or multiple properties level, e.g. can remove duplicate rules, remove properties redefined further down a stylesheet, or restructure rules by moving them around.
-
-Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
- level: {
- 2: {
- mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
- mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
- mergeMedia: true, // controls `@media` merging; defaults to true
- mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
- mergeSemantically: false, // controls semantic merging; defaults to false
- overrideProperties: true, // controls property overriding based on understandability; defaults to true
- removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
- reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
- removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
- removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
- removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
- removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
- restructureRules: false, // controls rule restructuring; defaults to false
- skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
- }
- }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
- level: {
- 2: {
- all: false, // sets all values to `false`
- removeDuplicateRules: true // turns on removing duplicate rules
- }
- }
-});
-```
-
-## Minify method
-
-Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source);
-```
-
-The output of the `minify` method is a hash with following fields:
-
-```js
-console.log(output.styles); // optimized output CSS as a string
-console.log(output.sourceMap); // output source map if requested with `sourceMap` option
-console.log(output.errors); // a list of errors raised
-console.log(output.warnings); // a list of warnings raised
-console.log(output.stats.originalSize); // original content size after import inlining
-console.log(output.stats.minifiedSize); // optimized content size
-console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
-console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
-```
-
-The `minify` method also accepts an input source map, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source, inputSourceMap);
-```
-
-or a callback invoked when optimizations are finished, e.g.
-
-```js
-new CleanCSS(options).minify(source, function (error, output) {
- // `output` is the same as in the synchronous call above
-});
-```
-
-## Promise interface
-
-If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.
-
-```js
-new CleanCSS({ returnPromise: true })
- .minify(source)
- .then(function (output) { console.log(output.styles); })
- .catch(function (error) { // deal with errors });
-```
-
-## CLI utility
-
-Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/jakubpawlowicz/clean-css-cli.
-
-# FAQ
-
-## How to optimize multiple files?
-
-It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:
-
-```js
-new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
-```
-
-```js
-new CleanCSS().minify({
- 'path/to/file/one': {
- styles: 'contents of file one'
- },
- 'path/to/file/two': {
- styles: 'contents of file two'
- }
-});
-```
-
-```js
-new CleanCSS().minify([
- {'path/to/file/one': {styles: 'contents of file one'}},
- {'path/to/file/two': {styles: 'contents of file two'}}
-]);
-```
-
-Passing an array of hashes allows you to explicitly specify the order in which the input files are concatenated. Whereas when you use a single hash the order is determined by the [traversal order of object properties](http://2ality.com/2015/10/property-traversal-order-es6.html) - available since 4.1.0.
-
-Important note - any `@import` rules already present in the hash will be resolved in memory.
-
-## How to process remote `@import`s correctly?
-
-In order to inline remote `@import` statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:
-
-```js
-var source = '@import url(http://example.com/path/to/remote/styles);';
-new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
- // output.styles
-});
-```
-
-If you don't provide a callback, then remote `@import`s will be left as is.
-
-## How to apply arbitrary transformations to CSS properties?
-
-If clean-css doesn't perform a particular property optimization, you can use `transform` callback to apply it:
-
-```js
-var source = '.block{background-image:url(/path/to/image.png)}';
-var output = new CleanCSS({
- level: {
- 1: {
- transform: function (propertyName, propertyValue, selector /* `selector` available since 4.2.0-pre */) {
- if (propertyName == 'background-image' && propertyValue.indexOf('/path/to') > -1) {
- return propertyValue.replace('/path/to', '../valid/path/to');
- }
- }
- }
- }
-}).minify(source);
-
-console.log(output.styles); # => .block{background-image:url(../valid/path/to/image.png)}
-```
-
-Note: returning `false` from `transform` callback will drop a property.
-
-## How to specify a custom rounding precision?
-
-The level 1 `roundingPrecision` optimization option accept a string with per-unit rounding precision settings, e.g.
-
-```js
-new CleanCSS({
- level: {
- 1: {
- roundingPrecision: 'all=3,px=5'
- }
- }
-}).minify(source)
-```
-
-which sets all units rounding precision to 3 digits except `px` unit precision of 5 digits.
-
-## How to keep a CSS fragment intact?
-
-Note: available in the current master, to be released in 4.2.0.
-
-Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
-
-```css
-.block-1 {
- color: red
-}
-/* clean-css ignore:start */
-.block-special {
- color: transparent
-}
-/* clean-css ignore:end */
-.block-2 {
- margin: 0
-}
-```
-
-Optimizing this CSS will result in the following output:
-
-```css
-.block-1{color:red}
-.block-special {
- color: transparent
-}
-.block-2{margin:0}
-```
-
-## How to preserve a comment block?
-
-Use the `/*!` notation instead of the standard one `/*`:
-
-```css
-/*!
- Important comments included in optimized output.
-*/
-```
-
-## How to rebase relative image URLs?
-
-clean-css will handle it automatically for you in the following cases:
-
-* when full paths to input files are passed in as options;
-* when correct paths are passed in via a hash;
-* when `rebaseTo` is used with any of above two.
-
-## How to work with source maps?
-
-To generate a source map, use `sourceMap: true` option, e.g.:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
- .minify(source, function (error, output) {
- // access output.sourceMap for SourceMapGenerator object
- // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-You can also pass an input source map directly as a 2nd argument to `minify` method:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
- .minify(source, inputSourceMap, function (error, output) {
- // access output.sourceMap to access SourceMapGenerator object
- // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-or even multiple input source maps at once:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
- 'path/to/source/1': {
- styles: '...styles...',
- sourceMap: '...source-map...'
- },
- 'path/to/source/2': {
- styles: '...styles...',
- sourceMap: '...source-map...'
- }
-}, function (error, output) {
- // access output.sourceMap as above
-});
-```
-
-## How to apply level 1 & 2 optimizations at the same time?
-
-Using the hash configuration specifying both optimization levels, e.g.
-
-```js
-new CleanCSS({
- level: {
- 1: {
- all: true,
- normalizeUrls: false
- },
- 2: {
- restructureRules: true
- }
- }
-})
-```
-
-will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
-
-## What level 2 optimizations do?
-
-All level 2 optimizations are dispatched [here](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/optimizer/level-2/optimize.js#L67), and this is what they do:
-
-* `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
-* `recursivelyOptimizeProperties` - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. `margin` into `margin-(bottom|left|right|top)`), optimizing, and restoring them back. You may want to use `mergeIntoShorthands` option to control whether you want to turn multiple components into shorthands;
-* `removeDuplicates` - gets rid of duplicate rulesets with exactly the same set of properties, e.g. when including a Sass / Less partial twice for no good reason;
-* `mergeAdjacent` - merges adjacent rulesets with the same selector or rules;
-* `reduceNonAdjacent` - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
-* `mergeNonAdjacentBySelector` - identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to have the same value;
-* `mergeNonAdjacentByBody` - same as the one above but for same-selector non-adjacent rulesets;
-* `restructure` - tries to reorganize different-selector different-rules rulesets so they take less space, e.g. `.one{padding:0}.two{margin:0}.one{margin-bottom:3px}` into `.two{margin:0}.one{padding:0;margin-bottom:3px}`;
-* `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
-* `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
-* `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
-
-## How to use clean-css with build tools?
-
-There is a number of 3rd party plugins to popular build tools:
-
-* [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
-* [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
-* [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
-* [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
-* [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/jakubpawlowicz/clean-css/issues/342)
-* [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
-* [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
-* [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
-* [Start](https://github.com/start-runner/start): [start-clean-css](https://github.com/start-runner/clean-css)
-
-## How to use clean-css from web browser?
-
-* https://jakubpawlowicz.github.io/clean-css/ (official web interface)
-* http://refresh-sf.com/
-* http://adamburgess.github.io/clean-css-online/
-
-# Contributing
-
-See [CONTRIBUTING.md](https://github.com/jakubpawlowicz/clean-css/blob/master/CONTRIBUTING.md).
-
-## How to get started?
-
-First clone the sources:
-
-```bash
-git clone git@github.com:jakubpawlowicz/clean-css.git
-```
-
-then install dependencies:
-
-```bash
-cd clean-css
-npm install
-```
-
-then use any of the following commands to verify your copy:
-
-```bash
-npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/jakubpawlowicz/clean-css/blob/master/test/bench.js) for details)
-npm run browserify # to create the browser-ready clean-css version
-npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
-npm test # to run all tests
-```
-
-# Acknowledgments
-
-Sorted alphabetically by GitHub handle:
-
-* [@abarre](https://github.com/abarre) (Anthony Barre) for improvements to `@import` processing;
-* [@alexlamsl](https://github.com/alexlamsl) (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@altschuler](https://github.com/altschuler) (Simon Altschuler) for fixing `@import` processing inside comments;
-* [@ben-eb](https://github.com/ben-eb) (Ben Briggs) for sharing ideas about CSS optimizations;
-* [@davisjam](https://github.com/davisjam) (Jamie Davis) for disclosing ReDOS vulnerabilities;
-* [@facelessuser](https://github.com/facelessuser) (Isaac) for pointing out a flaw in clean-css' stateless mode;
-* [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
-* [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
-* [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
- Plus everyone else involved in [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) for pushing it forward;
-* [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
-* [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
-* [@venemo](https://github.com/venemo) (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
-* [@vvo](https://github.com/vvo) (Vincent Voyer) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release;
-* [@xhmikosr](https://github.com/xhmikosr) for suggesting new features, like option to remove special comments and strip out URLs quotation, and pointing out numerous improvements like JSHint, media queries, etc.
-
-# License
-
-clean-css is released under the [MIT License](https://github.com/jakubpawlowicz/clean-css/blob/master/LICENSE).
diff --git a/node_modules/clean-css/index.js b/node_modules/clean-css/index.js
deleted file mode 100644
index d7b05030f..000000000
--- a/node_modules/clean-css/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/clean');
diff --git a/node_modules/clean-css/lib/clean.js b/node_modules/clean-css/lib/clean.js
deleted file mode 100644
index 8cdb4b793..000000000
--- a/node_modules/clean-css/lib/clean.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Clean-css - https://github.com/jakubpawlowicz/clean-css
- * Released under the terms of MIT license
- *
- * Copyright (C) 2017 JakubPawlowicz.com
- */
-
-var level0Optimize = require('./optimizer/level-0/optimize');
-var level1Optimize = require('./optimizer/level-1/optimize');
-var level2Optimize = require('./optimizer/level-2/optimize');
-var validator = require('./optimizer/validator');
-
-var compatibilityFrom = require('./options/compatibility');
-var fetchFrom = require('./options/fetch');
-var formatFrom = require('./options/format').formatFrom;
-var inlineFrom = require('./options/inline');
-var inlineRequestFrom = require('./options/inline-request');
-var inlineTimeoutFrom = require('./options/inline-timeout');
-var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
-var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
-var rebaseFrom = require('./options/rebase');
-var rebaseToFrom = require('./options/rebase-to');
-
-var inputSourceMapTracker = require('./reader/input-source-map-tracker');
-var readSources = require('./reader/read-sources');
-
-var serializeStyles = require('./writer/simple');
-var serializeStylesAndSourceMap = require('./writer/source-maps');
-
-var CleanCSS = module.exports = function CleanCSS(options) {
- options = options || {};
-
- this.options = {
- compatibility: compatibilityFrom(options.compatibility),
- fetch: fetchFrom(options.fetch),
- format: formatFrom(options.format),
- inline: inlineFrom(options.inline),
- inlineRequest: inlineRequestFrom(options.inlineRequest),
- inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
- level: optimizationLevelFrom(options.level),
- rebase: rebaseFrom(options.rebase),
- rebaseTo: rebaseToFrom(options.rebaseTo),
- returnPromise: !!options.returnPromise,
- sourceMap: !!options.sourceMap,
- sourceMapInlineSources: !!options.sourceMapInlineSources
- };
-};
-
-
-// for compatibility with optimize-css-assets-webpack-plugin
-CleanCSS.process = function (input, opts) {
- var cleanCss;
- var optsTo = opts.to;
-
- delete opts.to;
- cleanCss = new CleanCSS(Object.assign({ returnPromise: true, rebaseTo: optsTo }, opts));
-
- return cleanCss.minify(input)
- .then(function(output) {
- return { css: output.styles };
- });
-};
-
-
-CleanCSS.prototype.minify = function (input, maybeSourceMap, maybeCallback) {
- var options = this.options;
-
- if (options.returnPromise) {
- return new Promise(function (resolve, reject) {
- minify(input, options, maybeSourceMap, function (errors, output) {
- return errors ?
- reject(errors) :
- resolve(output);
- });
- });
- } else {
- return minify(input, options, maybeSourceMap, maybeCallback);
- }
-};
-
-function minify(input, options, maybeSourceMap, maybeCallback) {
- var sourceMap = typeof maybeSourceMap != 'function' ?
- maybeSourceMap :
- null;
- var callback = typeof maybeCallback == 'function' ?
- maybeCallback :
- (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
- var context = {
- stats: {
- efficiency: 0,
- minifiedSize: 0,
- originalSize: 0,
- startedAt: Date.now(),
- timeSpent: 0
- },
- cache: {
- specificity: {}
- },
- errors: [],
- inlinedStylesheets: [],
- inputSourceMapTracker: inputSourceMapTracker(),
- localOnly: !callback,
- options: options,
- source: null,
- sourcesContent: {},
- validator: validator(options.compatibility),
- warnings: []
- };
-
- if (sourceMap) {
- context.inputSourceMapTracker.track(undefined, sourceMap);
- }
-
- return runner(context.localOnly)(function () {
- return readSources(input, context, function (tokens) {
- var serialize = context.options.sourceMap ?
- serializeStylesAndSourceMap :
- serializeStyles;
-
- var optimizedTokens = optimize(tokens, context);
- var optimizedStyles = serialize(optimizedTokens, context);
- var output = withMetadata(optimizedStyles, context);
-
- return callback ?
- callback(context.errors.length > 0 ? context.errors : null, output) :
- output;
- });
- });
-}
-
-function runner(localOnly) {
- // to always execute code asynchronously when a callback is given
- // more at blog.izs.me/post/59142742143/designing-apis-for-asynchrony
- return localOnly ?
- function (callback) { return callback(); } :
- process.nextTick;
-}
-
-function optimize(tokens, context) {
- var optimized;
-
- optimized = level0Optimize(tokens, context);
- optimized = OptimizationLevel.One in context.options.level ?
- level1Optimize(tokens, context) :
- tokens;
- optimized = OptimizationLevel.Two in context.options.level ?
- level2Optimize(tokens, context, true) :
- optimized;
-
- return optimized;
-}
-
-function withMetadata(output, context) {
- output.stats = calculateStatsFrom(output.styles, context);
- output.errors = context.errors;
- output.inlinedStylesheets = context.inlinedStylesheets;
- output.warnings = context.warnings;
-
- return output;
-}
-
-function calculateStatsFrom(styles, context) {
- var finishedAt = Date.now();
- var timeSpent = finishedAt - context.stats.startedAt;
-
- delete context.stats.startedAt;
- context.stats.timeSpent = timeSpent;
- context.stats.efficiency = 1 - styles.length / context.stats.originalSize;
- context.stats.minifiedSize = styles.length;
-
- return context.stats;
-}
diff --git a/node_modules/clean-css/lib/optimizer/hack.js b/node_modules/clean-css/lib/optimizer/hack.js
deleted file mode 100644
index 812b5d5ec..000000000
--- a/node_modules/clean-css/lib/optimizer/hack.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var Hack = {
- ASTERISK: 'asterisk',
- BANG: 'bang',
- BACKSLASH: 'backslash',
- UNDERSCORE: 'underscore'
-};
-
-module.exports = Hack;
diff --git a/node_modules/clean-css/lib/optimizer/level-0/optimize.js b/node_modules/clean-css/lib/optimizer/level-0/optimize.js
deleted file mode 100644
index 2a56f89c6..000000000
--- a/node_modules/clean-css/lib/optimizer/level-0/optimize.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function level0Optimize(tokens) {
- // noop as level 0 means no optimizations!
- return tokens;
-}
-
-module.exports = level0Optimize;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/optimize.js b/node_modules/clean-css/lib/optimizer/level-1/optimize.js
deleted file mode 100644
index 13cfd8c52..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/optimize.js
+++ /dev/null
@@ -1,676 +0,0 @@
-var shortenHex = require('./shorten-hex');
-var shortenHsl = require('./shorten-hsl');
-var shortenRgb = require('./shorten-rgb');
-var sortSelectors = require('./sort-selectors');
-var tidyRules = require('./tidy-rules');
-var tidyBlock = require('./tidy-block');
-var tidyAtRule = require('./tidy-at-rule');
-
-var Hack = require('../hack');
-var removeUnused = require('../remove-unused');
-var restoreFromOptimizing = require('../restore-from-optimizing');
-var wrapForOptimizing = require('../wrap-for-optimizing').all;
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-var split = require('../../utils/split');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var IgnoreProperty = 'ignore-property';
-
-var CHARSET_TOKEN = '@charset';
-var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i');
-
-var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEFAULT;
-
-var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/;
-var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/;
-
-var HEX_VALUE_PATTERN = /[0-9a-f]/i;
-var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTED_PATTERN = /^('.*'|".*")$/;
-var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var VARIABLE_NAME_PATTERN = /^--\S+$/;
-
-function isNegative(value) {
- return value && value[1][0] == '-' && parseFloat(value[1]) < 0;
-}
-
-function isQuoted(value) {
- return QUOTED_PATTERN.test(value);
-}
-
-function isUrl(value) {
- return URL_PREFIX_PATTERN.test(value);
-}
-
-function normalizeUrl(value) {
- return value
- .replace(URL_PREFIX_PATTERN, 'url(')
- .replace(/\\?\n|\\?\r\n/g, '');
-}
-
-function optimizeBackground(property) {
- var values = property.value;
-
- if (values.length == 1 && values[0][1] == 'none') {
- values[0][1] = '0 0';
- }
-
- if (values.length == 1 && values[0][1] == 'transparent') {
- values[0][1] = '0 0';
- }
-}
-
-function optimizeBorderRadius(property) {
- var values = property.value;
- var spliceAt;
-
- if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) {
- spliceAt = 1;
- } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) {
- spliceAt = 2;
- } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) {
- spliceAt = 3;
- } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) {
- spliceAt = 4;
- }
-
- if (spliceAt) {
- property.value.splice(spliceAt);
- property.dirty = true;
- }
-}
-
-function optimizeColors(name, value, compatibility) {
- if (value.indexOf('#') === -1 && value.indexOf('rgb') == -1 && value.indexOf('hsl') == -1) {
- return shortenHex(value);
- }
-
- value = value
- .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/g, function (match, red, green, blue) {
- return shortenRgb(red, green, blue);
- })
- .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function (match, hue, saturation, lightness) {
- return shortenHsl(hue, saturation, lightness);
- })
- .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) {
- var suffix = inputValue[at + match.length];
-
- if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
- return match;
- } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
- return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
- } else {
- return (prefix + '#' + color).toLowerCase();
- }
- })
- .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) {
- return prefix + '#' + color.toLowerCase();
- })
- .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/g, function (match, colorFunction, colorDef) {
- var tokens = colorDef.split(',');
- var applies = (colorFunction == 'hsl' && tokens.length == 3) ||
- (colorFunction == 'hsla' && tokens.length == 4) ||
- (colorFunction == 'rgb' && tokens.length == 3 && colorDef.indexOf('%') > 0) ||
- (colorFunction == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
-
- if (!applies) {
- return match;
- }
-
- if (tokens[1].indexOf('%') == -1) {
- tokens[1] += '%';
- }
-
- if (tokens[2].indexOf('%') == -1) {
- tokens[2] += '%';
- }
-
- return colorFunction + '(' + tokens.join(',') + ')';
- });
-
- if (compatibility.colors.opacity && name.indexOf('background') == -1) {
- value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function (match) {
- if (split(value, ',').pop().indexOf('gradient(') > -1) {
- return match;
- }
-
- return 'transparent';
- });
- }
-
- return shortenHex(value);
-}
-
-function optimizeFilter(property) {
- if (property.value.length == 1) {
- property.value[0][1] = property.value[0][1].replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, function (match, filter, suffix) {
- return filter.toLowerCase() + suffix;
- });
- }
-
- property.value[0][1] = property.value[0][1]
- .replace(/,(\S)/g, ', $1')
- .replace(/ ?= ?/g, '=');
-}
-
-function optimizeFontWeight(property, atIndex) {
- var value = property.value[atIndex][1];
-
- if (value == 'normal') {
- value = '400';
- } else if (value == 'bold') {
- value = '700';
- }
-
- property.value[atIndex][1] = value;
-}
-
-function optimizeMultipleZeros(property) {
- var values = property.value;
- var spliceAt;
-
- if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
- if (property.name.indexOf('box-shadow') > -1) {
- spliceAt = 2;
- } else {
- spliceAt = 1;
- }
- }
-
- if (spliceAt) {
- property.value.splice(spliceAt);
- property.dirty = true;
- }
-}
-
-function optimizeOutline(property) {
- var values = property.value;
-
- if (values.length == 1 && values[0][1] == 'none') {
- values[0][1] = '0';
- }
-}
-
-function optimizePixelLengths(_, value, compatibility) {
- if (!WHOLE_PIXEL_VALUE.test(value)) {
- return value;
- }
-
- return value.replace(WHOLE_PIXEL_VALUE, function (match, val) {
- var newValue;
- var intVal = parseInt(val);
-
- if (intVal === 0) {
- return match;
- }
-
- if (compatibility.properties.shorterLengthUnits && compatibility.units.pt && intVal * 3 % 4 === 0) {
- newValue = intVal * 3 / 4 + 'pt';
- }
-
- if (compatibility.properties.shorterLengthUnits && compatibility.units.pc && intVal % 16 === 0) {
- newValue = intVal / 16 + 'pc';
- }
-
- if (compatibility.properties.shorterLengthUnits && compatibility.units.in && intVal % 96 === 0) {
- newValue = intVal / 96 + 'in';
- }
-
- if (newValue) {
- newValue = match.substring(0, match.indexOf(val)) + newValue;
- }
-
- return newValue && newValue.length < match.length ? newValue : match;
- });
-}
-
-function optimizePrecision(_, value, precisionOptions) {
- if (!precisionOptions.enabled || value.indexOf('.') === -1) {
- return value;
- }
-
- return value
- .replace(precisionOptions.decimalPointMatcher, '$1$2$3')
- .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) {
- var multiplier = precisionOptions.units[unit].multiplier;
- var parsedInteger = parseInt(integerPart);
- var integer = isNaN(parsedInteger) ? 0 : parsedInteger;
- var fraction = parseFloat(fractionPart);
-
- return Math.round((integer + fraction) * multiplier) / multiplier + unit;
- });
-}
-
-function optimizeTimeUnits(_, value) {
- if (!TIME_VALUE.test(value))
- return value;
-
- return value.replace(TIME_VALUE, function (match, val, unit) {
- var newValue;
-
- if (unit == 'ms') {
- newValue = parseInt(val) / 1000 + 's';
- } else if (unit == 's') {
- newValue = parseFloat(val) * 1000 + 'ms';
- }
-
- return newValue.length < match.length ? newValue : match;
- });
-}
-
-function optimizeUnits(name, value, unitsRegexp) {
- if (/^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test(value)) {
- return value;
- }
-
- if (name == 'flex' || name == '-ms-flex' || name == '-webkit-flex' || name == 'flex-basis' || name == '-webkit-flex-basis') {
- return value;
- }
-
- if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) {
- return value;
- }
-
- return value
- .replace(unitsRegexp, '$1' + '0' + '$2')
- .replace(unitsRegexp, '$1' + '0' + '$2');
-}
-
-function optimizeWhitespace(name, value) {
- if (name.indexOf('filter') > -1 || value.indexOf(' ') == -1 || value.indexOf('expression') === 0) {
- return value;
- }
-
- if (value.indexOf(Marker.SINGLE_QUOTE) > -1 || value.indexOf(Marker.DOUBLE_QUOTE) > -1) {
- return value;
- }
-
- value = value.replace(/\s+/g, ' ');
-
- if (value.indexOf('calc') > -1) {
- value = value.replace(/\) ?\/ ?/g, ')/ ');
- }
-
- return value
- .replace(/(\(;?)\s+/g, '$1')
- .replace(/\s+(;?\))/g, '$1')
- .replace(/, /g, ',');
-}
-
-function optimizeZeroDegUnit(_, value) {
- if (value.indexOf('0deg') == -1) {
- return value;
- }
-
- return value.replace(/\(0deg\)/g, '(0)');
-}
-
-function optimizeZeroUnits(name, value) {
- if (value.indexOf('0') == -1) {
- return value;
- }
-
- if (value.indexOf('-') > -1) {
- value = value
- .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2')
- .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2');
- }
-
- return value
- .replace(/(^|\s)0+([1-9])/g, '$1$2')
- .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
- .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
- .replace(/\.([1-9]*)0+(\D|$)/g, function (match, nonZeroPart, suffix) {
- return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix;
- })
- .replace(/(^|\D)0\.(\d)/g, '$1.$2');
-}
-
-function removeQuotes(name, value) {
- if (name == 'content' || name.indexOf('font-variation-settings') > -1 || name.indexOf('font-feature-settings') > -1 || name.indexOf('grid-') > -1) {
- return value;
- }
-
- return QUOTED_BUT_SAFE_PATTERN.test(value) ?
- value.substring(1, value.length - 1) :
- value;
-}
-
-function removeUrlQuotes(value) {
- return /^url\(['"].+['"]\)$/.test(value) && !/^url\(['"].*[\*\s\(\)'"].*['"]\)$/.test(value) && !/^url\(['"]data:[^;]+;charset/.test(value) ?
- value.replace(/["']/g, '') :
- value;
-}
-
-function transformValue(propertyName, propertyValue, rule, transformCallback) {
- var selector = serializeRules(rule);
- var transformedValue = transformCallback(propertyName, propertyValue, selector);
-
- if (transformedValue === undefined) {
- return propertyValue;
- } else if (transformedValue === false) {
- return IgnoreProperty;
- } else {
- return transformedValue;
- }
-}
-
-//
-
-function optimizeBody(rule, properties, context) {
- var options = context.options;
- var levelOptions = options.level[OptimizationLevel.One];
- var property, name, type, value;
- var valueIsUrl;
- var propertyToken;
- var _properties = wrapForOptimizing(properties, true);
-
- propertyLoop:
- for (var i = 0, l = _properties.length; i < l; i++) {
- property = _properties[i];
- name = property.name;
-
- if (!PROPERTY_NAME_PATTERN.test(name)) {
- propertyToken = property.all[property.position];
- context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
- property.unused = true;
- }
-
- if (property.value.length === 0) {
- propertyToken = property.all[property.position];
- context.warnings.push('Empty property \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
- property.unused = true;
- }
-
- if (property.hack && (
- (property.hack[0] == Hack.ASTERISK || property.hack[0] == Hack.UNDERSCORE) && !options.compatibility.properties.iePrefixHack ||
- property.hack[0] == Hack.BACKSLASH && !options.compatibility.properties.ieSuffixHack ||
- property.hack[0] == Hack.BANG && !options.compatibility.properties.ieBangHack)) {
- property.unused = true;
- }
-
- if (levelOptions.removeNegativePaddings && name.indexOf('padding') === 0 && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) {
- property.unused = true;
- }
-
- if (!options.compatibility.properties.ieFilters && isLegacyFilter(property)) {
- property.unused = true;
- }
-
- if (property.unused) {
- continue;
- }
-
- if (property.block) {
- optimizeBody(rule, property.value[0][1], context);
- continue;
- }
-
- if (VARIABLE_NAME_PATTERN.test(name)) {
- continue;
- }
-
- for (var j = 0, m = property.value.length; j < m; j++) {
- type = property.value[j][0];
- value = property.value[j][1];
- valueIsUrl = isUrl(value);
-
- if (type == Token.PROPERTY_BLOCK) {
- property.unused = true;
- context.warnings.push('Invalid value token at ' + formatPosition(value[0][1][2][0]) + '. Ignoring.');
- break;
- }
-
- if (valueIsUrl && !context.validator.isUrl(value)) {
- property.unused = true;
- context.warnings.push('Broken URL \'' + value + '\' at ' + formatPosition(property.value[j][2][0]) + '. Ignoring.');
- break;
- }
-
- if (valueIsUrl) {
- value = levelOptions.normalizeUrls ?
- normalizeUrl(value) :
- value;
- value = !options.compatibility.properties.urlQuotes ?
- removeUrlQuotes(value) :
- value;
- } else if (isQuoted(value)) {
- value = levelOptions.removeQuotes ?
- removeQuotes(name, value) :
- value;
- } else {
- value = levelOptions.removeWhitespace ?
- optimizeWhitespace(name, value) :
- value;
- value = optimizePrecision(name, value, options.precision);
- value = optimizePixelLengths(name, value, options.compatibility);
- value = levelOptions.replaceTimeUnits ?
- optimizeTimeUnits(name, value) :
- value;
- value = levelOptions.replaceZeroUnits ?
- optimizeZeroUnits(name, value) :
- value;
-
- if (options.compatibility.properties.zeroUnits) {
- value = optimizeZeroDegUnit(name, value);
- value = optimizeUnits(name, value, options.unitsRegexp);
- }
-
- if (options.compatibility.properties.colors) {
- value = optimizeColors(name, value, options.compatibility);
- }
- }
-
- value = transformValue(name, value, rule, levelOptions.transform);
-
- if (value === IgnoreProperty) {
- property.unused = true;
- continue propertyLoop;
- }
-
- property.value[j][1] = value;
- }
-
- if (levelOptions.replaceMultipleZeros) {
- optimizeMultipleZeros(property);
- }
-
- if (name == 'background' && levelOptions.optimizeBackground) {
- optimizeBackground(property);
- } else if (name.indexOf('border') === 0 && name.indexOf('radius') > 0 && levelOptions.optimizeBorderRadius) {
- optimizeBorderRadius(property);
- } else if (name == 'filter'&& levelOptions.optimizeFilter && options.compatibility.properties.ieFilters) {
- optimizeFilter(property);
- } else if (name == 'font-weight' && levelOptions.optimizeFontWeight) {
- optimizeFontWeight(property, 0);
- } else if (name == 'outline' && levelOptions.optimizeOutline) {
- optimizeOutline(property);
- }
- }
-
- restoreFromOptimizing(_properties);
- removeUnused(_properties);
- removeComments(properties, options);
-}
-
-function removeComments(tokens, options) {
- var token;
- var i;
-
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
-
- if (token[0] != Token.COMMENT) {
- continue;
- }
-
- optimizeComment(token, options);
-
- if (token[1].length === 0) {
- tokens.splice(i, 1);
- i--;
- }
- }
-}
-
-function optimizeComment(token, options) {
- if (token[1][2] == Marker.EXCLAMATION && (options.level[OptimizationLevel.One].specialComments == 'all' || options.commentsKept < options.level[OptimizationLevel.One].specialComments)) {
- options.commentsKept++;
- return;
- }
-
- token[1] = [];
-}
-
-function cleanupCharsets(tokens) {
- var hasCharset = false;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- if (token[0] != Token.AT_RULE)
- continue;
-
- if (!CHARSET_REGEXP.test(token[1]))
- continue;
-
- if (hasCharset || token[1].indexOf(CHARSET_TOKEN) == -1) {
- tokens.splice(i, 1);
- i--;
- l--;
- } else {
- hasCharset = true;
- tokens.splice(i, 1);
- tokens.unshift([Token.AT_RULE, token[1].replace(CHARSET_REGEXP, CHARSET_TOKEN)]);
- }
- }
-}
-
-function buildUnitRegexp(options) {
- var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%'];
- var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw'];
-
- otherUnits.forEach(function (unit) {
- if (options.compatibility.units[unit]) {
- units.push(unit);
- }
- });
-
- return new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g');
-}
-
-function buildPrecisionOptions(roundingPrecision) {
- var precisionOptions = {
- matcher: null,
- units: {},
- };
- var optimizable = [];
- var unit;
- var value;
-
- for (unit in roundingPrecision) {
- value = roundingPrecision[unit];
-
- if (value != DEFAULT_ROUNDING_PRECISION) {
- precisionOptions.units[unit] = {};
- precisionOptions.units[unit].value = value;
- precisionOptions.units[unit].multiplier = Math.pow(10, value);
-
- optimizable.push(unit);
- }
- }
-
- if (optimizable.length > 0) {
- precisionOptions.enabled = true;
- precisionOptions.decimalPointMatcher = new RegExp('(\\d)\\.($|' + optimizable.join('|') + ')($|\W)', 'g');
- precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g');
- }
-
- return precisionOptions;
-}
-
-function isImport(token) {
- return IMPORT_PREFIX_PATTERN.test(token[1]);
-}
-
-function isLegacyFilter(property) {
- var value;
-
- if (property.name == 'filter' || property.name == '-ms-filter') {
- value = property.value[0][1];
-
- return value.indexOf('progid') > -1 ||
- value.indexOf('alpha') === 0 ||
- value.indexOf('chroma') === 0;
- } else {
- return false;
- }
-}
-
-function level1Optimize(tokens, context) {
- var options = context.options;
- var levelOptions = options.level[OptimizationLevel.One];
- var ie7Hack = options.compatibility.selectors.ie7Hack;
- var adjacentSpace = options.compatibility.selectors.adjacentSpace;
- var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace;
- var format = options.format;
- var mayHaveCharset = false;
- var afterRules = false;
-
- options.unitsRegexp = options.unitsRegexp || buildUnitRegexp(options);
- options.precision = options.precision || buildPrecisionOptions(levelOptions.roundingPrecision);
- options.commentsKept = options.commentsKept || 0;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- switch (token[0]) {
- case Token.AT_RULE:
- token[1] = isImport(token) && afterRules ? '' : token[1];
- token[1] = levelOptions.tidyAtRules ? tidyAtRule(token[1]) : token[1];
- mayHaveCharset = true;
- break;
- case Token.AT_RULE_BLOCK:
- optimizeBody(token[1], token[2], context);
- afterRules = true;
- break;
- case Token.NESTED_BLOCK:
- token[1] = levelOptions.tidyBlockScopes ? tidyBlock(token[1], spaceAfterClosingBrace) : token[1];
- level1Optimize(token[2], context);
- afterRules = true;
- break;
- case Token.COMMENT:
- optimizeComment(token, options);
- break;
- case Token.RULE:
- token[1] = levelOptions.tidySelectors ? tidyRules(token[1], !ie7Hack, adjacentSpace, format, context.warnings) : token[1];
- token[1] = token[1].length > 1 ? sortSelectors(token[1], levelOptions.selectorsSortingMethod) : token[1];
- optimizeBody(token[1], token[2], context);
- afterRules = true;
- break;
- }
-
- if (token[0] == Token.COMMENT && token[1].length === 0 || levelOptions.removeEmpty && (token[1].length === 0 || (token[2] && token[2].length === 0))) {
- tokens.splice(i, 1);
- i--;
- l--;
- }
- }
-
- if (levelOptions.cleanupCharsets && mayHaveCharset) {
- cleanupCharsets(tokens);
- }
-
- return tokens;
-}
-
-module.exports = level1Optimize;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
deleted file mode 100644
index 3deea381c..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
+++ /dev/null
@@ -1,189 +0,0 @@
-var COLORS = {
- aliceblue: '#f0f8ff',
- antiquewhite: '#faebd7',
- aqua: '#0ff',
- aquamarine: '#7fffd4',
- azure: '#f0ffff',
- beige: '#f5f5dc',
- bisque: '#ffe4c4',
- black: '#000',
- blanchedalmond: '#ffebcd',
- blue: '#00f',
- blueviolet: '#8a2be2',
- brown: '#a52a2a',
- burlywood: '#deb887',
- cadetblue: '#5f9ea0',
- chartreuse: '#7fff00',
- chocolate: '#d2691e',
- coral: '#ff7f50',
- cornflowerblue: '#6495ed',
- cornsilk: '#fff8dc',
- crimson: '#dc143c',
- cyan: '#0ff',
- darkblue: '#00008b',
- darkcyan: '#008b8b',
- darkgoldenrod: '#b8860b',
- darkgray: '#a9a9a9',
- darkgreen: '#006400',
- darkgrey: '#a9a9a9',
- darkkhaki: '#bdb76b',
- darkmagenta: '#8b008b',
- darkolivegreen: '#556b2f',
- darkorange: '#ff8c00',
- darkorchid: '#9932cc',
- darkred: '#8b0000',
- darksalmon: '#e9967a',
- darkseagreen: '#8fbc8f',
- darkslateblue: '#483d8b',
- darkslategray: '#2f4f4f',
- darkslategrey: '#2f4f4f',
- darkturquoise: '#00ced1',
- darkviolet: '#9400d3',
- deeppink: '#ff1493',
- deepskyblue: '#00bfff',
- dimgray: '#696969',
- dimgrey: '#696969',
- dodgerblue: '#1e90ff',
- firebrick: '#b22222',
- floralwhite: '#fffaf0',
- forestgreen: '#228b22',
- fuchsia: '#f0f',
- gainsboro: '#dcdcdc',
- ghostwhite: '#f8f8ff',
- gold: '#ffd700',
- goldenrod: '#daa520',
- gray: '#808080',
- green: '#008000',
- greenyellow: '#adff2f',
- grey: '#808080',
- honeydew: '#f0fff0',
- hotpink: '#ff69b4',
- indianred: '#cd5c5c',
- indigo: '#4b0082',
- ivory: '#fffff0',
- khaki: '#f0e68c',
- lavender: '#e6e6fa',
- lavenderblush: '#fff0f5',
- lawngreen: '#7cfc00',
- lemonchiffon: '#fffacd',
- lightblue: '#add8e6',
- lightcoral: '#f08080',
- lightcyan: '#e0ffff',
- lightgoldenrodyellow: '#fafad2',
- lightgray: '#d3d3d3',
- lightgreen: '#90ee90',
- lightgrey: '#d3d3d3',
- lightpink: '#ffb6c1',
- lightsalmon: '#ffa07a',
- lightseagreen: '#20b2aa',
- lightskyblue: '#87cefa',
- lightslategray: '#778899',
- lightslategrey: '#778899',
- lightsteelblue: '#b0c4de',
- lightyellow: '#ffffe0',
- lime: '#0f0',
- limegreen: '#32cd32',
- linen: '#faf0e6',
- magenta: '#ff00ff',
- maroon: '#800000',
- mediumaquamarine: '#66cdaa',
- mediumblue: '#0000cd',
- mediumorchid: '#ba55d3',
- mediumpurple: '#9370db',
- mediumseagreen: '#3cb371',
- mediumslateblue: '#7b68ee',
- mediumspringgreen: '#00fa9a',
- mediumturquoise: '#48d1cc',
- mediumvioletred: '#c71585',
- midnightblue: '#191970',
- mintcream: '#f5fffa',
- mistyrose: '#ffe4e1',
- moccasin: '#ffe4b5',
- navajowhite: '#ffdead',
- navy: '#000080',
- oldlace: '#fdf5e6',
- olive: '#808000',
- olivedrab: '#6b8e23',
- orange: '#ffa500',
- orangered: '#ff4500',
- orchid: '#da70d6',
- palegoldenrod: '#eee8aa',
- palegreen: '#98fb98',
- paleturquoise: '#afeeee',
- palevioletred: '#db7093',
- papayawhip: '#ffefd5',
- peachpuff: '#ffdab9',
- peru: '#cd853f',
- pink: '#ffc0cb',
- plum: '#dda0dd',
- powderblue: '#b0e0e6',
- purple: '#800080',
- rebeccapurple: '#663399',
- red: '#f00',
- rosybrown: '#bc8f8f',
- royalblue: '#4169e1',
- saddlebrown: '#8b4513',
- salmon: '#fa8072',
- sandybrown: '#f4a460',
- seagreen: '#2e8b57',
- seashell: '#fff5ee',
- sienna: '#a0522d',
- silver: '#c0c0c0',
- skyblue: '#87ceeb',
- slateblue: '#6a5acd',
- slategray: '#708090',
- slategrey: '#708090',
- snow: '#fffafa',
- springgreen: '#00ff7f',
- steelblue: '#4682b4',
- tan: '#d2b48c',
- teal: '#008080',
- thistle: '#d8bfd8',
- tomato: '#ff6347',
- turquoise: '#40e0d0',
- violet: '#ee82ee',
- wheat: '#f5deb3',
- white: '#fff',
- whitesmoke: '#f5f5f5',
- yellow: '#ff0',
- yellowgreen: '#9acd32'
-};
-
-var toHex = {};
-var toName = {};
-
-for (var name in COLORS) {
- var hex = COLORS[name];
-
- if (name.length < hex.length) {
- toName[hex] = name;
- } else {
- toHex[name] = hex;
- }
-}
-
-var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
-var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig');
-
-function hexConverter(match, prefix, colorValue, suffix) {
- return prefix + toHex[colorValue.toLowerCase()] + suffix;
-}
-
-function nameConverter(match, colorValue, suffix) {
- return toName[colorValue.toLowerCase()] + suffix;
-}
-
-function shortenHex(value) {
- var hasHex = value.indexOf('#') > -1;
- var shortened = value.replace(toHexPattern, hexConverter);
-
- if (shortened != value) {
- shortened = shortened.replace(toHexPattern, hexConverter);
- }
-
- return hasHex ?
- shortened.replace(toNamePattern, nameConverter) :
- shortened;
-}
-
-module.exports = shortenHex;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
deleted file mode 100644
index fe98dfd39..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// HSL to RGB converter. Both methods adapted from:
-// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-
-function hslToRgb(h, s, l) {
- var r, g, b;
-
- // normalize hue orientation b/w 0 and 360 degrees
- h = h % 360;
- if (h < 0)
- h += 360;
- h = ~~h / 360;
-
- if (s < 0)
- s = 0;
- else if (s > 100)
- s = 100;
- s = ~~s / 100;
-
- if (l < 0)
- l = 0;
- else if (l > 100)
- l = 100;
- l = ~~l / 100;
-
- if (s === 0) {
- r = g = b = l; // achromatic
- } else {
- var q = l < 0.5 ?
- l * (1 + s) :
- l + s - l * s;
- var p = 2 * l - q;
- r = hueToRgb(p, q, h + 1/3);
- g = hueToRgb(p, q, h);
- b = hueToRgb(p, q, h - 1/3);
- }
-
- return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
-}
-
-function hueToRgb(p, q, t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1/6) return p + (q - p) * 6 * t;
- if (t < 1/2) return q;
- if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
- return p;
-}
-
-function shortenHsl(hue, saturation, lightness) {
- var asRgb = hslToRgb(hue, saturation, lightness);
- var redAsHex = asRgb[0].toString(16);
- var greenAsHex = asRgb[1].toString(16);
- var blueAsHex = asRgb[2].toString(16);
-
- return '#' +
- ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
- ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
- ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-}
-
-module.exports = shortenHsl;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
deleted file mode 100644
index 3c0a5fa31..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function shortenRgb(red, green, blue) {
- var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
- var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
- var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
-
- // Credit: Asen http://jsbin.com/UPUmaGOc/2/edit?js,console
- return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
-}
-
-module.exports = shortenRgb;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js b/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
deleted file mode 100644
index 5b261dfb0..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var naturalCompare = require('../../utils/natural-compare');
-
-function naturalSorter(scope1, scope2) {
- return naturalCompare(scope1[1], scope2[1]);
-}
-
-function standardSorter(scope1, scope2) {
- return scope1[1] > scope2[1] ? 1 : -1;
-}
-
-function sortSelectors(selectors, method) {
- switch (method) {
- case 'natural':
- return selectors.sort(naturalSorter);
- case 'standard':
- return selectors.sort(standardSorter);
- case 'none':
- case false:
- return selectors;
- }
-}
-
-module.exports = sortSelectors;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js b/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
deleted file mode 100644
index a7b149fb5..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function tidyAtRule(value) {
- return value
- .replace(/\s+/g, ' ')
- .replace(/url\(\s+/g, 'url(')
- .replace(/\s+\)/g, ')')
- .trim();
-}
-
-module.exports = tidyAtRule;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js b/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
deleted file mode 100644
index 8322aeca7..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
-
-function tidyBlock(values, spaceAfterClosingBrace) {
- var withoutSpaceAfterClosingBrace;
- var i;
-
- for (i = values.length - 1; i >= 0; i--) {
- withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]);
-
- values[i][1] = values[i][1]
- .replace(/\n|\r\n/g, ' ')
- .replace(/\s+/g, ' ')
- .replace(/(,|:|\() /g, '$1')
- .replace(/ \)/g, ')')
- .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1')
- .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1')
- .replace(withoutSpaceAfterClosingBrace ? /\) /g : null, ')');
- }
-
- return values;
-}
-
-module.exports = tidyBlock;
diff --git a/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js b/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
deleted file mode 100644
index d046d0efd..000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
+++ /dev/null
@@ -1,213 +0,0 @@
-var Spaces = require('../../options/format').Spaces;
-var Marker = require('../../tokenizer/marker');
-var formatPosition = require('../../utils/format-position');
-
-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 = /[>\+~]/;
-var WHITESPACE_PATTERN = /\s/;
-
-var ASTERISK_PLUS_HTML_HACK = '*+html ';
-var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html ';
-var LESS_THAN = '<';
-
-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) {
- // continue as always
- } else if (character == Marker.SINGLE_QUOTE || character == Marker.DOUBLE_QUOTE) {
- isQuote = !isQuote;
- } else if (!isQuote && (character == Marker.CLOSE_CURLY_BRACKET || character == Marker.EXCLAMATION || character == LESS_THAN || character == Marker.SEMICOLON)) {
- isInvalid = true;
- break;
- } else if (!isQuote && i === 0 && RELATION_PATTERN.test(character)) {
- isInvalid = true;
- break;
- }
-
- isEscaped = character == Marker.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 roundBracketLevel = 0;
- var wasRelation = false;
- var wasWhitespace = false;
- var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value);
- var spaceAroundRelation = format && format.spaces[Spaces.AroundSelectorRelation];
- var i, l;
-
- for (i = 0, l = value.length; i < l; i++) {
- character = value[i];
-
- isNewLineNix = character == Marker.NEW_LINE_NIX;
- isNewLineWin = character == Marker.NEW_LINE_NIX && value[i - 1] == Marker.CARRIAGE_RETURN;
- isQuoted = isSingleQuoted || isDoubleQuoted;
- isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN.test(character);
- isWhitespace = WHITESPACE_PATTERN.test(character);
-
- 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.OPEN_SQUARE_BRACKET && !isQuoted) {
- stripped.push(character);
- isAttribute = true;
- } else if (character == Marker.CLOSE_SQUARE_BRACKET && !isQuoted) {
- stripped.push(character);
- isAttribute = false;
- } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted) {
- stripped.push(character);
- roundBracketLevel++;
- } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted) {
- stripped.push(character);
- roundBracketLevel--;
- } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
- stripped.push(character);
- isSingleQuoted = true;
- } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
- stripped.push(character);
- isDoubleQuoted = true;
- } else if (character == Marker.SINGLE_QUOTE && isQuoted) {
- stripped.push(character);
- isSingleQuoted = false;
- } else if (character == Marker.DOUBLE_QUOTE && isQuoted) {
- stripped.push(character);
- isDoubleQuoted = false;
- } else if (isWhitespace && wasRelation && !spaceAroundRelation) {
- continue;
- } else if (!isWhitespace && wasRelation && spaceAroundRelation) {
- stripped.push(Marker.SPACE);
- stripped.push(character);
- } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) {
- // skip space
- } else if (isWhitespace && wasWhitespace && !isQuoted) {
- // skip extra space
- } else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) {
- // skip newline
- } else if (isRelation && wasWhitespace && !spaceAroundRelation) {
- stripped.pop();
- stripped.push(character);
- } else if (isRelation && !wasWhitespace && spaceAroundRelation) {
- stripped.push(Marker.SPACE);
- stripped.push(character);
- } else if (isWhitespace) {
- stripped.push(Marker.SPACE);
- } else {
- stripped.push(character);
- }
-
- wasEscaped = isEscaped;
- isEscaped = character == Marker.BACK_SLASH;
- wasRelation = isRelation;
- wasWhitespace = isWhitespace;
- }
-
- return withCaseAttribute ?
- stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') :
- stripped.join('');
-}
-
-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(rules, removeUnsupported, adjacentSpace, format, warnings) {
- var list = [];
- var repeated = [];
-
- function removeHTMLComment(rule, match) {
- warnings.push('HTML comment \'' + match + '\' at ' + formatPosition(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(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(list[0][2][0]) + '. Ignoring.');
- list = [];
- }
-
- return list;
-}
-
-module.exports = tidyRules;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/break-up.js b/node_modules/clean-css/lib/optimizer/level-2/break-up.js
deleted file mode 100644
index 5301cb898..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/break-up.js
+++ /dev/null
@@ -1,644 +0,0 @@
-var InvalidPropertyError = require('./invalid-property-error');
-
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-
-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, compactable) {
- var descriptor = compactable[name];
- if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
- return wrapSingle([
- Token.PROPERTY,
- [Token.PROPERTY_NAME, name],
- [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
- [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
- ]);
- } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
- return wrapSingle([
- Token.PROPERTY,
- [Token.PROPERTY_NAME, name],
- [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
- ]);
- } else {
- return wrapSingle([
- Token.PROPERTY,
- [Token.PROPERTY_NAME, name],
- [Token.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, compactable, validator) {
- var duration = _wrapDefault(property.name + '-duration', property, compactable);
- var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
- var delay = _wrapDefault(property.name + '-delay', property, compactable);
- var iteration = _wrapDefault(property.name + '-iteration-count', property, compactable);
- var direction = _wrapDefault(property.name + '-direction', property, compactable);
- var fill = _wrapDefault(property.name + '-fill-mode', property, compactable);
- var play = _wrapDefault(property.name + '-play-state', property, compactable);
- var name = _wrapDefault(property.name + '-name', property, compactable);
- 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('Invalid animation values at ' + formatPosition(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('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
- }
- }
-
- return components;
-}
-
-function background(property, compactable, validator) {
- var image = _wrapDefault('background-image', property, compactable);
- var position = _wrapDefault('background-position', property, compactable);
- var size = _wrapDefault('background-size', property, compactable);
- var repeat = _wrapDefault('background-repeat', property, compactable);
- var attachment = _wrapDefault('background-attachment', property, compactable);
- var origin = _wrapDefault('background-origin', property, compactable);
- var clip = _wrapDefault('background-clip', property, compactable);
- var color = _wrapDefault('background-color', property, compactable);
- 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.FORWARD_SLASH) {
- size.value = [value];
- } else if (i > 1 && values[i - 2][1] == Marker.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] == compactable[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('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
- }
-
- return components;
-}
-
-function borderRadius(property, compactable) {
- var values = property.value;
- var splitAt = -1;
-
- for (var i = 0, l = values.length; i < l; i++) {
- if (values[i][1] == Marker.FORWARD_SLASH) {
- splitAt = i;
- break;
- }
- }
-
- if (splitAt === 0 || splitAt === values.length - 1) {
- throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
- }
-
- var target = _wrapDefault(property.name, property, compactable);
- target.value = splitAt > -1 ?
- values.slice(0, splitAt) :
- values.slice(0);
- target.components = fourValues(target, compactable);
-
- var remainder = _wrapDefault(property.name, property, compactable);
- remainder.value = splitAt > -1 ?
- values.slice(splitAt + 1) :
- values.slice(0);
- remainder.components = fourValues(remainder, compactable);
-
- 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(property, compactable, validator) {
- var style = _wrapDefault('font-style', property, compactable);
- var variant = _wrapDefault('font-variant', property, compactable);
- var weight = _wrapDefault('font-weight', property, compactable);
- var stretch = _wrapDefault('font-stretch', property, compactable);
- var size = _wrapDefault('font-size', property, compactable);
- var height = _wrapDefault('line-height', property, compactable);
- var family = _wrapDefault('font-family', property, compactable);
- 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('Missing font values at ' + formatPosition(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.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('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
- }
-
- if (values.length > 1 && _anyIsInherit(values)) {
- throw new InvalidPropertyError('Invalid font values at ' + formatPosition(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('Invalid font style / variant / weight / stretch value at ' + formatPosition(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('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
- }
-
- if (!values[index]) {
- throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
- }
-
- // ... and perhaps line-height
- if (isSizeSet && values[index] && values[index][1] == Marker.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.COMMA) {
- appendableFamilyName = false;
- } else {
- if (appendableFamilyName) {
- family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
- } else {
- family.value.push(values[index]);
- }
-
- appendableFamilyName = true;
- }
-
- index++;
- }
-
- if (family.value.length === 0) {
- throw new InvalidPropertyError('Missing font family at ' + formatPosition(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])) {
- return true;
- }
- }
-
- return false;
-}
-
-function fourValues(property, compactable) {
- var componentNames = compactable[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([
- Token.PROPERTY,
- [Token.PROPERTY_NAME, componentNames[i]]
- ]);
- component.value = [value[i]];
- components.unshift(component);
- }
-
- return components;
-}
-
-function multiplex(splitWith) {
- return function (property, compactable, 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, compactable, 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, compactable);
- _property.value = values.slice(from, to);
-
- splitComponents.push(splitWith(_property, compactable, 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.PROPERTY_VALUE, Marker.COMMA]);
- Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
- }
- }
-
- return components;
- };
-}
-
-function listStyle(property, compactable, validator) {
- var type = _wrapDefault('list-style-type', property, compactable);
- var position = _wrapDefault('list-style-position', property, compactable);
- var image = _wrapDefault('list-style-image', property, compactable);
- 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, compactable, validator) {
- var prop = _wrapDefault(property.name + '-property', property, compactable);
- var duration = _wrapDefault(property.name + '-duration', property, compactable);
- var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
- var delay = _wrapDefault(property.name + '-delay', property, compactable);
- 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('Invalid animation values at ' + formatPosition(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('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
- }
- }
-
- return components;
-}
-
-function widthStyleColor(property, compactable, validator) {
- var descriptor = compactable[property.name];
- var components = [
- _wrapDefault(descriptor.components[0], property, compactable),
- _wrapDefault(descriptor.components[1], property, compactable),
- _wrapDefault(descriptor.components[2], property, compactable)
- ];
- 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;
-}
-
-module.exports = {
- animation: animation,
- background: background,
- border: widthStyleColor,
- borderRadius: borderRadius,
- font: font,
- fourValues: fourValues,
- listStyle: listStyle,
- multiplex: multiplex,
- outline: widthStyleColor,
- transition: transition
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/can-override.js b/node_modules/clean-css/lib/optimizer/level-2/can-override.js
deleted file mode 100644
index 3dae08f0e..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/can-override.js
+++ /dev/null
@@ -1,283 +0,0 @@
-var understandable = require('./properties/understandable');
-
-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(value2);
-}
-
-function animationName(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
-}
-
-function areSameFunction(validator, value1, value2) {
- if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
- return false;
- }
-
- var function1Name = value1.substring(0, value1.indexOf('('));
- var function2Name = value2.substring(0, value2.indexOf('('));
-
- return function1Name === function2Name;
-}
-
-function backgroundPosition(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
- return true;
- }
-
- return unit(validator, value1, value2);
-}
-
-function backgroundSize(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
- return true;
- }
-
- return unit(validator, value1, value2);
-}
-
-function color(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
- return false;
- } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
- return false;
- } else if (validator.isColor(value1) && validator.isColor(value2)) {
- return true;
- }
-
- return sameFunctionOrValue(validator, value1, value2);
-}
-
-function components(overrideCheckers) {
- return function (validator, value1, value2, position) {
- return overrideCheckers[position](validator, value1, value2);
- };
-}
-
-function fontFamily(validator, value1, value2) {
- return understandable(validator, value1, value2, 0, true);
-}
-
-function image(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (validator.isImage(value2)) {
- return true;
- } else if (validator.isImage(value1)) {
- return false;
- }
-
- return sameFunctionOrValue(validator, value1, value2);
-}
-
-function keyword(propertyName) {
- return function(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isKeyword(propertyName)(value2);
- };
-}
-
-function keywordWithGlobal(propertyName) {
- return function(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
- };
-}
-
-function propertyName(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isIdentifier(value2);
-}
-
-function sameFunctionOrValue(validator, value1, value2) {
- return areSameFunction(validator, value1, value2) ?
- true :
- value1 === value2;
-}
-
-function textShadow(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
-}
-
-function time(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (validator.isTime(value1) && !validator.isTime(value2)) {
- return false;
- } else if (validator.isTime(value2)) {
- return true;
- } else if (validator.isTime(value1)) {
- return false;
- } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
- return true;
- }
-
- return sameFunctionOrValue(validator, value1, value2);
-}
-
-function timingFunction(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isTimingFunction(value2) || validator.isGlobal(value2);
-}
-
-function unit(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if (validator.isUnit(value1) && !validator.isUnit(value2)) {
- return false;
- } else if (validator.isUnit(value2)) {
- return true;
- } else if (validator.isUnit(value1)) {
- return false;
- } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
- return true;
- }
-
- return sameFunctionOrValue(validator, value1, value2);
-}
-
-function unitOrKeywordWithGlobal(propertyName) {
- var byKeyword = keywordWithGlobal(propertyName);
-
- return function(validator, value1, value2) {
- return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
- };
-}
-
-function unitOrNumber(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
- return false;
- } else if (validator.isUnit(value2) || validator.isNumber(value2)) {
- return true;
- } else if (validator.isUnit(value1) || validator.isNumber(value1)) {
- return false;
- } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
- return true;
- }
-
- return sameFunctionOrValue(validator, value1, value2);
-}
-
-function zIndex(validator, value1, value2) {
- if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
- return false;
- } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
- return true;
- }
-
- return validator.isZIndex(value2);
-}
-
-module.exports = {
- generic: {
- color: color,
- components: components,
- image: image,
- propertyName: propertyName,
- time: time,
- timingFunction: timingFunction,
- unit: unit,
- unitOrNumber: unitOrNumber
- },
- property: {
- animationDirection: keywordWithGlobal('animation-direction'),
- animationFillMode: keyword('animation-fill-mode'),
- animationIterationCount: animationIterationCount,
- animationName: animationName,
- animationPlayState: keywordWithGlobal('animation-play-state'),
- backgroundAttachment: keyword('background-attachment'),
- backgroundClip: keywordWithGlobal('background-clip'),
- backgroundOrigin: keyword('background-origin'),
- backgroundPosition: backgroundPosition,
- backgroundRepeat: keyword('background-repeat'),
- backgroundSize: backgroundSize,
- bottom: unitOrKeywordWithGlobal('bottom'),
- borderCollapse: keyword('border-collapse'),
- borderStyle: keywordWithGlobal('*-style'),
- clear: keywordWithGlobal('clear'),
- cursor: keywordWithGlobal('cursor'),
- display: keywordWithGlobal('display'),
- float: keywordWithGlobal('float'),
- left: unitOrKeywordWithGlobal('left'),
- fontFamily: fontFamily,
- fontStretch: keywordWithGlobal('font-stretch'),
- fontStyle: keywordWithGlobal('font-style'),
- fontVariant: keywordWithGlobal('font-variant'),
- fontWeight: keywordWithGlobal('font-weight'),
- listStyleType: keywordWithGlobal('list-style-type'),
- listStylePosition: keywordWithGlobal('list-style-position'),
- outlineStyle: keywordWithGlobal('*-style'),
- overflow: keywordWithGlobal('overflow'),
- position: keywordWithGlobal('position'),
- right: unitOrKeywordWithGlobal('right'),
- textAlign: keywordWithGlobal('text-align'),
- textDecoration: keywordWithGlobal('text-decoration'),
- textOverflow: keywordWithGlobal('text-overflow'),
- textShadow: textShadow,
- top: unitOrKeywordWithGlobal('top'),
- transform: sameFunctionOrValue,
- verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
- visibility: keywordWithGlobal('visibility'),
- whiteSpace: keywordWithGlobal('white-space'),
- zIndex: zIndex
- }
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/clone.js b/node_modules/clean-css/lib/optimizer/level-2/clone.js
deleted file mode 100644
index 3830095e9..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/clone.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-
-function deep(property) {
- var cloned = shallow(property);
- for (var i = property.components.length - 1; i >= 0; i--) {
- var component = shallow(property.components[i]);
- component.value = property.components[i].value.slice(0);
- cloned.components.unshift(component);
- }
-
- cloned.dirty = true;
- cloned.value = property.value.slice(0);
-
- return cloned;
-}
-
-function shallow(property) {
- var cloned = wrapSingle([
- Token.PROPERTY,
- [Token.PROPERTY_NAME, property.name]
- ]);
- cloned.important = property.important;
- cloned.hack = property.hack;
- cloned.unused = false;
- return cloned;
-}
-
-module.exports = {
- deep: deep,
- shallow: shallow
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/compactable.js b/node_modules/clean-css/lib/optimizer/level-2/compactable.js
deleted file mode 100644
index 73f42a10e..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/compactable.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-// Contains the interpretation of CSS properties, as used by the property optimizer
-
-var breakUp = require('./break-up');
-var canOverride = require('./can-override');
-var restore = require('./restore');
-
-var override = require('../../utils/override');
-
-// Properties to process
-// Extend this object in order to add support for more properties in the optimizer.
-//
-// Each key in this object represents a CSS property and should be an object.
-// Such an object contains properties that describe how the represented CSS property should be handled.
-// Possible options:
-//
-// * components: array (Only specify for shorthand properties.)
-// Contains the names of the granular properties this shorthand compacts.
-//
-// * canOverride: function
-// Returns whether two tokens of this property can be merged with each other.
-// This property has no meaning for shorthands.
-//
-// * defaultValue: string
-// Specifies the default value of the property according to the CSS standard.
-// For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
-//
-// * shortestValue: string
-// Specifies the shortest possible value the property can possibly have.
-// (Falls back to defaultValue if unspecified.)
-//
-// * breakUp: function (Only specify for shorthand properties.)
-// Breaks the shorthand up to its components.
-//
-// * restore: function (Only specify for shorthand properties.)
-// Puts the shorthand together from its components.
-//
-var compactable = {
- 'animation': {
- canOverride: canOverride.generic.components([
- canOverride.generic.time,
- canOverride.generic.timingFunction,
- canOverride.generic.time,
- canOverride.property.animationIterationCount,
- canOverride.property.animationDirection,
- canOverride.property.animationFillMode,
- canOverride.property.animationPlayState,
- canOverride.property.animationName
- ]),
- components: [
- 'animation-duration',
- 'animation-timing-function',
- 'animation-delay',
- 'animation-iteration-count',
- 'animation-direction',
- 'animation-fill-mode',
- 'animation-play-state',
- 'animation-name'
- ],
- breakUp: breakUp.multiplex(breakUp.animation),
- defaultValue: 'none',
- restore: restore.multiplex(restore.withoutDefaults),
- shorthand: true,
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-delay': {
- canOverride: canOverride.generic.time,
- componentOf: [
- 'animation'
- ],
- defaultValue: '0s',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-direction': {
- canOverride: canOverride.property.animationDirection,
- componentOf: [
- 'animation'
- ],
- defaultValue: 'normal',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-duration': {
- canOverride: canOverride.generic.time,
- componentOf: [
- 'animation'
- ],
- defaultValue: '0s',
- intoMultiplexMode: 'real',
- keepUnlessDefault: 'animation-delay',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-fill-mode': {
- canOverride: canOverride.property.animationFillMode,
- componentOf: [
- 'animation'
- ],
- defaultValue: 'none',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-iteration-count': {
- canOverride: canOverride.property.animationIterationCount,
- componentOf: [
- 'animation'
- ],
- defaultValue: '1',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-name': {
- canOverride: canOverride.property.animationName,
- componentOf: [
- 'animation'
- ],
- defaultValue: 'none',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-play-state': {
- canOverride: canOverride.property.animationPlayState,
- componentOf: [
- 'animation'
- ],
- defaultValue: 'running',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'animation-timing-function': {
- canOverride: canOverride.generic.timingFunction,
- componentOf: [
- 'animation'
- ],
- defaultValue: 'ease',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'background': {
- canOverride: canOverride.generic.components([
- canOverride.generic.image,
- canOverride.property.backgroundPosition,
- canOverride.property.backgroundSize,
- canOverride.property.backgroundRepeat,
- canOverride.property.backgroundAttachment,
- canOverride.property.backgroundOrigin,
- canOverride.property.backgroundClip,
- canOverride.generic.color
- ]),
- components: [
- 'background-image',
- 'background-position',
- 'background-size',
- 'background-repeat',
- 'background-attachment',
- 'background-origin',
- 'background-clip',
- 'background-color'
- ],
- breakUp: breakUp.multiplex(breakUp.background),
- defaultValue: '0 0',
- restore: restore.multiplex(restore.background),
- shortestValue: '0',
- shorthand: true
- },
- 'background-attachment': {
- canOverride: canOverride.property.backgroundAttachment,
- componentOf: [
- 'background'
- ],
- defaultValue: 'scroll',
- intoMultiplexMode: 'real'
- },
- 'background-clip': {
- canOverride: canOverride.property.backgroundClip,
- componentOf: [
- 'background'
- ],
- defaultValue: 'border-box',
- intoMultiplexMode: 'real',
- shortestValue: 'border-box'
- },
- 'background-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'background'
- ],
- defaultValue: 'transparent',
- intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
- multiplexLastOnly: true,
- nonMergeableValue: 'none',
- shortestValue: 'red'
- },
- 'background-image': {
- canOverride: canOverride.generic.image,
- componentOf: [
- 'background'
- ],
- defaultValue: 'none',
- intoMultiplexMode: 'default'
- },
- 'background-origin': {
- canOverride: canOverride.property.backgroundOrigin,
- componentOf: [
- 'background'
- ],
- defaultValue: 'padding-box',
- intoMultiplexMode: 'real',
- shortestValue: 'border-box'
- },
- 'background-position': {
- canOverride: canOverride.property.backgroundPosition,
- componentOf: [
- 'background'
- ],
- defaultValue: ['0', '0'],
- doubleValues: true,
- intoMultiplexMode: 'real',
- shortestValue: '0'
- },
- 'background-repeat': {
- canOverride: canOverride.property.backgroundRepeat,
- componentOf: [
- 'background'
- ],
- defaultValue: ['repeat'],
- doubleValues: true,
- intoMultiplexMode: 'real'
- },
- 'background-size': {
- canOverride: canOverride.property.backgroundSize,
- componentOf: [
- 'background'
- ],
- defaultValue: ['auto'],
- doubleValues: true,
- intoMultiplexMode: 'real',
- shortestValue: '0 0'
- },
- 'bottom': {
- canOverride: canOverride.property.bottom,
- defaultValue: 'auto'
- },
- 'border': {
- breakUp: breakUp.border,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.property.borderStyle,
- canOverride.generic.color
- ]),
- components: [
- 'border-width',
- 'border-style',
- 'border-color'
- ],
- defaultValue: 'none',
- overridesShorthands: [
- 'border-bottom',
- 'border-left',
- 'border-right',
- 'border-top'
- ],
- restore: restore.withoutDefaults,
- shorthand: true,
- shorthandComponents: true
- },
- 'border-bottom': {
- breakUp: breakUp.border,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.property.borderStyle,
- canOverride.generic.color
- ]),
- components: [
- 'border-bottom-width',
- 'border-bottom-style',
- 'border-bottom-color'
- ],
- defaultValue: 'none',
- restore: restore.withoutDefaults,
- shorthand: true
- },
- 'border-bottom-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'border-bottom',
- 'border-color'
- ],
- defaultValue: 'none'
- },
- 'border-bottom-left-radius': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-radius'
- ],
- defaultValue: '0',
- vendorPrefixes: [
- '-moz-',
- '-o-'
- ]
- },
- 'border-bottom-right-radius': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-radius'
- ],
- defaultValue: '0',
- vendorPrefixes: [
- '-moz-',
- '-o-'
- ]
- },
- 'border-bottom-style': {
- canOverride: canOverride.property.borderStyle,
- componentOf: [
- 'border-bottom',
- 'border-style'
- ],
- defaultValue: 'none'
- },
- 'border-bottom-width': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-bottom',
- 'border-width'
- ],
- defaultValue: 'medium',
- oppositeTo: 'border-top-width',
- shortestValue: '0'
- },
- 'border-collapse': {
- canOverride: canOverride.property.borderCollapse,
- defaultValue: 'separate'
- },
- 'border-color': {
- breakUp: breakUp.fourValues,
- canOverride: canOverride.generic.components([
- canOverride.generic.color,
- canOverride.generic.color,
- canOverride.generic.color,
- canOverride.generic.color
- ]),
- componentOf: [
- 'border'
- ],
- components: [
- 'border-top-color',
- 'border-right-color',
- 'border-bottom-color',
- 'border-left-color'
- ],
- defaultValue: 'none',
- restore: restore.fourValues,
- shortestValue: 'red',
- shorthand: true
- },
- 'border-left': {
- breakUp: breakUp.border,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.property.borderStyle,
- canOverride.generic.color
- ]),
- components: [
- 'border-left-width',
- 'border-left-style',
- 'border-left-color'
- ],
- defaultValue: 'none',
- restore: restore.withoutDefaults,
- shorthand: true
- },
- 'border-left-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'border-color',
- 'border-left'
- ],
- defaultValue: 'none'
- },
- 'border-left-style': {
- canOverride: canOverride.property.borderStyle,
- componentOf: [
- 'border-left',
- 'border-style'
- ],
- defaultValue: 'none'
- },
- 'border-left-width': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-left',
- 'border-width'
- ],
- defaultValue: 'medium',
- oppositeTo: 'border-right-width',
- shortestValue: '0'
- },
- 'border-radius': {
- breakUp: breakUp.borderRadius,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit
- ]),
- components: [
- 'border-top-left-radius',
- 'border-top-right-radius',
- 'border-bottom-right-radius',
- 'border-bottom-left-radius'
- ],
- defaultValue: '0',
- restore: restore.borderRadius,
- shorthand: true,
- vendorPrefixes: [
- '-moz-',
- '-o-'
- ]
- },
- 'border-right': {
- breakUp: breakUp.border,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.property.borderStyle,
- canOverride.generic.color
- ]),
- components: [
- 'border-right-width',
- 'border-right-style',
- 'border-right-color'
- ],
- defaultValue: 'none',
- restore: restore.withoutDefaults,
- shorthand: true
- },
- 'border-right-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'border-color',
- 'border-right'
- ],
- defaultValue: 'none'
- },
- 'border-right-style': {
- canOverride: canOverride.property.borderStyle,
- componentOf: [
- 'border-right',
- 'border-style'
- ],
- defaultValue: 'none'
- },
- 'border-right-width': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-right',
- 'border-width'
- ],
- defaultValue: 'medium',
- oppositeTo: 'border-left-width',
- shortestValue: '0'
- },
- 'border-style': {
- breakUp: breakUp.fourValues,
- canOverride: canOverride.generic.components([
- canOverride.property.borderStyle,
- canOverride.property.borderStyle,
- canOverride.property.borderStyle,
- canOverride.property.borderStyle
- ]),
- componentOf: [
- 'border'
- ],
- components: [
- 'border-top-style',
- 'border-right-style',
- 'border-bottom-style',
- 'border-left-style'
- ],
- defaultValue: 'none',
- restore: restore.fourValues,
- shorthand: true
- },
- 'border-top': {
- breakUp: breakUp.border,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.property.borderStyle,
- canOverride.generic.color
- ]),
- components: [
- 'border-top-width',
- 'border-top-style',
- 'border-top-color'
- ],
- defaultValue: 'none',
- restore: restore.withoutDefaults,
- shorthand: true
- },
- 'border-top-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'border-color',
- 'border-top'
- ],
- defaultValue: 'none'
- },
- 'border-top-left-radius': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-radius'
- ],
- defaultValue: '0',
- vendorPrefixes: [
- '-moz-',
- '-o-'
- ]
- },
- 'border-top-right-radius': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-radius'
- ],
- defaultValue: '0',
- vendorPrefixes: [
- '-moz-',
- '-o-'
- ]
- },
- 'border-top-style': {
- canOverride: canOverride.property.borderStyle,
- componentOf: [
- 'border-style',
- 'border-top'
- ],
- defaultValue: 'none'
- },
- 'border-top-width': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'border-top',
- 'border-width'
- ],
- defaultValue: 'medium',
- oppositeTo: 'border-bottom-width',
- shortestValue: '0'
- },
- 'border-width': {
- breakUp: breakUp.fourValues,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit
- ]),
- componentOf: [
- 'border'
- ],
- components: [
- 'border-top-width',
- 'border-right-width',
- 'border-bottom-width',
- 'border-left-width'
- ],
- defaultValue: 'medium',
- restore: restore.fourValues,
- shortestValue: '0',
- shorthand: true
- },
- 'clear': {
- canOverride: canOverride.property.clear,
- defaultValue: 'none'
- },
- 'color': {
- canOverride: canOverride.generic.color,
- defaultValue: 'transparent',
- shortestValue: 'red'
- },
- 'cursor': {
- canOverride: canOverride.property.cursor,
- defaultValue: 'auto'
- },
- 'display': {
- canOverride: canOverride.property.display,
- },
- 'float': {
- canOverride: canOverride.property.float,
- defaultValue: 'none'
- },
- 'font': {
- breakUp: breakUp.font,
- canOverride: canOverride.generic.components([
- canOverride.property.fontStyle,
- canOverride.property.fontVariant,
- canOverride.property.fontWeight,
- canOverride.property.fontStretch,
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.property.fontFamily
- ]),
- components: [
- 'font-style',
- 'font-variant',
- 'font-weight',
- 'font-stretch',
- 'font-size',
- 'line-height',
- 'font-family'
- ],
- restore: restore.font,
- shorthand: true
- },
- 'font-family': {
- canOverride: canOverride.property.fontFamily,
- defaultValue: 'user|agent|specific'
- },
- 'font-size': {
- canOverride: canOverride.generic.unit,
- defaultValue: 'medium',
- shortestValue: '0'
- },
- 'font-stretch': {
- canOverride: canOverride.property.fontStretch,
- defaultValue: 'normal'
- },
- 'font-style': {
- canOverride: canOverride.property.fontStyle,
- defaultValue: 'normal'
- },
- 'font-variant': {
- canOverride: canOverride.property.fontVariant,
- defaultValue: 'normal'
- },
- 'font-weight': {
- canOverride: canOverride.property.fontWeight,
- defaultValue: 'normal',
- shortestValue: '400'
- },
- 'height': {
- canOverride: canOverride.generic.unit,
- defaultValue: 'auto',
- shortestValue: '0'
- },
- 'left': {
- canOverride: canOverride.property.left,
- defaultValue: 'auto'
- },
- 'line-height': {
- canOverride: canOverride.generic.unitOrNumber,
- defaultValue: 'normal',
- shortestValue: '0'
- },
- 'list-style': {
- canOverride: canOverride.generic.components([
- canOverride.property.listStyleType,
- canOverride.property.listStylePosition,
- canOverride.property.listStyleImage
- ]),
- components: [
- 'list-style-type',
- 'list-style-position',
- 'list-style-image'
- ],
- breakUp: breakUp.listStyle,
- restore: restore.withoutDefaults,
- defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
- shortestValue: 'none',
- shorthand: true
- },
- 'list-style-image' : {
- canOverride: canOverride.generic.image,
- componentOf: [
- 'list-style'
- ],
- defaultValue: 'none'
- },
- 'list-style-position' : {
- canOverride: canOverride.property.listStylePosition,
- componentOf: [
- 'list-style'
- ],
- defaultValue: 'outside',
- shortestValue: 'inside'
- },
- 'list-style-type' : {
- canOverride: canOverride.property.listStyleType,
- componentOf: [
- 'list-style'
- ],
- // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
- // this is a hack, but it doesn't matter because this value will be either overridden or
- // it will disappear at the final step anyway
- defaultValue: 'decimal|disc',
- shortestValue: 'none'
- },
- 'margin': {
- breakUp: breakUp.fourValues,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit
- ]),
- components: [
- 'margin-top',
- 'margin-right',
- 'margin-bottom',
- 'margin-left'
- ],
- defaultValue: '0',
- restore: restore.fourValues,
- shorthand: true
- },
- 'margin-bottom': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'margin'
- ],
- defaultValue: '0',
- oppositeTo: 'margin-top'
- },
- 'margin-left': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'margin'
- ],
- defaultValue: '0',
- oppositeTo: 'margin-right'
- },
- 'margin-right': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'margin'
- ],
- defaultValue: '0',
- oppositeTo: 'margin-left'
- },
- 'margin-top': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'margin'
- ],
- defaultValue: '0',
- oppositeTo: 'margin-bottom'
- },
- 'outline': {
- canOverride: canOverride.generic.components([
- canOverride.generic.color,
- canOverride.property.outlineStyle,
- canOverride.generic.unit
- ]),
- components: [
- 'outline-color',
- 'outline-style',
- 'outline-width'
- ],
- breakUp: breakUp.outline,
- restore: restore.withoutDefaults,
- defaultValue: '0',
- shorthand: true
- },
- 'outline-color': {
- canOverride: canOverride.generic.color,
- componentOf: [
- 'outline'
- ],
- defaultValue: 'invert',
- shortestValue: 'red'
- },
- 'outline-style': {
- canOverride: canOverride.property.outlineStyle,
- componentOf: [
- 'outline'
- ],
- defaultValue: 'none'
- },
- 'outline-width': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'outline'
- ],
- defaultValue: 'medium',
- shortestValue: '0'
- },
- 'overflow': {
- canOverride: canOverride.property.overflow,
- defaultValue: 'visible'
- },
- 'overflow-x': {
- canOverride: canOverride.property.overflow,
- defaultValue: 'visible'
- },
- 'overflow-y': {
- canOverride: canOverride.property.overflow,
- defaultValue: 'visible'
- },
- 'padding': {
- breakUp: breakUp.fourValues,
- canOverride: canOverride.generic.components([
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit,
- canOverride.generic.unit
- ]),
- components: [
- 'padding-top',
- 'padding-right',
- 'padding-bottom',
- 'padding-left'
- ],
- defaultValue: '0',
- restore: restore.fourValues,
- shorthand: true
- },
- 'padding-bottom': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'padding'
- ],
- defaultValue: '0',
- oppositeTo: 'padding-top'
- },
- 'padding-left': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'padding'
- ],
- defaultValue: '0',
- oppositeTo: 'padding-right'
- },
- 'padding-right': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'padding'
- ],
- defaultValue: '0',
- oppositeTo: 'padding-left'
- },
- 'padding-top': {
- canOverride: canOverride.generic.unit,
- componentOf: [
- 'padding'
- ],
- defaultValue: '0',
- oppositeTo: 'padding-bottom'
- },
- 'position': {
- canOverride: canOverride.property.position,
- defaultValue: 'static'
- },
- 'right': {
- canOverride: canOverride.property.right,
- defaultValue: 'auto'
- },
- 'text-align': {
- canOverride: canOverride.property.textAlign,
- // NOTE: we can't tell the real default value here, as it depends on default text direction
- // this is a hack, but it doesn't matter because this value will be either overridden or
- // it will disappear anyway
- defaultValue: 'left|right'
- },
- 'text-decoration': {
- canOverride: canOverride.property.textDecoration,
- defaultValue: 'none'
- },
- 'text-overflow': {
- canOverride: canOverride.property.textOverflow,
- defaultValue: 'none'
- },
- 'text-shadow': {
- canOverride: canOverride.property.textShadow,
- defaultValue: 'none'
- },
- 'top': {
- canOverride: canOverride.property.top,
- defaultValue: 'auto'
- },
- 'transform': {
- canOverride: canOverride.property.transform,
- vendorPrefixes: [
- '-moz-',
- '-ms-',
- '-webkit-'
- ]
- },
- 'transition': {
- breakUp: breakUp.multiplex(breakUp.transition),
- canOverride: canOverride.generic.components([
- canOverride.property.transitionProperty,
- canOverride.generic.time,
- canOverride.generic.timingFunction,
- canOverride.generic.time
- ]),
- components: [
- 'transition-property',
- 'transition-duration',
- 'transition-timing-function',
- 'transition-delay'
- ],
- defaultValue: 'none',
- restore: restore.multiplex(restore.withoutDefaults),
- shorthand: true,
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'transition-delay': {
- canOverride: canOverride.generic.time,
- componentOf: [
- 'transition'
- ],
- defaultValue: '0s',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'transition-duration': {
- canOverride: canOverride.generic.time,
- componentOf: [
- 'transition'
- ],
- defaultValue: '0s',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'transition-property': {
- canOverride: canOverride.generic.propertyName,
- componentOf: [
- 'transition'
- ],
- defaultValue: 'all',
- intoMultiplexMode: 'placeholder',
- placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'transition-timing-function': {
- canOverride: canOverride.generic.timingFunction,
- componentOf: [
- 'transition'
- ],
- defaultValue: 'ease',
- intoMultiplexMode: 'real',
- vendorPrefixes: [
- '-moz-',
- '-o-',
- '-webkit-'
- ]
- },
- 'vertical-align': {
- canOverride: canOverride.property.verticalAlign,
- defaultValue: 'baseline'
- },
- 'visibility': {
- canOverride: canOverride.property.visibility,
- defaultValue: 'visible'
- },
- 'white-space': {
- canOverride: canOverride.property.whiteSpace,
- defaultValue: 'normal'
- },
- 'width': {
- canOverride: canOverride.generic.unit,
- defaultValue: 'auto',
- shortestValue: '0'
- },
- 'z-index': {
- canOverride: canOverride.property.zIndex,
- defaultValue: 'auto'
- }
-};
-
-function cloneDescriptor(propertyName, prefix) {
- var clonedDescriptor = override(compactable[propertyName], {});
-
- if ('componentOf' in clonedDescriptor) {
- clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
- return prefix + shorthandName;
- });
- }
-
- if ('components' in clonedDescriptor) {
- clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
- return prefix + longhandName;
- });
- }
-
- if ('keepUnlessDefault' in clonedDescriptor) {
- clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
- }
-
- return clonedDescriptor;
-}
-
-// generate vendor-prefixed properties
-var vendorPrefixedCompactable = {};
-
-for (var propertyName in compactable) {
- var descriptor = compactable[propertyName];
-
- if (!('vendorPrefixes' in descriptor)) {
- continue;
- }
-
- for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
- var prefix = descriptor.vendorPrefixes[i];
- var clonedDescriptor = cloneDescriptor(propertyName, prefix);
- delete clonedDescriptor.vendorPrefixes;
-
- vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor;
- }
-
- delete descriptor.vendorPrefixes;
-}
-
-module.exports = override(compactable, vendorPrefixedCompactable);
diff --git a/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js b/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
deleted file mode 100644
index 8b9b1c2e0..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// This extractor is used in level 2 optimizations
-// IMPORTANT: Mind Token class and this code is not related!
-// Properties will be tokenized in one step, see #429
-
-var Token = require('../../tokenizer/token');
-var serializeRules = require('../../writer/one-time').rules;
-var serializeValue = require('../../writer/one-time').value;
-
-function extractProperties(token) {
- var properties = [];
- var inSpecificSelector;
- var property;
- var name;
- var value;
- var i, l;
-
- if (token[0] == Token.RULE) {
- inSpecificSelector = !/[\.\+>~]/.test(serializeRules(token[1]));
-
- for (i = 0, l = token[2].length; i < l; i++) {
- property = token[2][i];
-
- if (property[0] != Token.PROPERTY)
- continue;
-
- name = property[1][1];
- if (name.length === 0)
- continue;
-
- if (name.indexOf('--') === 0)
- continue;
-
- value = serializeValue(property, i);
-
- properties.push([
- name,
- value,
- findNameRoot(name),
- token[2][i],
- name + ':' + value,
- token[1],
- inSpecificSelector
- ]);
- }
- } else if (token[0] == Token.NESTED_BLOCK) {
- for (i = 0, l = token[2].length; i < l; i++) {
- properties = properties.concat(extractProperties(token[2][i]));
- }
- }
-
- return properties;
-}
-
-function findNameRoot(name) {
- if (name == 'list-style')
- return name;
- if (name.indexOf('-radius') > 0)
- return 'border-radius';
- if (name == 'border-collapse' || name == 'border-spacing' || name == 'border-image')
- return name;
- if (name.indexOf('border-') === 0 && /^border\-\w+\-\w+$/.test(name))
- return name.match(/border\-\w+/)[0];
- if (name.indexOf('border-') === 0 && /^border\-\w+$/.test(name))
- return 'border';
- if (name.indexOf('text-') === 0)
- return name;
- if (name == '-chrome-')
- return name;
-
- return name.replace(/^\-\w+\-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase();
-}
-
-module.exports = extractProperties;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js b/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
deleted file mode 100644
index 86d5b5f9b..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function InvalidPropertyError(message) {
- this.name = 'InvalidPropertyError';
- this.message = message;
- this.stack = (new Error()).stack;
-}
-
-InvalidPropertyError.prototype = Object.create(Error.prototype);
-InvalidPropertyError.prototype.constructor = InvalidPropertyError;
-
-module.exports = InvalidPropertyError;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js b/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
deleted file mode 100644
index 29049302a..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
+++ /dev/null
@@ -1,259 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-var split = require('../../utils/split');
-
-var DEEP_SELECTOR_PATTERN = /\/deep\//;
-var DOUBLE_COLON_PATTERN = /^::/;
-var NOT_PSEUDO = ':not';
-var PSEUDO_CLASSES_WITH_ARGUMENTS = [
- ':dir',
- ':lang',
- ':not',
- ':nth-child',
- ':nth-last-child',
- ':nth-last-of-type',
- ':nth-of-type'
-];
-var RELATION_PATTERN = /[>\+~]/;
-var UNMIXABLE_PSEUDO_CLASSES = [
- ':after',
- ':before',
- ':first-letter',
- ':first-line',
- ':lang'
-];
-var UNMIXABLE_PSEUDO_ELEMENTS = [
- '::after',
- '::before',
- '::first-letter',
- '::first-line'
-];
-
-var Level = {
- DOUBLE_QUOTE: 'double-quote',
- SINGLE_QUOTE: 'single-quote',
- ROOT: 'root'
-};
-
-function isMergeable(selector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
- var singleSelectors = split(selector, Marker.COMMA);
- var singleSelector;
- var i, l;
-
- for (i = 0, l = singleSelectors.length; i < l; i++) {
- singleSelector = singleSelectors[i];
-
- if (singleSelector.length === 0 ||
- isDeepSelector(singleSelector) ||
- (singleSelector.indexOf(Marker.COLON) > -1 && !areMergeable(singleSelector, extractPseudoFrom(singleSelector), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging))) {
- return false;
- }
- }
-
- return true;
-}
-
-function isDeepSelector(selector) {
- return DEEP_SELECTOR_PATTERN.test(selector);
-}
-
-function extractPseudoFrom(selector) {
- var list = [];
- var character;
- var buffer = [];
- var level = Level.ROOT;
- var roundBracketLevel = 0;
- var isQuoted;
- var isEscaped;
- var isPseudo = false;
- var isRelation;
- var wasColon = false;
- var index;
- var len;
-
- for (index = 0, len = selector.length; index < len; index++) {
- character = selector[index];
-
- isRelation = !isEscaped && RELATION_PATTERN.test(character);
- isQuoted = level == Level.DOUBLE_QUOTE || level == Level.SINGLE_QUOTE;
-
- if (isEscaped) {
- buffer.push(character);
- } else if (character == Marker.DOUBLE_QUOTE && level == Level.ROOT) {
- buffer.push(character);
- level = Level.DOUBLE_QUOTE;
- } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
- buffer.push(character);
- level = Level.ROOT;
- } else if (character == Marker.SINGLE_QUOTE && level == Level.ROOT) {
- buffer.push(character);
- level = Level.SINGLE_QUOTE;
- } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
- buffer.push(character);
- level = Level.ROOT;
- } else if (isQuoted) {
- buffer.push(character);
- } else if (character == Marker.OPEN_ROUND_BRACKET) {
- buffer.push(character);
- roundBracketLevel++;
- } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1 && isPseudo) {
- buffer.push(character);
- list.push(buffer.join(''));
- roundBracketLevel--;
- buffer = [];
- isPseudo = false;
- } else if (character == Marker.CLOSE_ROUND_BRACKET) {
- buffer.push(character);
- roundBracketLevel--;
- } else if (character == Marker.COLON && roundBracketLevel === 0 && isPseudo && !wasColon) {
- list.push(buffer.join(''));
- buffer = [];
- buffer.push(character);
- } else if (character == Marker.COLON && roundBracketLevel === 0 && !wasColon) {
- buffer = [];
- buffer.push(character);
- isPseudo = true;
- } else if (character == Marker.SPACE && roundBracketLevel === 0 && isPseudo) {
- list.push(buffer.join(''));
- buffer = [];
- isPseudo = false;
- } else if (isRelation && roundBracketLevel === 0 && isPseudo) {
- list.push(buffer.join(''));
- buffer = [];
- isPseudo = false;
- } else {
- buffer.push(character);
- }
-
- isEscaped = character == Marker.BACK_SLASH;
- wasColon = character == Marker.COLON;
- }
-
- if (buffer.length > 0 && isPseudo) {
- list.push(buffer.join(''));
- }
-
- return list;
-}
-
-function areMergeable(selector, matches, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
- return areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) &&
- needArguments(matches) &&
- (matches.length < 2 || !someIncorrectlyChained(selector, matches)) &&
- (matches.length < 2 || multiplePseudoMerging && allMixable(matches));
-}
-
-function areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) {
- var match;
- var name;
- var i, l;
-
- for (i = 0, l = matches.length; i < l; i++) {
- match = matches[i];
- name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
- match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
- match;
-
- if (mergeablePseudoClasses.indexOf(name) === -1 && mergeablePseudoElements.indexOf(name) === -1) {
- return false;
- }
- }
-
- return true;
-}
-
-function needArguments(matches) {
- var match;
- var name;
- var bracketOpensAt;
- var hasArguments;
- var i, l;
-
- for (i = 0, l = matches.length; i < l; i++) {
- match = matches[i];
-
- bracketOpensAt = match.indexOf(Marker.OPEN_ROUND_BRACKET);
- hasArguments = bracketOpensAt > -1;
- name = hasArguments ?
- match.substring(0, bracketOpensAt) :
- match;
-
- if (hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) == -1) {
- return false;
- }
-
- if (!hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) > -1) {
- return false;
- }
- }
-
- return true;
-}
-
-function someIncorrectlyChained(selector, matches) {
- var positionInSelector = 0;
- var match;
- var matchAt;
- var nextMatch;
- var nextMatchAt;
- var name;
- var nextName;
- var areChained;
- var i, l;
-
- for (i = 0, l = matches.length; i < l; i++) {
- match = matches[i];
- nextMatch = matches[i + 1];
-
- if (!nextMatch) {
- break;
- }
-
- matchAt = selector.indexOf(match, positionInSelector);
- nextMatchAt = selector.indexOf(match, matchAt + 1);
- positionInSelector = nextMatchAt;
- areChained = matchAt + match.length == nextMatchAt;
-
- if (areChained) {
- name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
- match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
- match;
- nextName = nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
- nextMatch.substring(0, nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET)) :
- nextMatch;
-
- if (name != NOT_PSEUDO || nextName != NOT_PSEUDO) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-function allMixable(matches) {
- var unmixableMatches = 0;
- var match;
- var i, l;
-
- for (i = 0, l = matches.length; i < l; i++) {
- match = matches[i];
-
- if (isPseudoElement(match)) {
- unmixableMatches += UNMIXABLE_PSEUDO_ELEMENTS.indexOf(match) > -1 ? 1 : 0;
- } else {
- unmixableMatches += UNMIXABLE_PSEUDO_CLASSES.indexOf(match) > -1 ? 1 : 0;
- }
-
- if (unmixableMatches > 1) {
- return false;
- }
- }
-
- return true;
-}
-
-function isPseudoElement(pseudo) {
- return DOUBLE_COLON_PATTERN.test(pseudo);
-}
-
-module.exports = isMergeable;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js b/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
deleted file mode 100644
index b148bacd7..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeAdjacent(tokens, context) {
- var lastToken = [null, [], []];
- var options = context.options;
- var adjacentSpace = options.compatibility.selectors.adjacentSpace;
- var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
- var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
- var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
- var mergeLimit = options.compatibility.selectors.mergeLimit;
- var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- if (token[0] != Token.RULE) {
- lastToken = [null, [], []];
- continue;
- }
-
- if (lastToken[0] == Token.RULE && serializeRules(token[1]) == serializeRules(lastToken[1])) {
- Array.prototype.push.apply(lastToken[2], token[2]);
- optimizeProperties(lastToken[2], true, true, context);
- token[2] = [];
- } else if (lastToken[0] == Token.RULE && serializeBody(token[2]) == serializeBody(lastToken[2]) &&
- isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
- isMergeable(serializeRules(lastToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
- lastToken[1].length < mergeLimit) {
- lastToken[1] = tidyRules(lastToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
- lastToken[1] = lastToken.length > 1 ? sortSelectors(lastToken[1], selectorsSortingMethod) : lastToken[1];
- token[2] = [];
- } else {
- lastToken = token;
- }
- }
-}
-
-module.exports = mergeAdjacent;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js b/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
deleted file mode 100644
index c3c60dc24..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var rulesOverlap = require('./rules-overlap');
-
-var serializeRules = require('../../writer/one-time').rules;
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-var Token = require('../../tokenizer/token');
-
-function mergeMediaQueries(tokens, context) {
- var mergeSemantically = context.options.level[OptimizationLevel.Two].mergeSemantically;
- var specificityCache = context.cache.specificity;
- var candidates = {};
- var reduced = [];
-
- for (var i = tokens.length - 1; i >= 0; i--) {
- var token = tokens[i];
- if (token[0] != Token.NESTED_BLOCK) {
- continue;
- }
-
- var key = serializeRules(token[1]);
- var candidate = candidates[key];
- if (!candidate) {
- candidate = [];
- candidates[key] = candidate;
- }
-
- candidate.push(i);
- }
-
- for (var name in candidates) {
- var positions = candidates[name];
-
- positionLoop:
- for (var j = positions.length - 1; j > 0; j--) {
- var positionOne = positions[j];
- var tokenOne = tokens[positionOne];
- var positionTwo = positions[j - 1];
- var tokenTwo = tokens[positionTwo];
-
- directionLoop:
- for (var direction = 1; direction >= -1; direction -= 2) {
- var topToBottom = direction == 1;
- var from = topToBottom ? positionOne + 1 : positionTwo - 1;
- var to = topToBottom ? positionTwo : positionOne;
- var delta = topToBottom ? 1 : -1;
- var source = topToBottom ? tokenOne : tokenTwo;
- var target = topToBottom ? tokenTwo : tokenOne;
- var movedProperties = extractProperties(source);
-
- while (from != to) {
- var traversedProperties = extractProperties(tokens[from]);
- from += delta;
-
- if (mergeSemantically && allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache)) {
- continue;
- }
-
- if (!canReorder(movedProperties, traversedProperties, specificityCache))
- continue directionLoop;
- }
-
- target[2] = topToBottom ?
- source[2].concat(target[2]) :
- target[2].concat(source[2]);
- source[2] = [];
-
- reduced.push(target);
- continue positionLoop;
- }
- }
- }
-
- return reduced;
-}
-
-function allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache) {
- var movedProperty;
- var movedRule;
- var traversedProperty;
- var traversedRule;
- var i, l;
- var j, m;
-
- for (i = 0, l = movedProperties.length; i < l; i++) {
- movedProperty = movedProperties[i];
- movedRule = movedProperty[5];
-
- for (j = 0, m = traversedProperties.length; j < m; j++) {
- traversedProperty = traversedProperties[j];
- traversedRule = traversedProperty[5];
-
- if (rulesOverlap(movedRule, traversedRule, true) && !canReorderSingle(movedProperty, traversedProperty, specificityCache)) {
- return false;
- }
- }
- }
-
- return true;
-}
-
-module.exports = mergeMediaQueries;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js b/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
deleted file mode 100644
index 82db950fe..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function unsafeSelector(value) {
- return /\.|\*| :/.test(value);
-}
-
-function isBemElement(token) {
- var asString = serializeRules(token[1]);
- return asString.indexOf('__') > -1 || asString.indexOf('--') > -1;
-}
-
-function withoutModifier(selector) {
- return selector.replace(/--[^ ,>\+~:]+/g, '');
-}
-
-function removeAnyUnsafeElements(left, candidates) {
- var leftSelector = withoutModifier(serializeRules(left[1]));
-
- for (var body in candidates) {
- var right = candidates[body];
- var rightSelector = withoutModifier(serializeRules(right[1]));
-
- if (rightSelector.indexOf(leftSelector) > -1 || leftSelector.indexOf(rightSelector) > -1)
- delete candidates[body];
- }
-}
-
-function mergeNonAdjacentByBody(tokens, context) {
- var options = context.options;
- var mergeSemantically = options.level[OptimizationLevel.Two].mergeSemantically;
- var adjacentSpace = options.compatibility.selectors.adjacentSpace;
- var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
- var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
- var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
- var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
- var candidates = {};
-
- for (var i = tokens.length - 1; i >= 0; i--) {
- var token = tokens[i];
- if (token[0] != Token.RULE)
- continue;
-
- if (token[2].length > 0 && (!mergeSemantically && unsafeSelector(serializeRules(token[1]))))
- candidates = {};
-
- if (token[2].length > 0 && mergeSemantically && isBemElement(token))
- removeAnyUnsafeElements(token, candidates);
-
- var candidateBody = serializeBody(token[2]);
- var oldToken = candidates[candidateBody];
- if (oldToken &&
- isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
- isMergeable(serializeRules(oldToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
-
- if (token[2].length > 0) {
- token[1] = tidyRules(oldToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
- token[1] = token[1].length > 1 ? sortSelectors(token[1], selectorsSortingMethod) : token[1];
- } else {
- token[1] = oldToken[1].concat(token[1]);
- }
-
- oldToken[2] = [];
- candidates[candidateBody] = null;
- }
-
- candidates[serializeBody(token[2])] = token;
- }
-}
-
-module.exports = mergeNonAdjacentByBody;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js b/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
deleted file mode 100644
index 5e23064eb..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var extractProperties = require('./extract-properties');
-
-var optimizeProperties = require('./properties/optimize');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeNonAdjacentBySelector(tokens, context) {
- var specificityCache = context.cache.specificity;
- var allSelectors = {};
- var repeatedSelectors = [];
- var i;
-
- for (i = tokens.length - 1; i >= 0; i--) {
- if (tokens[i][0] != Token.RULE)
- continue;
- if (tokens[i][2].length === 0)
- continue;
-
- var selector = serializeRules(tokens[i][1]);
- allSelectors[selector] = [i].concat(allSelectors[selector] || []);
-
- if (allSelectors[selector].length == 2)
- repeatedSelectors.push(selector);
- }
-
- for (i = repeatedSelectors.length - 1; i >= 0; i--) {
- var positions = allSelectors[repeatedSelectors[i]];
-
- selectorIterator:
- for (var j = positions.length - 1; j > 0; j--) {
- var positionOne = positions[j - 1];
- var tokenOne = tokens[positionOne];
- var positionTwo = positions[j];
- var tokenTwo = tokens[positionTwo];
-
- directionIterator:
- for (var direction = 1; direction >= -1; direction -= 2) {
- var topToBottom = direction == 1;
- var from = topToBottom ? positionOne + 1 : positionTwo - 1;
- var to = topToBottom ? positionTwo : positionOne;
- var delta = topToBottom ? 1 : -1;
- var moved = topToBottom ? tokenOne : tokenTwo;
- var target = topToBottom ? tokenTwo : tokenOne;
- var movedProperties = extractProperties(moved);
-
- while (from != to) {
- var traversedProperties = extractProperties(tokens[from]);
- from += delta;
-
- // traversed then moved as we move selectors towards the start
- var reorderable = topToBottom ?
- canReorder(movedProperties, traversedProperties, specificityCache) :
- canReorder(traversedProperties, movedProperties, specificityCache);
-
- if (!reorderable && !topToBottom)
- continue selectorIterator;
- if (!reorderable && topToBottom)
- continue directionIterator;
- }
-
- if (topToBottom) {
- Array.prototype.push.apply(moved[2], target[2]);
- target[2] = moved[2];
- } else {
- Array.prototype.push.apply(target[2], moved[2]);
- }
-
- optimizeProperties(target[2], true, true, context);
- moved[2] = [];
- }
- }
- }
-}
-
-module.exports = mergeNonAdjacentBySelector;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/optimize.js b/node_modules/clean-css/lib/optimizer/level-2/optimize.js
deleted file mode 100644
index 9be961d09..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/optimize.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var mergeAdjacent = require('./merge-adjacent');
-var mergeMediaQueries = require('./merge-media-queries');
-var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
-var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
-var reduceNonAdjacent = require('./reduce-non-adjacent');
-var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
-var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
-var removeDuplicates = require('./remove-duplicates');
-var removeUnusedAtRules = require('./remove-unused-at-rules');
-var restructure = require('./restructure');
-
-var optimizeProperties = require('./properties/optimize');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-
-function removeEmpty(tokens) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
- var isEmpty = false;
-
- switch (token[0]) {
- case Token.RULE:
- isEmpty = token[1].length === 0 || token[2].length === 0;
- break;
- case Token.NESTED_BLOCK:
- removeEmpty(token[2]);
- isEmpty = token[2].length === 0;
- break;
- case Token.AT_RULE:
- isEmpty = token[1].length === 0;
- break;
- case Token.AT_RULE_BLOCK:
- isEmpty = token[2].length === 0;
- }
-
- if (isEmpty) {
- tokens.splice(i, 1);
- i--;
- l--;
- }
- }
-}
-
-function recursivelyOptimizeBlocks(tokens, context) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- if (token[0] == Token.NESTED_BLOCK) {
- var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0][1]);
- level2Optimize(token[2], context, !isKeyframes);
- }
- }
-}
-
-function recursivelyOptimizeProperties(tokens, context) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- switch (token[0]) {
- case Token.RULE:
- optimizeProperties(token[2], true, true, context);
- break;
- case Token.NESTED_BLOCK:
- recursivelyOptimizeProperties(token[2], context);
- }
- }
-}
-
-function level2Optimize(tokens, context, withRestructuring) {
- var levelOptions = context.options.level[OptimizationLevel.Two];
- var reduced;
- var i;
-
- recursivelyOptimizeBlocks(tokens, context);
- recursivelyOptimizeProperties(tokens, context);
-
- if (levelOptions.removeDuplicateRules) {
- removeDuplicates(tokens, context);
- }
-
- if (levelOptions.mergeAdjacentRules) {
- mergeAdjacent(tokens, context);
- }
-
- if (levelOptions.reduceNonAdjacentRules) {
- reduceNonAdjacent(tokens, context);
- }
-
- if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'body') {
- mergeNonAdjacentBySelector(tokens, context);
- }
-
- if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'selector') {
- mergeNonAdjacentByBody(tokens, context);
- }
-
- if (levelOptions.restructureRules && levelOptions.mergeAdjacentRules && withRestructuring) {
- restructure(tokens, context);
- mergeAdjacent(tokens, context);
- }
-
- if (levelOptions.restructureRules && !levelOptions.mergeAdjacentRules && withRestructuring) {
- restructure(tokens, context);
- }
-
- if (levelOptions.removeDuplicateFontRules) {
- removeDuplicateFontAtRules(tokens, context);
- }
-
- if (levelOptions.removeDuplicateMediaBlocks) {
- removeDuplicateMediaQueries(tokens, context);
- }
-
- if (levelOptions.removeUnusedAtRules) {
- removeUnusedAtRules(tokens, context);
- }
-
- if (levelOptions.mergeMedia) {
- reduced = mergeMediaQueries(tokens, context);
- for (i = reduced.length - 1; i >= 0; i--) {
- level2Optimize(reduced[i][2], context, false);
- }
- }
-
- if (levelOptions.removeEmpty) {
- removeEmpty(tokens);
- }
-
- return tokens;
-}
-
-module.exports = level2Optimize;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js b/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
deleted file mode 100644
index 44fcb7d53..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function everyValuesPair(fn, left, right) {
- var leftSize = left.value.length;
- var rightSize = right.value.length;
- var total = Math.max(leftSize, rightSize);
- var lowerBound = Math.min(leftSize, rightSize) - 1;
- var leftValue;
- var rightValue;
- var position;
-
- for (position = 0; position < total; position++) {
- leftValue = left.value[position] && left.value[position][1] || leftValue;
- rightValue = right.value[position] && right.value[position][1] || rightValue;
-
- if (leftValue == Marker.COMMA || rightValue == Marker.COMMA) {
- continue;
- }
-
- if (!fn(leftValue, rightValue, position, position <= lowerBound)) {
- return false;
- }
- }
-
- return true;
-}
-
-module.exports = everyValuesPair;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js b/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
deleted file mode 100644
index dd7c719d5..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var compactable = require('../compactable');
-
-function findComponentIn(shorthand, longhand) {
- var comparator = nameComparator(longhand);
-
- return findInDirectComponents(shorthand, comparator) || findInSubComponents(shorthand, comparator);
-}
-
-function nameComparator(to) {
- return function (property) {
- return to.name === property.name;
- };
-}
-
-function findInDirectComponents(shorthand, comparator) {
- return shorthand.components.filter(comparator)[0];
-}
-
-function findInSubComponents(shorthand, comparator) {
- var shorthandComponent;
- var longhandMatch;
- var i, l;
-
- if (!compactable[shorthand.name].shorthandComponents) {
- return;
- }
-
- for (i = 0, l = shorthand.components.length; i < l; i++) {
- shorthandComponent = shorthand.components[i];
- longhandMatch = findInDirectComponents(shorthandComponent, comparator);
-
- if (longhandMatch) {
- return longhandMatch;
- }
- }
-
- return;
-}
-
-module.exports = findComponentIn;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js b/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
deleted file mode 100644
index 84f220d32..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function hasInherit(property) {
- for (var i = property.value.length - 1; i >= 0; i--) {
- if (property.value[i][1] == 'inherit')
- return true;
- }
-
- return false;
-}
-
-module.exports = hasInherit;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js b/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
deleted file mode 100644
index 237de7d10..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var compactable = require('../compactable');
-
-function isComponentOf(property1, property2, shallow) {
- return isDirectComponentOf(property1, property2) ||
- !shallow && !!compactable[property1.name].shorthandComponents && isSubComponentOf(property1, property2);
-}
-
-function isDirectComponentOf(property1, property2) {
- var descriptor = compactable[property1.name];
-
- return 'components' in descriptor && descriptor.components.indexOf(property2.name) > -1;
-}
-
-function isSubComponentOf(property1, property2) {
- return property1
- .components
- .some(function (component) {
- return isDirectComponentOf(component, property2);
- });
-}
-
-module.exports = isComponentOf;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js b/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
deleted file mode 100644
index ee7191ef6..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function isMergeableShorthand(shorthand) {
- if (shorthand.name != 'font') {
- return true;
- }
-
- return shorthand.value[0][1].indexOf(Marker.INTERNAL) == -1;
-}
-
-module.exports = isMergeableShorthand;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js b/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
deleted file mode 100644
index bcfeeb609..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
+++ /dev/null
@@ -1,445 +0,0 @@
-var everyValuesPair = require('./every-values-pair');
-var hasInherit = require('./has-inherit');
-var populateComponents = require('./populate-components');
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-var wrapSingle = require('../../wrap-for-optimizing').single;
-
-var serializeBody = require('../../../writer/one-time').body;
-var Token = require('../../../tokenizer/token');
-
-function mergeIntoShorthands(properties, validator) {
- var candidates = {};
- var descriptor;
- var componentOf;
- var property;
- var i, l;
- var j, m;
-
- // there is no shorthand property made up of less than 3 longhands
- if (properties.length < 3) {
- return;
- }
-
- for (i = 0, l = properties.length; i < l; i++) {
- property = properties[i];
- descriptor = compactable[property.name];
-
- if (property.unused) {
- continue;
- }
-
- if (property.hack) {
- continue;
- }
-
- if (property.block) {
- continue;
- }
-
- invalidateOrCompact(properties, i, candidates, validator);
-
- if (descriptor && descriptor.componentOf) {
- for (j = 0, m = descriptor.componentOf.length; j < m; j++) {
- componentOf = descriptor.componentOf[j];
-
- candidates[componentOf] = candidates[componentOf] || {};
- candidates[componentOf][property.name] = property;
- }
- }
- }
-
- invalidateOrCompact(properties, i, candidates, validator);
-}
-
-function invalidateOrCompact(properties, position, candidates, validator) {
- var invalidatedBy = properties[position];
- var shorthandName;
- var shorthandDescriptor;
- var candidateComponents;
-
- for (shorthandName in candidates) {
- if (undefined !== invalidatedBy && shorthandName == invalidatedBy.name) {
- continue;
- }
-
- shorthandDescriptor = compactable[shorthandName];
- candidateComponents = candidates[shorthandName];
- if (invalidatedBy && invalidates(candidates, shorthandName, invalidatedBy)) {
- delete candidates[shorthandName];
- continue;
- }
-
- if (shorthandDescriptor.components.length > Object.keys(candidateComponents).length) {
- continue;
- }
-
- if (mixedImportance(candidateComponents)) {
- continue;
- }
-
- if (!overridable(candidateComponents, shorthandName, validator)) {
- continue;
- }
-
- if (!mergeable(candidateComponents)) {
- continue;
- }
-
- if (mixedInherit(candidateComponents)) {
- replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator);
- } else {
- replaceWithShorthand(properties, candidateComponents, shorthandName, validator);
- }
- }
-}
-
-function invalidates(candidates, shorthandName, invalidatedBy) {
- var shorthandDescriptor = compactable[shorthandName];
- var invalidatedByDescriptor = compactable[invalidatedBy.name];
- var componentName;
-
- if ('overridesShorthands' in shorthandDescriptor && shorthandDescriptor.overridesShorthands.indexOf(invalidatedBy.name) > -1) {
- return true;
- }
-
- if (invalidatedByDescriptor && 'componentOf' in invalidatedByDescriptor) {
- for (componentName in candidates[shorthandName]) {
- if (invalidatedByDescriptor.componentOf.indexOf(componentName) > -1) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-function mixedImportance(components) {
- var important;
- var componentName;
-
- for (componentName in components) {
- if (undefined !== important && components[componentName].important != important) {
- return true;
- }
-
- important = components[componentName].important;
- }
-
- return false;
-}
-
-function overridable(components, shorthandName, validator) {
- var descriptor = compactable[shorthandName];
- var newValuePlaceholder = [
- Token.PROPERTY,
- [Token.PROPERTY_NAME, shorthandName],
- [Token.PROPERTY_VALUE, descriptor.defaultValue]
- ];
- var newProperty = wrapSingle(newValuePlaceholder);
- var component;
- var mayOverride;
- var i, l;
-
- populateComponents([newProperty], validator, []);
-
- for (i = 0, l = descriptor.components.length; i < l; i++) {
- component = components[descriptor.components[i]];
- mayOverride = compactable[component.name].canOverride;
-
- if (!everyValuesPair(mayOverride.bind(null, validator), newProperty.components[i], component)) {
- return false;
- }
- }
-
- return true;
-}
-
-function mergeable(components) {
- var lastCount = null;
- var currentCount;
- var componentName;
- var component;
- var descriptor;
- var values;
-
- for (componentName in components) {
- component = components[componentName];
- descriptor = compactable[componentName];
-
- if (!('restore' in descriptor)) {
- continue;
- }
-
- restoreFromOptimizing([component.all[component.position]], restoreWithComponents);
- values = descriptor.restore(component, compactable);
-
- currentCount = values.length;
-
- if (lastCount !== null && currentCount !== lastCount) {
- return false;
- }
-
- lastCount = currentCount;
- }
-
- return true;
-}
-
-function mixedInherit(components) {
- var componentName;
- var lastValue = null;
- var currentValue;
-
- for (componentName in components) {
- currentValue = hasInherit(components[componentName]);
-
- if (lastValue !== null && lastValue !== currentValue) {
- return true;
- }
-
- lastValue = currentValue;
- }
-
- return false;
-}
-
-function replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator) {
- var viaLonghands = buildSequenceWithInheritLonghands(candidateComponents, shorthandName, validator);
- var viaShorthand = buildSequenceWithInheritShorthand(candidateComponents, shorthandName, validator);
- var longhandTokensSequence = viaLonghands[0];
- var shorthandTokensSequence = viaShorthand[0];
- var isLonghandsShorter = serializeBody(longhandTokensSequence).length < serializeBody(shorthandTokensSequence).length;
- var newTokensSequence = isLonghandsShorter ? longhandTokensSequence : shorthandTokensSequence;
- var newProperty = isLonghandsShorter ? viaLonghands[1] : viaShorthand[1];
- var newComponents = isLonghandsShorter ? viaLonghands[2] : viaShorthand[2];
- var all = candidateComponents[Object.keys(candidateComponents)[0]].all;
- var componentName;
- var oldComponent;
- var newComponent;
- var newToken;
-
- newProperty.position = all.length;
- newProperty.shorthand = true;
- newProperty.dirty = true;
- newProperty.all = all;
- newProperty.all.push(newTokensSequence[0]);
-
- properties.push(newProperty);
-
- for (componentName in candidateComponents) {
- oldComponent = candidateComponents[componentName];
- oldComponent.unused = true;
-
- if (oldComponent.name in newComponents) {
- newComponent = newComponents[oldComponent.name];
- newToken = findTokenIn(newTokensSequence, componentName);
-
- newComponent.position = all.length;
- newComponent.all = all;
- newComponent.all.push(newToken);
-
- properties.push(newComponent);
- }
- }
-}
-
-function buildSequenceWithInheritLonghands(components, shorthandName, validator) {
- var tokensSequence = [];
- var inheritComponents = {};
- var nonInheritComponents = {};
- var descriptor = compactable[shorthandName];
- var shorthandToken = [
- Token.PROPERTY,
- [Token.PROPERTY_NAME, shorthandName],
- [Token.PROPERTY_VALUE, descriptor.defaultValue]
- ];
- var newProperty = wrapSingle(shorthandToken);
- var component;
- var longhandToken;
- var newComponent;
- var nameMetadata;
- var i, l;
-
- populateComponents([newProperty], validator, []);
-
- for (i = 0, l = descriptor.components.length; i < l; i++) {
- component = components[descriptor.components[i]];
-
- if (hasInherit(component)) {
- longhandToken = component.all[component.position].slice(0, 2);
- Array.prototype.push.apply(longhandToken, component.value);
- tokensSequence.push(longhandToken);
-
- newComponent = deepClone(component);
- newComponent.value = inferComponentValue(components, newComponent.name);
-
- newProperty.components[i] = newComponent;
- inheritComponents[component.name] = deepClone(component);
- } else {
- newComponent = deepClone(component);
- newComponent.all = component.all;
- newProperty.components[i] = newComponent;
-
- nonInheritComponents[component.name] = component;
- }
- }
-
- nameMetadata = joinMetadata(nonInheritComponents, 1);
- shorthandToken[1].push(nameMetadata);
-
- restoreFromOptimizing([newProperty], restoreWithComponents);
-
- shorthandToken = shorthandToken.slice(0, 2);
- Array.prototype.push.apply(shorthandToken, newProperty.value);
-
- tokensSequence.unshift(shorthandToken);
-
- return [tokensSequence, newProperty, inheritComponents];
-}
-
-function inferComponentValue(components, propertyName) {
- var descriptor = compactable[propertyName];
-
- if ('oppositeTo' in descriptor) {
- return components[descriptor.oppositeTo].value;
- } else {
- return [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
- }
-}
-
-function joinMetadata(components, at) {
- var metadata = [];
- var component;
- var originalValue;
- var componentMetadata;
- var componentName;
-
- for (componentName in components) {
- component = components[componentName];
- originalValue = component.all[component.position];
- componentMetadata = originalValue[at][originalValue[at].length - 1];
-
- Array.prototype.push.apply(metadata, componentMetadata);
- }
-
- return metadata.sort(metadataSorter);
-}
-
-function metadataSorter(metadata1, metadata2) {
- var line1 = metadata1[0];
- var line2 = metadata2[0];
- var column1 = metadata1[1];
- var column2 = metadata2[1];
-
- if (line1 < line2) {
- return -1;
- } else if (line1 === line2) {
- return column1 < column2 ? -1 : 1;
- } else {
- return 1;
- }
-}
-
-function buildSequenceWithInheritShorthand(components, shorthandName, validator) {
- var tokensSequence = [];
- var inheritComponents = {};
- var nonInheritComponents = {};
- var descriptor = compactable[shorthandName];
- var shorthandToken = [
- Token.PROPERTY,
- [Token.PROPERTY_NAME, shorthandName],
- [Token.PROPERTY_VALUE, 'inherit']
- ];
- var newProperty = wrapSingle(shorthandToken);
- var component;
- var longhandToken;
- var nameMetadata;
- var valueMetadata;
- var i, l;
-
- populateComponents([newProperty], validator, []);
-
- for (i = 0, l = descriptor.components.length; i < l; i++) {
- component = components[descriptor.components[i]];
-
- if (hasInherit(component)) {
- inheritComponents[component.name] = component;
- } else {
- longhandToken = component.all[component.position].slice(0, 2);
- Array.prototype.push.apply(longhandToken, component.value);
- tokensSequence.push(longhandToken);
-
- nonInheritComponents[component.name] = deepClone(component);
- }
- }
-
- nameMetadata = joinMetadata(inheritComponents, 1);
- shorthandToken[1].push(nameMetadata);
-
- valueMetadata = joinMetadata(inheritComponents, 2);
- shorthandToken[2].push(valueMetadata);
-
- tokensSequence.unshift(shorthandToken);
-
- return [tokensSequence, newProperty, nonInheritComponents];
-}
-
-function findTokenIn(tokens, componentName) {
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- if (tokens[i][1][1] == componentName) {
- return tokens[i];
- }
- }
-}
-
-function replaceWithShorthand(properties, candidateComponents, shorthandName, validator) {
- var descriptor = compactable[shorthandName];
- var nameMetadata;
- var valueMetadata;
- var newValuePlaceholder = [
- Token.PROPERTY,
- [Token.PROPERTY_NAME, shorthandName],
- [Token.PROPERTY_VALUE, descriptor.defaultValue]
- ];
- var all;
-
- var newProperty = wrapSingle(newValuePlaceholder);
- newProperty.shorthand = true;
- newProperty.dirty = true;
-
- populateComponents([newProperty], validator, []);
-
- for (var i = 0, l = descriptor.components.length; i < l; i++) {
- var component = candidateComponents[descriptor.components[i]];
-
- newProperty.components[i] = deepClone(component);
- newProperty.important = component.important;
-
- all = component.all;
- }
-
- for (var componentName in candidateComponents) {
- candidateComponents[componentName].unused = true;
- }
-
- nameMetadata = joinMetadata(candidateComponents, 1);
- newValuePlaceholder[1].push(nameMetadata);
-
- valueMetadata = joinMetadata(candidateComponents, 2);
- newValuePlaceholder[2].push(valueMetadata);
-
- newProperty.position = all.length;
- newProperty.all = all;
- newProperty.all.push(newValuePlaceholder);
-
- properties.push(newProperty);
-}
-
-module.exports = mergeIntoShorthands;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js b/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
deleted file mode 100644
index 5dc4bfb98..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var mergeIntoShorthands = require('./merge-into-shorthands');
-var overrideProperties = require('./override-properties');
-var populateComponents = require('./populate-components');
-
-var restoreWithComponents = require('../restore-with-components');
-
-var wrapForOptimizing = require('../../wrap-for-optimizing').all;
-var removeUnused = require('../../remove-unused');
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-function optimizeProperties(properties, withOverriding, withMerging, context) {
- var levelOptions = context.options.level[OptimizationLevel.Two];
- var _properties = wrapForOptimizing(properties, false, levelOptions.skipProperties);
- var _property;
- var i, l;
-
- populateComponents(_properties, context.validator, context.warnings);
-
- for (i = 0, l = _properties.length; i < l; i++) {
- _property = _properties[i];
- if (_property.block) {
- optimizeProperties(_property.value[0][1], withOverriding, withMerging, context);
- }
- }
-
- if (withMerging && levelOptions.mergeIntoShorthands) {
- mergeIntoShorthands(_properties, context.validator);
- }
-
- if (withOverriding && levelOptions.overrideProperties) {
- overrideProperties(_properties, withMerging, context.options.compatibility, context.validator);
- }
-
- restoreFromOptimizing(_properties, restoreWithComponents);
- removeUnused(_properties);
-}
-
-module.exports = optimizeProperties;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js b/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
deleted file mode 100644
index 0f7b97a9f..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
+++ /dev/null
@@ -1,484 +0,0 @@
-var hasInherit = require('./has-inherit');
-var everyValuesPair = require('./every-values-pair');
-var findComponentIn = require('./find-component-in');
-var isComponentOf = require('./is-component-of');
-var isMergeableShorthand = require('./is-mergeable-shorthand');
-var overridesNonComponentShorthand = require('./overrides-non-component-shorthand');
-var sameVendorPrefixesIn = require('./vendor-prefixes').same;
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-var shallowClone = require('../clone').shallow;
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var Token = require('../../../tokenizer/token');
-var Marker = require('../../../tokenizer/marker');
-
-var serializeProperty = require('../../../writer/one-time').property;
-
-function wouldBreakCompatibility(property, validator) {
- for (var i = 0; i < property.components.length; i++) {
- var component = property.components[i];
- var descriptor = compactable[component.name];
- var canOverride = descriptor && descriptor.canOverride || canOverride.sameValue;
-
- var _component = shallowClone(component);
- _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
-
- if (!everyValuesPair(canOverride.bind(null, validator), _component, component)) {
- return true;
- }
- }
-
- return false;
-}
-
-function overrideIntoMultiplex(property, by) {
- by.unused = true;
-
- turnIntoMultiplex(by, multiplexSize(property));
- property.value = by.value;
-}
-
-function overrideByMultiplex(property, by) {
- by.unused = true;
- property.multiplex = true;
- property.value = by.value;
-}
-
-function overrideSimple(property, by) {
- by.unused = true;
- property.value = by.value;
-}
-
-function override(property, by) {
- if (by.multiplex)
- overrideByMultiplex(property, by);
- else if (property.multiplex)
- overrideIntoMultiplex(property, by);
- else
- overrideSimple(property, by);
-}
-
-function overrideShorthand(property, by) {
- by.unused = true;
-
- for (var i = 0, l = property.components.length; i < l; i++) {
- override(property.components[i], by.components[i], property.multiplex);
- }
-}
-
-function turnIntoMultiplex(property, size) {
- property.multiplex = true;
-
- if (compactable[property.name].shorthand) {
- turnShorthandValueIntoMultiplex(property, size);
- } else {
- turnLonghandValueIntoMultiplex(property, size);
- }
-}
-
-function turnShorthandValueIntoMultiplex(property, size) {
- var component;
- var i, l;
-
- for (i = 0, l = property.components.length; i < l; i++) {
- component = property.components[i];
-
- if (!component.multiplex) {
- turnLonghandValueIntoMultiplex(component, size);
- }
- }
-}
-
-function turnLonghandValueIntoMultiplex(property, size) {
- var descriptor = compactable[property.name];
- var withRealValue = descriptor.intoMultiplexMode == 'real';
- var withValue = descriptor.intoMultiplexMode == 'real' ?
- property.value.slice(0) :
- (descriptor.intoMultiplexMode == 'placeholder' ? descriptor.placeholderValue : descriptor.defaultValue);
- var i = multiplexSize(property);
- var j;
- var m = withValue.length;
-
- for (; i < size; i++) {
- property.value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-
- if (Array.isArray(withValue)) {
- for (j = 0; j < m; j++) {
- property.value.push(withRealValue ? withValue[j] : [Token.PROPERTY_VALUE, withValue[j]]);
- }
- } else {
- property.value.push(withRealValue ? withValue : [Token.PROPERTY_VALUE, withValue]);
- }
- }
-}
-
-function multiplexSize(component) {
- var size = 0;
-
- for (var i = 0, l = component.value.length; i < l; i++) {
- if (component.value[i][1] == Marker.COMMA)
- size++;
- }
-
- return size + 1;
-}
-
-function lengthOf(property) {
- var fakeAsArray = [
- Token.PROPERTY,
- [Token.PROPERTY_NAME, property.name]
- ].concat(property.value);
- return serializeProperty([fakeAsArray], 0).length;
-}
-
-function moreSameShorthands(properties, startAt, name) {
- // Since we run the main loop in `compactOverrides` backwards, at this point some
- // properties may not be marked as unused.
- // We should consider reverting the order if possible
- var count = 0;
-
- for (var i = startAt; i >= 0; i--) {
- if (properties[i].name == name && !properties[i].unused)
- count++;
- if (count > 1)
- break;
- }
-
- return count > 1;
-}
-
-function overridingFunction(shorthand, validator) {
- for (var i = 0, l = shorthand.components.length; i < l; i++) {
- if (!anyValue(validator.isUrl, shorthand.components[i]) && anyValue(validator.isFunction, shorthand.components[i])) {
- return true;
- }
- }
-
- return false;
-}
-
-function anyValue(fn, property) {
- for (var i = 0, l = property.value.length; i < l; i++) {
- if (property.value[i][1] == Marker.COMMA)
- continue;
-
- if (fn(property.value[i][1]))
- return true;
- }
-
- return false;
-}
-
-function wouldResultInLongerValue(left, right) {
- if (!left.multiplex && !right.multiplex || left.multiplex && right.multiplex)
- return false;
-
- var multiplex = left.multiplex ? left : right;
- var simple = left.multiplex ? right : left;
- var component;
-
- var multiplexClone = deepClone(multiplex);
- restoreFromOptimizing([multiplexClone], restoreWithComponents);
-
- var simpleClone = deepClone(simple);
- restoreFromOptimizing([simpleClone], restoreWithComponents);
-
- var lengthBefore = lengthOf(multiplexClone) + 1 + lengthOf(simpleClone);
-
- if (left.multiplex) {
- component = findComponentIn(multiplexClone, simpleClone);
- overrideIntoMultiplex(component, simpleClone);
- } else {
- component = findComponentIn(simpleClone, multiplexClone);
- turnIntoMultiplex(simpleClone, multiplexSize(multiplexClone));
- overrideByMultiplex(component, multiplexClone);
- }
-
- restoreFromOptimizing([simpleClone], restoreWithComponents);
-
- var lengthAfter = lengthOf(simpleClone);
-
- return lengthBefore <= lengthAfter;
-}
-
-function isCompactable(property) {
- return property.name in compactable;
-}
-
-function noneOverrideHack(left, right) {
- return !left.multiplex &&
- (left.name == 'background' || left.name == 'background-image') &&
- right.multiplex &&
- (right.name == 'background' || right.name == 'background-image') &&
- anyLayerIsNone(right.value);
-}
-
-function anyLayerIsNone(values) {
- var layers = intoLayers(values);
-
- for (var i = 0, l = layers.length; i < l; i++) {
- if (layers[i].length == 1 && layers[i][0][1] == 'none')
- return true;
- }
-
- return false;
-}
-
-function intoLayers(values) {
- var layers = [];
-
- for (var i = 0, layer = [], l = values.length; i < l; i++) {
- var value = values[i];
- if (value[1] == Marker.COMMA) {
- layers.push(layer);
- layer = [];
- } else {
- layer.push(value);
- }
- }
-
- layers.push(layer);
- return layers;
-}
-
-function overrideProperties(properties, withMerging, compatibility, validator) {
- var mayOverride, right, left, component;
- var overriddenComponents;
- var overriddenComponent;
- var overridingComponent;
- var overridable;
- var i, j, k;
-
- propertyLoop:
- for (i = properties.length - 1; i >= 0; i--) {
- right = properties[i];
-
- if (!isCompactable(right))
- continue;
-
- if (right.block)
- continue;
-
- mayOverride = compactable[right.name].canOverride;
-
- traverseLoop:
- for (j = i - 1; j >= 0; j--) {
- left = properties[j];
-
- if (!isCompactable(left))
- continue;
-
- if (left.block)
- continue;
-
- if (left.unused || right.unused)
- continue;
-
- if (left.hack && !right.hack && !right.important || !left.hack && !left.important && right.hack)
- continue;
-
- if (left.important == right.important && left.hack[0] != right.hack[0])
- continue;
-
- if (left.important == right.important && (left.hack[0] != right.hack[0] || (left.hack[1] && left.hack[1] != right.hack[1])))
- continue;
-
- if (hasInherit(right))
- continue;
-
- if (noneOverrideHack(left, right))
- continue;
-
- if (right.shorthand && isComponentOf(right, left)) {
- // maybe `left` can be overridden by `right` which is a shorthand?
- if (!right.important && left.important)
- continue;
-
- if (!sameVendorPrefixesIn([left], right.components))
- continue;
-
- if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator))
- continue;
-
- if (!isMergeableShorthand(right)) {
- left.unused = true;
- continue;
- }
-
- component = findComponentIn(right, left);
- mayOverride = compactable[left.name].canOverride;
- if (everyValuesPair(mayOverride.bind(null, validator), left, component)) {
- left.unused = true;
- }
- } else if (right.shorthand && overridesNonComponentShorthand(right, left)) {
- // `right` is a shorthand while `left` can be overriden by it, think `border` and `border-top`
- if (!right.important && left.important) {
- continue;
- }
-
- if (!sameVendorPrefixesIn([left], right.components)) {
- continue;
- }
-
- if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator)) {
- continue;
- }
-
- overriddenComponents = left.shorthand ?
- left.components:
- [left];
-
- for (k = overriddenComponents.length - 1; k >= 0; k--) {
- overriddenComponent = overriddenComponents[k];
- overridingComponent = findComponentIn(right, overriddenComponent);
- mayOverride = compactable[overriddenComponent.name].canOverride;
-
- if (!everyValuesPair(mayOverride.bind(null, validator), left, overridingComponent)) {
- continue traverseLoop;
- }
- }
-
- left.unused = true;
- } else if (withMerging && left.shorthand && !right.shorthand && isComponentOf(left, right, true)) {
- // maybe `right` can be pulled into `left` which is a shorthand?
- if (right.important && !left.important)
- continue;
-
- if (!right.important && left.important) {
- right.unused = true;
- continue;
- }
-
- // Pending more clever algorithm in #527
- if (moreSameShorthands(properties, i - 1, left.name))
- continue;
-
- if (overridingFunction(left, validator))
- continue;
-
- if (!isMergeableShorthand(left))
- continue;
-
- component = findComponentIn(left, right);
- if (everyValuesPair(mayOverride.bind(null, validator), component, right)) {
- var disabledBackgroundMerging =
- !compatibility.properties.backgroundClipMerging && component.name.indexOf('background-clip') > -1 ||
- !compatibility.properties.backgroundOriginMerging && component.name.indexOf('background-origin') > -1 ||
- !compatibility.properties.backgroundSizeMerging && component.name.indexOf('background-size') > -1;
- var nonMergeableValue = compactable[right.name].nonMergeableValue === right.value[0][1];
-
- if (disabledBackgroundMerging || nonMergeableValue)
- continue;
-
- if (!compatibility.properties.merging && wouldBreakCompatibility(left, validator))
- continue;
-
- if (component.value[0][1] != right.value[0][1] && (hasInherit(left) || hasInherit(right)))
- continue;
-
- if (wouldResultInLongerValue(left, right))
- continue;
-
- if (!left.multiplex && right.multiplex)
- turnIntoMultiplex(left, multiplexSize(right));
-
- override(component, right);
- left.dirty = true;
- }
- } else if (withMerging && left.shorthand && right.shorthand && left.name == right.name) {
- // merge if all components can be merged
-
- if (!left.multiplex && right.multiplex)
- continue;
-
- if (!right.important && left.important) {
- right.unused = true;
- continue propertyLoop;
- }
-
- if (right.important && !left.important) {
- left.unused = true;
- continue;
- }
-
- if (!isMergeableShorthand(right)) {
- left.unused = true;
- continue;
- }
-
- for (k = left.components.length - 1; k >= 0; k--) {
- var leftComponent = left.components[k];
- var rightComponent = right.components[k];
-
- mayOverride = compactable[leftComponent.name].canOverride;
- if (!everyValuesPair(mayOverride.bind(null, validator), leftComponent, rightComponent))
- continue propertyLoop;
- }
-
- overrideShorthand(left, right);
- left.dirty = true;
- } else if (withMerging && left.shorthand && right.shorthand && isComponentOf(left, right)) {
- // border is a shorthand but any of its components is a shorthand too
-
- if (!left.important && right.important)
- continue;
-
- component = findComponentIn(left, right);
- mayOverride = compactable[right.name].canOverride;
- if (!everyValuesPair(mayOverride.bind(null, validator), component, right))
- continue;
-
- if (left.important && !right.important) {
- right.unused = true;
- continue;
- }
-
- var rightRestored = compactable[right.name].restore(right, compactable);
- if (rightRestored.length > 1)
- continue;
-
- component = findComponentIn(left, right);
- override(component, right);
- right.dirty = true;
- } else if (left.name == right.name) {
- // two non-shorthands should be merged based on understandability
- overridable = true;
-
- if (right.shorthand) {
- for (k = right.components.length - 1; k >= 0 && overridable; k--) {
- overriddenComponent = left.components[k];
- overridingComponent = right.components[k];
- mayOverride = compactable[overridingComponent.name].canOverride;
-
- overridable = overridable && everyValuesPair(mayOverride.bind(null, validator), overriddenComponent, overridingComponent);
- }
- } else {
- mayOverride = compactable[right.name].canOverride;
- overridable = everyValuesPair(mayOverride.bind(null, validator), left, right);
- }
-
- if (left.important && !right.important && overridable) {
- right.unused = true;
- continue;
- }
-
- if (!left.important && right.important && overridable) {
- left.unused = true;
- continue;
- }
-
- if (!overridable) {
- continue;
- }
-
- left.unused = true;
- }
- }
- }
-}
-
-module.exports = overrideProperties;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js b/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
deleted file mode 100644
index c385218a9..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var compactable = require('../compactable');
-
-function overridesNonComponentShorthand(property1, property2) {
- return property1.name in compactable &&
- 'overridesShorthands' in compactable[property1.name] &&
- compactable[property1.name].overridesShorthands.indexOf(property2.name) > -1;
-}
-
-module.exports = overridesNonComponentShorthand;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js b/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
deleted file mode 100644
index c587e83c4..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var compactable = require('../compactable');
-var InvalidPropertyError = require('../invalid-property-error');
-
-function populateComponents(properties, validator, warnings) {
- var component;
- var j, m;
-
- for (var i = properties.length - 1; i >= 0; i--) {
- var property = properties[i];
- var descriptor = compactable[property.name];
-
- if (descriptor && descriptor.shorthand) {
- property.shorthand = true;
- property.dirty = true;
-
- try {
- property.components = descriptor.breakUp(property, compactable, validator);
-
- if (descriptor.shorthandComponents) {
- for (j = 0, m = property.components.length; j < m; j++) {
- component = property.components[j];
- component.components = compactable[component.name].breakUp(component, compactable, validator);
- }
- }
- } catch (e) {
- if (e instanceof InvalidPropertyError) {
- property.components = []; // this will set property.unused to true below
- warnings.push(e.message);
- } else {
- throw e;
- }
- }
-
- if (property.components.length > 0)
- property.multiplex = property.components[0].multiplex;
- else
- property.unused = true;
- }
- }
-}
-
-module.exports = populateComponents;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js b/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
deleted file mode 100644
index 032169a24..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var sameVendorPrefixes = require('./vendor-prefixes').same;
-
-function understandable(validator, value1, value2, _position, isPaired) {
- if (!sameVendorPrefixes(value1, value2)) {
- return false;
- }
-
- if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
- return false;
- }
-
- return true;
-}
-
-module.exports = understandable;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js b/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
deleted file mode 100644
index f9ab52728..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
+++ /dev/null
@@ -1,23 +0,0 @@
-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(',');
-}
-
-module.exports = {
- unique: unique,
- same: same
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js b/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
deleted file mode 100644
index 6ce0902b9..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
+++ /dev/null
@@ -1,180 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var cloneArray = require('../../utils/clone-array');
-
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function reduceNonAdjacent(tokens, context) {
- var options = context.options;
- var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
- var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
- var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
- var candidates = {};
- var repeated = [];
-
- for (var i = tokens.length - 1; i >= 0; i--) {
- var token = tokens[i];
-
- if (token[0] != Token.RULE) {
- continue;
- } else if (token[2].length === 0) {
- continue;
- }
-
- var selectorAsString = serializeRules(token[1]);
- var isComplexAndNotSpecial = token[1].length > 1 &&
- isMergeable(selectorAsString, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging);
- var wrappedSelectors = wrappedSelectorsFrom(token[1]);
- var selectors = isComplexAndNotSpecial ?
- [selectorAsString].concat(wrappedSelectors) :
- [selectorAsString];
-
- for (var j = 0, m = selectors.length; j < m; j++) {
- var selector = selectors[j];
-
- if (!candidates[selector])
- candidates[selector] = [];
- else
- repeated.push(selector);
-
- candidates[selector].push({
- where: i,
- list: wrappedSelectors,
- isPartial: isComplexAndNotSpecial && j > 0,
- isComplex: isComplexAndNotSpecial && j === 0
- });
- }
- }
-
- reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context);
- reduceComplexNonAdjacentCases(tokens, candidates, options, context);
-}
-
-function wrappedSelectorsFrom(list) {
- var wrapped = [];
-
- for (var i = 0; i < list.length; i++) {
- wrapped.push([list[i][1]]);
- }
-
- return wrapped;
-}
-
-function reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context) {
- function filterOut(idx, bodies) {
- return data[idx].isPartial && bodies.length === 0;
- }
-
- function reduceBody(token, newBody, processedCount, tokenIdx) {
- if (!data[processedCount - tokenIdx - 1].isPartial)
- token[2] = newBody;
- }
-
- for (var i = 0, l = repeated.length; i < l; i++) {
- var selector = repeated[i];
- var data = candidates[selector];
-
- reduceSelector(tokens, data, {
- filterOut: filterOut,
- callback: reduceBody
- }, options, context);
- }
-}
-
-function reduceComplexNonAdjacentCases(tokens, candidates, options, context) {
- var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
- var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
- var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
- var localContext = {};
-
- function filterOut(idx) {
- return localContext.data[idx].where < localContext.intoPosition;
- }
-
- function collectReducedBodies(token, newBody, processedCount, tokenIdx) {
- if (tokenIdx === 0)
- localContext.reducedBodies.push(newBody);
- }
-
- allSelectors:
- for (var complexSelector in candidates) {
- var into = candidates[complexSelector];
- if (!into[0].isComplex)
- continue;
-
- var intoPosition = into[into.length - 1].where;
- var intoToken = tokens[intoPosition];
- var reducedBodies = [];
-
- var selectors = isMergeable(complexSelector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) ?
- into[0].list :
- [complexSelector];
-
- localContext.intoPosition = intoPosition;
- localContext.reducedBodies = reducedBodies;
-
- for (var j = 0, m = selectors.length; j < m; j++) {
- var selector = selectors[j];
- var data = candidates[selector];
-
- if (data.length < 2)
- continue allSelectors;
-
- localContext.data = data;
-
- reduceSelector(tokens, data, {
- filterOut: filterOut,
- callback: collectReducedBodies
- }, options, context);
-
- if (serializeBody(reducedBodies[reducedBodies.length - 1]) != serializeBody(reducedBodies[0]))
- continue allSelectors;
- }
-
- intoToken[2] = reducedBodies[0];
- }
-}
-
-function reduceSelector(tokens, data, context, options, outerContext) {
- var bodies = [];
- var bodiesAsList = [];
- var processedTokens = [];
-
- for (var j = data.length - 1; j >= 0; j--) {
- if (context.filterOut(j, bodies))
- continue;
-
- var where = data[j].where;
- var token = tokens[where];
- var clonedBody = cloneArray(token[2]);
-
- bodies = bodies.concat(clonedBody);
- bodiesAsList.push(clonedBody);
- processedTokens.push(where);
- }
-
- optimizeProperties(bodies, true, false, outerContext);
-
- var processedCount = processedTokens.length;
- var propertyIdx = bodies.length - 1;
- var tokenIdx = processedCount - 1;
-
- while (tokenIdx >= 0) {
- if ((tokenIdx === 0 || (bodies[propertyIdx] && bodiesAsList[tokenIdx].indexOf(bodies[propertyIdx]) > -1)) && propertyIdx > -1) {
- propertyIdx--;
- continue;
- }
-
- var newBody = bodies.splice(propertyIdx + 1);
- context.callback(tokens[processedTokens[tokenIdx]], newBody, processedCount, tokenIdx);
-
- tokenIdx--;
- }
-}
-
-module.exports = reduceNonAdjacent;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js b/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
deleted file mode 100644
index bc85d5d67..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-
-var FONT_FACE_SCOPE = '@font-face';
-
-function removeDuplicateFontAtRules(tokens) {
- var fontAtRules = [];
- var token;
- var key;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
-
- if (token[0] != Token.AT_RULE_BLOCK && token[1][0][1] != FONT_FACE_SCOPE) {
- continue;
- }
-
- key = serializeAll([token]);
-
- if (fontAtRules.indexOf(key) > -1) {
- token[2] = [];
- } else {
- fontAtRules.push(key);
- }
- }
-}
-
-module.exports = removeDuplicateFontAtRules;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js b/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
deleted file mode 100644
index 2c8f31d9d..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicateMediaQueries(tokens) {
- var candidates = {};
- var candidate;
- var token;
- var key;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
- if (token[0] != Token.NESTED_BLOCK) {
- continue;
- }
-
- key = serializeRules(token[1]) + '%' + serializeAll(token[2]);
- candidate = candidates[key];
-
- if (candidate) {
- candidate[2] = [];
- }
-
- candidates[key] = token;
- }
-}
-
-module.exports = removeDuplicateMediaQueries;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js b/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
deleted file mode 100644
index 9aa6ace93..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicates(tokens) {
- var matched = {};
- var moreThanOnce = [];
- var id, token;
- var body, bodies;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
- if (token[0] != Token.RULE)
- continue;
-
- id = serializeRules(token[1]);
-
- if (matched[id] && matched[id].length == 1)
- moreThanOnce.push(id);
- else
- matched[id] = matched[id] || [];
-
- matched[id].push(i);
- }
-
- for (i = 0, l = moreThanOnce.length; i < l; i++) {
- id = moreThanOnce[i];
- bodies = [];
-
- for (var j = matched[id].length - 1; j >= 0; j--) {
- token = tokens[matched[id][j]];
- body = serializeBody(token[2]);
-
- if (bodies.indexOf(body) > -1)
- token[2] = [];
- else
- bodies.push(body);
- }
- }
-}
-
-module.exports = removeDuplicates;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js b/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
deleted file mode 100644
index 798d3939f..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
+++ /dev/null
@@ -1,249 +0,0 @@
-var populateComponents = require('./properties/populate-components');
-
-var wrapForOptimizing = require('../wrap-for-optimizing').single;
-var restoreFromOptimizing = require('../restore-from-optimizing');
-
-var Token = require('../../tokenizer/token');
-
-var animationNameRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation-name$/;
-var animationRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation$/;
-var keyframeRegex = /^@(\-moz\-|\-o\-|\-webkit\-)?keyframes /;
-var importantRegex = /\s{0,31}!important$/;
-var optionalMatchingQuotesRegex = /^(['"]?)(.*)\1$/;
-
-function normalize(value) {
- return value
- .replace(optionalMatchingQuotesRegex, '$2')
- .replace(importantRegex, '');
-}
-
-function removeUnusedAtRules(tokens, context) {
- removeUnusedAtRule(tokens, matchCounterStyle, markCounterStylesAsUsed, context);
- removeUnusedAtRule(tokens, matchFontFace, markFontFacesAsUsed, context);
- removeUnusedAtRule(tokens, matchKeyframe, markKeyframesAsUsed, context);
- removeUnusedAtRule(tokens, matchNamespace, markNamespacesAsUsed, context);
-}
-
-function removeUnusedAtRule(tokens, matchCallback, markCallback, context) {
- var atRules = {};
- var atRule;
- var atRuleTokens;
- var atRuleToken;
- var zeroAt;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- matchCallback(tokens[i], atRules);
- }
-
- if (Object.keys(atRules).length === 0) {
- return;
- }
-
- markUsedAtRules(tokens, markCallback, atRules, context);
-
- for (atRule in atRules) {
- atRuleTokens = atRules[atRule];
-
- for (i = 0, l = atRuleTokens.length; i < l; i++) {
- atRuleToken = atRuleTokens[i];
- zeroAt = atRuleToken[0] == Token.AT_RULE ? 1 : 2;
- atRuleToken[zeroAt] = [];
- }
- }
-}
-
-function markUsedAtRules(tokens, markCallback, atRules, context) {
- var boundMarkCallback = markCallback(atRules);
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- switch (tokens[i][0]) {
- case Token.RULE:
- boundMarkCallback(tokens[i], context);
- break;
- case Token.NESTED_BLOCK:
- markUsedAtRules(tokens[i][2], markCallback, atRules, context);
- }
- }
-}
-
-function matchCounterStyle(token, atRules) {
- var match;
-
- if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1].indexOf('@counter-style') === 0) {
- match = token[1][0][1].split(' ')[1];
- atRules[match] = atRules[match] || [];
- atRules[match].push(token);
- }
-}
-
-function markCounterStylesAsUsed(atRules) {
- return function (token, context) {
- var property;
- var wrappedProperty;
- var i, l;
-
- for (i = 0, l = token[2].length; i < l; i++) {
- property = token[2][i];
-
- if (property[1][1] == 'list-style') {
- wrappedProperty = wrapForOptimizing(property);
- populateComponents([wrappedProperty], context.validator, context.warnings);
-
- if (wrappedProperty.components[0].value[0][1] in atRules) {
- delete atRules[property[2][1]];
- }
-
- restoreFromOptimizing([wrappedProperty]);
- }
-
- if (property[1][1] == 'list-style-type' && property[2][1] in atRules) {
- delete atRules[property[2][1]];
- }
- }
- };
-}
-
-function matchFontFace(token, atRules) {
- var property;
- var match;
- var i, l;
-
- if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1] == '@font-face') {
- for (i = 0, l = token[2].length; i < l; i++) {
- property = token[2][i];
-
- if (property[1][1] == 'font-family') {
- match = normalize(property[2][1].toLowerCase());
- atRules[match] = atRules[match] || [];
- atRules[match].push(token);
- break;
- }
- }
- }
-}
-
-function markFontFacesAsUsed(atRules) {
- return function (token, context) {
- var property;
- var wrappedProperty;
- var component;
- var normalizedMatch;
- var i, l;
- var j, m;
-
- for (i = 0, l = token[2].length; i < l; i++) {
- property = token[2][i];
-
- if (property[1][1] == 'font') {
- wrappedProperty = wrapForOptimizing(property);
- populateComponents([wrappedProperty], context.validator, context.warnings);
- component = wrappedProperty.components[6];
-
- for (j = 0, m = component.value.length; j < m; j++) {
- normalizedMatch = normalize(component.value[j][1].toLowerCase());
-
- if (normalizedMatch in atRules) {
- delete atRules[normalizedMatch];
- }
- }
-
- restoreFromOptimizing([wrappedProperty]);
- }
-
- if (property[1][1] == 'font-family') {
- for (j = 2, m = property.length; j < m; j++) {
- normalizedMatch = normalize(property[j][1].toLowerCase());
-
- if (normalizedMatch in atRules) {
- delete atRules[normalizedMatch];
- }
- }
- }
- }
- };
-}
-
-function matchKeyframe(token, atRules) {
- var match;
-
- if (token[0] == Token.NESTED_BLOCK && keyframeRegex.test(token[1][0][1])) {
- match = token[1][0][1].split(' ')[1];
- atRules[match] = atRules[match] || [];
- atRules[match].push(token);
- }
-}
-
-function markKeyframesAsUsed(atRules) {
- return function (token, context) {
- var property;
- var wrappedProperty;
- var component;
- var i, l;
- var j, m;
-
- for (i = 0, l = token[2].length; i < l; i++) {
- property = token[2][i];
-
- if (animationRegex.test(property[1][1])) {
- wrappedProperty = wrapForOptimizing(property);
- populateComponents([wrappedProperty], context.validator, context.warnings);
- component = wrappedProperty.components[7];
-
- for (j = 0, m = component.value.length; j < m; j++) {
- if (component.value[j][1] in atRules) {
- delete atRules[component.value[j][1]];
- }
- }
-
- restoreFromOptimizing([wrappedProperty]);
- }
-
- if (animationNameRegex.test(property[1][1])) {
- for (j = 2, m = property.length; j < m; j++) {
- if (property[j][1] in atRules) {
- delete atRules[property[j][1]];
- }
- }
- }
- }
- };
-}
-
-function matchNamespace(token, atRules) {
- var match;
-
- if (token[0] == Token.AT_RULE && token[1].indexOf('@namespace') === 0) {
- match = token[1].split(' ')[1];
- atRules[match] = atRules[match] || [];
- atRules[match].push(token);
- }
-}
-
-function markNamespacesAsUsed(atRules) {
- var namespaceRegex = new RegExp(Object.keys(atRules).join('\\\||') + '\\\|', 'g');
-
- return function (token) {
- var match;
- var scope;
- var normalizedMatch;
- var i, l;
- var j, m;
-
- for (i = 0, l = token[1].length; i < l; i++) {
- scope = token[1][i];
- match = scope[1].match(namespaceRegex);
-
- for (j = 0, m = match.length; j < m; j++) {
- normalizedMatch = match[j].substring(0, match[j].length - 1);
-
- if (normalizedMatch in atRules) {
- delete atRules[normalizedMatch];
- }
- }
- }
- };
-}
-
-module.exports = removeUnusedAtRules;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/reorderable.js b/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
deleted file mode 100644
index 4a3747a08..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// TODO: it'd be great to merge it with the other canReorder functionality
-
-var rulesOverlap = require('./rules-overlap');
-var specificitiesOverlap = require('./specificities-overlap');
-
-var FLEX_PROPERTIES = /align\-items|box\-align|box\-pack|flex|justify/;
-var BORDER_PROPERTIES = /^border\-(top|right|bottom|left|color|style|width|radius)/;
-
-function canReorder(left, right, cache) {
- for (var i = right.length - 1; i >= 0; i--) {
- for (var j = left.length - 1; j >= 0; j--) {
- if (!canReorderSingle(left[j], right[i], cache))
- return false;
- }
- }
-
- return true;
-}
-
-function canReorderSingle(left, right, cache) {
- var leftName = left[0];
- var leftValue = left[1];
- var leftNameRoot = left[2];
- var leftSelector = left[5];
- var leftInSpecificSelector = left[6];
- var rightName = right[0];
- var rightValue = right[1];
- var rightNameRoot = right[2];
- var rightSelector = right[5];
- var rightInSpecificSelector = right[6];
-
- if (leftName == 'font' && rightName == 'line-height' || rightName == 'font' && leftName == 'line-height')
- return false;
- if (FLEX_PROPERTIES.test(leftName) && FLEX_PROPERTIES.test(rightName))
- return false;
- if (leftNameRoot == rightNameRoot && unprefixed(leftName) == unprefixed(rightName) && (vendorPrefixed(leftName) ^ vendorPrefixed(rightName)))
- return false;
- if (leftNameRoot == 'border' && BORDER_PROPERTIES.test(rightNameRoot) && (leftName == 'border' || leftName == rightNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
- return false;
- if (rightNameRoot == 'border' && BORDER_PROPERTIES.test(leftNameRoot) && (rightName == 'border' || rightName == leftNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
- return false;
- if (leftNameRoot == 'border' && rightNameRoot == 'border' && leftName != rightName && (isSideBorder(leftName) && isStyleBorder(rightName) || isStyleBorder(leftName) && isSideBorder(rightName)))
- return false;
- if (leftNameRoot != rightNameRoot)
- return true;
- if (leftName == rightName && leftNameRoot == rightNameRoot && (leftValue == rightValue || withDifferentVendorPrefix(leftValue, rightValue)))
- return true;
- if (leftName != rightName && leftNameRoot == rightNameRoot && leftName != leftNameRoot && rightName != rightNameRoot)
- return true;
- if (leftName != rightName && leftNameRoot == rightNameRoot && leftValue == rightValue)
- return true;
- if (rightInSpecificSelector && leftInSpecificSelector && !inheritable(leftNameRoot) && !inheritable(rightNameRoot) && !rulesOverlap(rightSelector, leftSelector, false))
- return true;
- if (!specificitiesOverlap(leftSelector, rightSelector, cache))
- return true;
-
- return false;
-}
-
-function vendorPrefixed(name) {
- return /^\-(?:moz|webkit|ms|o)\-/.test(name);
-}
-
-function unprefixed(name) {
- return name.replace(/^\-(?:moz|webkit|ms|o)\-/, '');
-}
-
-function sameBorderComponent(name1, name2) {
- return name1.split('-').pop() == name2.split('-').pop();
-}
-
-function isSideBorder(name) {
- return name == 'border-top' || name == 'border-right' || name == 'border-bottom' || name == 'border-left';
-}
-
-function isStyleBorder(name) {
- return name == 'border-color' || name == 'border-style' || name == 'border-width';
-}
-
-function withDifferentVendorPrefix(value1, value2) {
- return vendorPrefixed(value1) && vendorPrefixed(value2) && value1.split('-')[1] != value2.split('-')[2];
-}
-
-function inheritable(name) {
- // According to http://www.w3.org/TR/CSS21/propidx.html
- // Others will be catched by other, preceeding rules
- return name == 'font' || name == 'line-height' || name == 'list-style';
-}
-
-module.exports = {
- canReorder: canReorder,
- canReorderSingle: canReorderSingle
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js b/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
deleted file mode 100644
index caf7c4c94..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var compactable = require('./compactable');
-
-function restoreWithComponents(property) {
- var descriptor = compactable[property.name];
-
- if (descriptor && descriptor.shorthand) {
- return descriptor.restore(property, compactable);
- } else {
- return property.value;
- }
-}
-
-module.exports = restoreWithComponents;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/restore.js b/node_modules/clean-css/lib/optimizer/level-2/restore.js
deleted file mode 100644
index f9c2f0d33..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/restore.js
+++ /dev/null
@@ -1,303 +0,0 @@
-var shallowClone = require('./clone').shallow;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-function isInheritOnly(values) {
- for (var i = 0, l = values.length; i < l; i++) {
- var value = values[i][1];
-
- if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH)
- return false;
- }
-
- return true;
-}
-
-function background(property, compactable, lastInMultiplex) {
- var components = property.components;
- var restored = [];
- var needsOne, needsBoth;
-
- function restoreValue(component) {
- Array.prototype.unshift.apply(restored, component.value);
- }
-
- function isDefaultValue(component) {
- var descriptor = compactable[component.name];
-
- if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
- return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true);
- } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
- return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1];
- } else {
- return component.value[0][1] == descriptor.defaultValue;
- }
- }
-
- for (var i = components.length - 1; i >= 0; i--) {
- var component = components[i];
- var isDefault = isDefaultValue(component);
-
- if (component.name == 'background-clip') {
- var originComponent = components[i - 1];
- var isOriginDefault = isDefaultValue(originComponent);
-
- needsOne = component.value[0][1] == originComponent.value[0][1];
-
- needsBoth = !needsOne && (
- (isOriginDefault && !isDefault) ||
- (!isOriginDefault && !isDefault) ||
- (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
-
- if (needsOne) {
- restoreValue(originComponent);
- } else if (needsBoth) {
- restoreValue(component);
- restoreValue(originComponent);
- }
-
- i--;
- } else if (component.name == 'background-size') {
- var positionComponent = components[i - 1];
- var isPositionDefault = isDefaultValue(positionComponent);
-
- needsOne = !isPositionDefault && isDefault;
-
- needsBoth = !needsOne &&
- (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
-
- if (needsOne) {
- restoreValue(positionComponent);
- } else if (needsBoth) {
- restoreValue(component);
- restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
- restoreValue(positionComponent);
- } else if (positionComponent.value.length == 1) {
- restoreValue(positionComponent);
- }
-
- i--;
- } else {
- if (isDefault || compactable[component.name].multiplexLastOnly && !lastInMultiplex)
- continue;
-
- restoreValue(component);
- }
- }
-
- if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0')
- restored.push(property.value[0]);
-
- if (restored.length === 0)
- restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
- if (isInheritOnly(restored))
- return [restored[0]];
-
- return restored;
-}
-
-function borderRadius(property, compactable) {
- if (property.multiplex) {
- var horizontal = shallowClone(property);
- var vertical = shallowClone(property);
-
- for (var i = 0; i < 4; i++) {
- var component = property.components[i];
-
- var horizontalComponent = shallowClone(property);
- horizontalComponent.value = [component.value[0]];
- horizontal.components.push(horizontalComponent);
-
- var verticalComponent = shallowClone(property);
- // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
- // longhands have two values, whereas tokenizer does not care about populating 2nd value
- // if it's missing, hence this fallback
- verticalComponent.value = [component.value[1] || component.value[0]];
- vertical.components.push(verticalComponent);
- }
-
- var horizontalValues = fourValues(horizontal, compactable);
- var verticalValues = fourValues(vertical, compactable);
-
- if (horizontalValues.length == verticalValues.length &&
- horizontalValues[0][1] == verticalValues[0][1] &&
- (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) &&
- (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) &&
- (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
- return horizontalValues;
- } else {
- return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
- }
- } else {
- return fourValues(property, compactable);
- }
-}
-
-function font(property, compactable) {
- var components = property.components;
- var restored = [];
- var component;
- var componentIndex = 0;
- var fontFamilyIndex = 0;
-
- if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
- property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
- return property.value;
- }
-
- // first four components are optional
- while (componentIndex < 4) {
- component = components[componentIndex];
-
- if (component.value[0][1] != compactable[component.name].defaultValue) {
- Array.prototype.push.apply(restored, component.value);
- }
-
- componentIndex++;
- }
-
- // then comes font-size
- Array.prototype.push.apply(restored, components[componentIndex].value);
- componentIndex++;
-
- // then may come line-height
- if (components[componentIndex].value[0][1] != compactable[components[componentIndex].name].defaultValue) {
- Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
- Array.prototype.push.apply(restored, components[componentIndex].value);
- }
-
- componentIndex++;
-
- // then comes font-family
- while (components[componentIndex].value[fontFamilyIndex]) {
- restored.push(components[componentIndex].value[fontFamilyIndex]);
-
- if (components[componentIndex].value[fontFamilyIndex + 1]) {
- restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
- }
-
- fontFamilyIndex++;
- }
-
- if (isInheritOnly(restored)) {
- return [restored[0]];
- }
-
- return restored;
-}
-
-function fourValues(property) {
- var components = property.components;
- var value1 = components[0].value[0];
- var value2 = components[1].value[0];
- var value3 = components[2].value[0];
- var value4 = components[3].value[0];
-
- if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
- return [value1];
- } else if (value1[1] == value3[1] && value2[1] == value4[1]) {
- return [value1, value2];
- } else if (value2[1] == value4[1]) {
- return [value1, value2, value3];
- } else {
- return [value1, value2, value3, value4];
- }
-}
-
-function multiplex(restoreWith) {
- return function (property, compactable) {
- if (!property.multiplex)
- return restoreWith(property, compactable, true);
-
- var multiplexSize = 0;
- var restored = [];
- var componentMultiplexSoFar = {};
- var i, l;
-
- // At this point we don't know what's the multiplex size, e.g. how many background layers are there
- for (i = 0, l = property.components[0].value.length; i < l; i++) {
- if (property.components[0].value[i][1] == Marker.COMMA)
- multiplexSize++;
- }
-
- for (i = 0; i <= multiplexSize; i++) {
- var _property = shallowClone(property);
-
- // We split multiplex into parts and restore them one by one
- for (var j = 0, m = property.components.length; j < m; j++) {
- var componentToClone = property.components[j];
- var _component = shallowClone(componentToClone);
- _property.components.push(_component);
-
- // The trick is some properties has more than one value, so we iterate over values looking for
- // a multiplex separator - a comma
- for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
- if (componentToClone.value[k][1] == Marker.COMMA) {
- componentMultiplexSoFar[_component.name] = k + 1;
- break;
- }
-
- _component.value.push(componentToClone.value[k]);
- }
- }
-
- // No we can restore shorthand value
- var lastInMultiplex = i == multiplexSize;
- var _restored = restoreWith(_property, compactable, lastInMultiplex);
- Array.prototype.push.apply(restored, _restored);
-
- if (i < multiplexSize)
- restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
- }
-
- return restored;
- };
-}
-
-function withoutDefaults(property, compactable) {
- var components = property.components;
- var restored = [];
-
- for (var i = components.length - 1; i >= 0; i--) {
- var component = components[i];
- var descriptor = compactable[component.name];
-
- if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, compactable, descriptor.keepUnlessDefault)) {
- restored.unshift(component.value[0]);
- }
- }
-
- if (restored.length === 0)
- restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
- if (isInheritOnly(restored))
- return [restored[0]];
-
- return restored;
-}
-
-function isDefault(components, compactable, propertyName) {
- var component;
- var i, l;
-
- for (i = 0, l = components.length; i < l; i++) {
- component = components[i];
-
- if (component.name == propertyName && component.value[0][1] == compactable[propertyName].defaultValue) {
- return true;
- }
- }
-
- return false;
-}
-
-module.exports = {
- background: background,
- borderRadius: borderRadius,
- font: font,
- fourValues: fourValues,
- multiplex: multiplex,
- withoutDefaults: withoutDefaults
-};
diff --git a/node_modules/clean-css/lib/optimizer/level-2/restructure.js b/node_modules/clean-css/lib/optimizer/level-2/restructure.js
deleted file mode 100644
index 90b8bfa65..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/restructure.js
+++ /dev/null
@@ -1,389 +0,0 @@
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var isMergeable = require('./is-mergeable');
-var tidyRuleDuplicates = require('./tidy-rule-duplicates');
-
-var Token = require('../../tokenizer/token');
-
-var cloneArray = require('../../utils/clone-array');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function naturalSorter(a, b) {
- return a > b ? 1 : -1;
-}
-
-function cloneAndMergeSelectors(propertyA, propertyB) {
- var cloned = cloneArray(propertyA);
- cloned[5] = cloned[5].concat(propertyB[5]);
-
- return cloned;
-}
-
-function restructure(tokens, context) {
- var options = context.options;
- var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
- var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
- var mergeLimit = options.compatibility.selectors.mergeLimit;
- var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
- var specificityCache = context.cache.specificity;
- var movableTokens = {};
- var movedProperties = [];
- var multiPropertyMoveCache = {};
- var movedToBeDropped = [];
- var maxCombinationsLevel = 2;
- var ID_JOIN_CHARACTER = '%';
-
- function sendToMultiPropertyMoveCache(position, movedProperty, allFits) {
- for (var i = allFits.length - 1; i >= 0; i--) {
- var fit = allFits[i][0];
- var id = addToCache(movedProperty, fit);
-
- if (multiPropertyMoveCache[id].length > 1 && processMultiPropertyMove(position, multiPropertyMoveCache[id])) {
- removeAllMatchingFromCache(id);
- break;
- }
- }
- }
-
- function addToCache(movedProperty, fit) {
- var id = cacheId(fit);
- multiPropertyMoveCache[id] = multiPropertyMoveCache[id] || [];
- multiPropertyMoveCache[id].push([movedProperty, fit]);
- return id;
- }
-
- function removeAllMatchingFromCache(matchId) {
- var matchSelectors = matchId.split(ID_JOIN_CHARACTER);
- var forRemoval = [];
- var i;
-
- for (var id in multiPropertyMoveCache) {
- var selectors = id.split(ID_JOIN_CHARACTER);
- for (i = selectors.length - 1; i >= 0; i--) {
- if (matchSelectors.indexOf(selectors[i]) > -1) {
- forRemoval.push(id);
- break;
- }
- }
- }
-
- for (i = forRemoval.length - 1; i >= 0; i--) {
- delete multiPropertyMoveCache[forRemoval[i]];
- }
- }
-
- function cacheId(cachedTokens) {
- var id = [];
- for (var i = 0, l = cachedTokens.length; i < l; i++) {
- id.push(serializeRules(cachedTokens[i][1]));
- }
- return id.join(ID_JOIN_CHARACTER);
- }
-
- function tokensToMerge(sourceTokens) {
- var uniqueTokensWithBody = [];
- var mergeableTokens = [];
-
- for (var i = sourceTokens.length - 1; i >= 0; i--) {
- if (!isMergeable(serializeRules(sourceTokens[i][1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
- continue;
- }
-
- mergeableTokens.unshift(sourceTokens[i]);
- if (sourceTokens[i][2].length > 0 && uniqueTokensWithBody.indexOf(sourceTokens[i]) == -1)
- uniqueTokensWithBody.push(sourceTokens[i]);
- }
-
- return uniqueTokensWithBody.length > 1 ?
- mergeableTokens :
- [];
- }
-
- function shortenIfPossible(position, movedProperty) {
- var name = movedProperty[0];
- var value = movedProperty[1];
- var key = movedProperty[4];
- var valueSize = name.length + value.length + 1;
- var allSelectors = [];
- var qualifiedTokens = [];
-
- var mergeableTokens = tokensToMerge(movableTokens[key]);
- if (mergeableTokens.length < 2)
- return;
-
- var allFits = findAllFits(mergeableTokens, valueSize, 1);
- var bestFit = allFits[0];
- if (bestFit[1] > 0)
- return sendToMultiPropertyMoveCache(position, movedProperty, allFits);
-
- for (var i = bestFit[0].length - 1; i >=0; i--) {
- allSelectors = bestFit[0][i][1].concat(allSelectors);
- qualifiedTokens.unshift(bestFit[0][i]);
- }
-
- allSelectors = tidyRuleDuplicates(allSelectors);
- dropAsNewTokenAt(position, [movedProperty], allSelectors, qualifiedTokens);
- }
-
- function fitSorter(fit1, fit2) {
- return fit1[1] > fit2[1] ? 1 : (fit1[1] == fit2[1] ? 0 : -1);
- }
-
- function findAllFits(mergeableTokens, propertySize, propertiesCount) {
- var combinations = allCombinations(mergeableTokens, propertySize, propertiesCount, maxCombinationsLevel - 1);
- return combinations.sort(fitSorter);
- }
-
- function allCombinations(tokensVariant, propertySize, propertiesCount, level) {
- var differenceVariants = [[tokensVariant, sizeDifference(tokensVariant, propertySize, propertiesCount)]];
- if (tokensVariant.length > 2 && level > 0) {
- for (var i = tokensVariant.length - 1; i >= 0; i--) {
- var subVariant = Array.prototype.slice.call(tokensVariant, 0);
- subVariant.splice(i, 1);
- differenceVariants = differenceVariants.concat(allCombinations(subVariant, propertySize, propertiesCount, level - 1));
- }
- }
-
- return differenceVariants;
- }
-
- function sizeDifference(tokensVariant, propertySize, propertiesCount) {
- var allSelectorsSize = 0;
- for (var i = tokensVariant.length - 1; i >= 0; i--) {
- allSelectorsSize += tokensVariant[i][2].length > propertiesCount ? serializeRules(tokensVariant[i][1]).length : -1;
- }
- return allSelectorsSize - (tokensVariant.length - 1) * propertySize + 1;
- }
-
- function dropAsNewTokenAt(position, properties, allSelectors, mergeableTokens) {
- var i, j, k, m;
- var allProperties = [];
-
- for (i = mergeableTokens.length - 1; i >= 0; i--) {
- var mergeableToken = mergeableTokens[i];
-
- for (j = mergeableToken[2].length - 1; j >= 0; j--) {
- var mergeableProperty = mergeableToken[2][j];
-
- for (k = 0, m = properties.length; k < m; k++) {
- var property = properties[k];
-
- var mergeablePropertyName = mergeableProperty[1][1];
- var propertyName = property[0];
- var propertyBody = property[4];
- if (mergeablePropertyName == propertyName && serializeBody([mergeableProperty]) == propertyBody) {
- mergeableToken[2].splice(j, 1);
- break;
- }
- }
- }
- }
-
- for (i = properties.length - 1; i >= 0; i--) {
- allProperties.unshift(properties[i][3]);
- }
-
- var newToken = [Token.RULE, allSelectors, allProperties];
- tokens.splice(position, 0, newToken);
- }
-
- function dropPropertiesAt(position, movedProperty) {
- var key = movedProperty[4];
- var toMove = movableTokens[key];
-
- if (toMove && toMove.length > 1) {
- if (!shortenMultiMovesIfPossible(position, movedProperty))
- shortenIfPossible(position, movedProperty);
- }
- }
-
- function shortenMultiMovesIfPossible(position, movedProperty) {
- var candidates = [];
- var propertiesAndMergableTokens = [];
- var key = movedProperty[4];
- var j, k;
-
- var mergeableTokens = tokensToMerge(movableTokens[key]);
- if (mergeableTokens.length < 2)
- return;
-
- movableLoop:
- for (var value in movableTokens) {
- var tokensList = movableTokens[value];
-
- for (j = mergeableTokens.length - 1; j >= 0; j--) {
- if (tokensList.indexOf(mergeableTokens[j]) == -1)
- continue movableLoop;
- }
-
- candidates.push(value);
- }
-
- if (candidates.length < 2)
- return false;
-
- for (j = candidates.length - 1; j >= 0; j--) {
- for (k = movedProperties.length - 1; k >= 0; k--) {
- if (movedProperties[k][4] == candidates[j]) {
- propertiesAndMergableTokens.unshift([movedProperties[k], mergeableTokens]);
- break;
- }
- }
- }
-
- return processMultiPropertyMove(position, propertiesAndMergableTokens);
- }
-
- function processMultiPropertyMove(position, propertiesAndMergableTokens) {
- var valueSize = 0;
- var properties = [];
- var property;
-
- for (var i = propertiesAndMergableTokens.length - 1; i >= 0; i--) {
- property = propertiesAndMergableTokens[i][0];
- var fullValue = property[4];
- valueSize += fullValue.length + (i > 0 ? 1 : 0);
-
- properties.push(property);
- }
-
- var mergeableTokens = propertiesAndMergableTokens[0][1];
- var bestFit = findAllFits(mergeableTokens, valueSize, properties.length)[0];
- if (bestFit[1] > 0)
- return false;
-
- var allSelectors = [];
- var qualifiedTokens = [];
- for (i = bestFit[0].length - 1; i >= 0; i--) {
- allSelectors = bestFit[0][i][1].concat(allSelectors);
- qualifiedTokens.unshift(bestFit[0][i]);
- }
-
- allSelectors = tidyRuleDuplicates(allSelectors);
- dropAsNewTokenAt(position, properties, allSelectors, qualifiedTokens);
-
- for (i = properties.length - 1; i >= 0; i--) {
- property = properties[i];
- var index = movedProperties.indexOf(property);
-
- delete movableTokens[property[4]];
-
- if (index > -1 && movedToBeDropped.indexOf(index) == -1)
- movedToBeDropped.push(index);
- }
-
- return true;
- }
-
- function boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) {
- var propertyName = property[0];
- var movedPropertyName = movedProperty[0];
- if (propertyName != movedPropertyName)
- return false;
-
- var key = movedProperty[4];
- var toMove = movableTokens[key];
- return toMove && toMove.indexOf(token) > -1;
- }
-
- for (var i = tokens.length - 1; i >= 0; i--) {
- var token = tokens[i];
- var isRule;
- var j, k, m;
- var samePropertyAt;
-
- if (token[0] == Token.RULE) {
- isRule = true;
- } else if (token[0] == Token.NESTED_BLOCK) {
- isRule = false;
- } else {
- continue;
- }
-
- // We cache movedProperties.length as it may change in the loop
- var movedCount = movedProperties.length;
-
- var properties = extractProperties(token);
- movedToBeDropped = [];
-
- var unmovableInCurrentToken = [];
- for (j = properties.length - 1; j >= 0; j--) {
- for (k = j - 1; k >= 0; k--) {
- if (!canReorderSingle(properties[j], properties[k], specificityCache)) {
- unmovableInCurrentToken.push(j);
- break;
- }
- }
- }
-
- for (j = properties.length - 1; j >= 0; j--) {
- var property = properties[j];
- var movedSameProperty = false;
-
- for (k = 0; k < movedCount; k++) {
- var movedProperty = movedProperties[k];
-
- if (movedToBeDropped.indexOf(k) == -1 && (!canReorderSingle(property, movedProperty, specificityCache) && !boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) ||
- movableTokens[movedProperty[4]] && movableTokens[movedProperty[4]].length === mergeLimit)) {
- dropPropertiesAt(i + 1, movedProperty, token);
-
- if (movedToBeDropped.indexOf(k) == -1) {
- movedToBeDropped.push(k);
- delete movableTokens[movedProperty[4]];
- }
- }
-
- if (!movedSameProperty) {
- movedSameProperty = property[0] == movedProperty[0] && property[1] == movedProperty[1];
-
- if (movedSameProperty) {
- samePropertyAt = k;
- }
- }
- }
-
- if (!isRule || unmovableInCurrentToken.indexOf(j) > -1)
- continue;
-
- var key = property[4];
-
- if (movedSameProperty && movedProperties[samePropertyAt][5].length + property[5].length > mergeLimit) {
- dropPropertiesAt(i + 1, movedProperties[samePropertyAt]);
- movedProperties.splice(samePropertyAt, 1);
- movableTokens[key] = [token];
- movedSameProperty = false;
- } else {
- movableTokens[key] = movableTokens[key] || [];
- movableTokens[key].push(token);
- }
-
- if (movedSameProperty) {
- movedProperties[samePropertyAt] = cloneAndMergeSelectors(movedProperties[samePropertyAt], property);
- } else {
- movedProperties.push(property);
- }
- }
-
- movedToBeDropped = movedToBeDropped.sort(naturalSorter);
- for (j = 0, m = movedToBeDropped.length; j < m; j++) {
- var dropAt = movedToBeDropped[j] - j;
- movedProperties.splice(dropAt, 1);
- }
- }
-
- var position = tokens[0] && tokens[0][0] == Token.AT_RULE && tokens[0][1].indexOf('@charset') === 0 ? 1 : 0;
- for (; position < tokens.length - 1; position++) {
- var isImportRule = tokens[position][0] === Token.AT_RULE && tokens[position][1].indexOf('@import') === 0;
- var isComment = tokens[position][0] === Token.COMMENT;
- if (!(isImportRule || isComment))
- break;
- }
-
- for (i = 0; i < movedProperties.length; i++) {
- dropPropertiesAt(position, movedProperties[i]);
- }
-}
-
-module.exports = restructure;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js b/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
deleted file mode 100644
index 811a517b2..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var MODIFIER_PATTERN = /\-\-.+$/;
-
-function rulesOverlap(rule1, rule2, bemMode) {
- var scope1;
- var scope2;
- var i, l;
- var j, m;
-
- for (i = 0, l = rule1.length; i < l; i++) {
- scope1 = rule1[i][1];
-
- for (j = 0, m = rule2.length; j < m; j++) {
- scope2 = rule2[j][1];
-
- if (scope1 == scope2) {
- return true;
- }
-
- if (bemMode && withoutModifiers(scope1) == withoutModifiers(scope2)) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-function withoutModifiers(scope) {
- return scope.replace(MODIFIER_PATTERN, '');
-}
-
-module.exports = rulesOverlap;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js b/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
deleted file mode 100644
index bde037446..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var specificity = require('./specificity');
-
-function specificitiesOverlap(selector1, selector2, cache) {
- var specificity1;
- var specificity2;
- var i, l;
- var j, m;
-
- for (i = 0, l = selector1.length; i < l; i++) {
- specificity1 = findSpecificity(selector1[i][1], cache);
-
- for (j = 0, m = selector2.length; j < m; j++) {
- specificity2 = findSpecificity(selector2[j][1], cache);
-
- if (specificity1[0] === specificity2[0] && specificity1[1] === specificity2[1] && specificity1[2] === specificity2[2]) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-function findSpecificity(selector, cache) {
- var value;
-
- if (!(selector in cache)) {
- cache[selector] = value = specificity(selector);
- }
-
- return value || cache[selector];
-}
-
-module.exports = specificitiesOverlap;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/specificity.js b/node_modules/clean-css/lib/optimizer/level-2/specificity.js
deleted file mode 100644
index bbd224f15..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/specificity.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-
-var Selector = {
- ADJACENT_SIBLING: '+',
- DESCENDANT: '>',
- DOT: '.',
- HASH: '#',
- NON_ADJACENT_SIBLING: '~',
- PSEUDO: ':'
-};
-
-var LETTER_PATTERN = /[a-zA-Z]/;
-var NOT_PREFIX = ':not(';
-var SEPARATOR_PATTERN = /[\s,\(>~\+]/;
-
-function specificity(selector) {
- var result = [0, 0, 0];
- var character;
- var isEscaped;
- var isSingleQuoted;
- var isDoubleQuoted;
- var roundBracketLevel = 0;
- var couldIntroduceNewTypeSelector;
- var withinNotPseudoClass = false;
- var wasPseudoClass = false;
- var i, l;
-
- for (i = 0, l = selector.length; i < l; i++) {
- character = selector[i];
-
- if (isEscaped) {
- // noop
- } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
- isSingleQuoted = true;
- } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && isSingleQuoted) {
- isSingleQuoted = false;
- } else if (character == Marker.DOUBLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
- isDoubleQuoted = true;
- } else if (character == Marker.DOUBLE_QUOTE && isDoubleQuoted && !isSingleQuoted) {
- isDoubleQuoted = false;
- } else if (isSingleQuoted || isDoubleQuoted) {
- continue;
- } else if (roundBracketLevel > 0 && !withinNotPseudoClass) {
- // noop
- } else if (character == Marker.OPEN_ROUND_BRACKET) {
- roundBracketLevel++;
- } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1) {
- roundBracketLevel--;
- withinNotPseudoClass = false;
- } else if (character == Marker.CLOSE_ROUND_BRACKET) {
- roundBracketLevel--;
- } else if (character == Selector.HASH) {
- result[0]++;
- } else if (character == Selector.DOT || character == Marker.OPEN_SQUARE_BRACKET) {
- result[1]++;
- } else if (character == Selector.PSEUDO && !wasPseudoClass && !isNotPseudoClass(selector, i)) {
- result[1]++;
- withinNotPseudoClass = false;
- } else if (character == Selector.PSEUDO) {
- withinNotPseudoClass = true;
- } else if ((i === 0 || couldIntroduceNewTypeSelector) && LETTER_PATTERN.test(character)) {
- result[2]++;
- }
-
- isEscaped = character == Marker.BACK_SLASH;
- wasPseudoClass = character == Selector.PSEUDO;
- couldIntroduceNewTypeSelector = !isEscaped && SEPARATOR_PATTERN.test(character);
- }
-
- return result;
-}
-
-function isNotPseudoClass(selector, index) {
- return selector.indexOf(NOT_PREFIX, index) === index;
-}
-
-module.exports = specificity;
diff --git a/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js b/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
deleted file mode 100644
index 30a9c2177..000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function ruleSorter(s1, s2) {
- return s1[1] > s2[1] ? 1 : -1;
-}
-
-function tidyRuleDuplicates(rules) {
- var list = [];
- var repeated = [];
-
- for (var i = 0, l = rules.length; i < l; i++) {
- var rule = rules[i];
-
- if (repeated.indexOf(rule[1]) == -1) {
- repeated.push(rule[1]);
- list.push(rule);
- }
- }
-
- return list.sort(ruleSorter);
-}
-
-module.exports = tidyRuleDuplicates;
diff --git a/node_modules/clean-css/lib/optimizer/remove-unused.js b/node_modules/clean-css/lib/optimizer/remove-unused.js
deleted file mode 100644
index 7b90c4079..000000000
--- a/node_modules/clean-css/lib/optimizer/remove-unused.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function removeUnused(properties) {
- for (var i = properties.length - 1; i >= 0; i--) {
- var property = properties[i];
-
- if (property.unused) {
- property.all.splice(property.position, 1);
- }
- }
-}
-
-module.exports = removeUnused;
diff --git a/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js b/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
deleted file mode 100644
index ebd69c2ac..000000000
--- a/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-
-var ASTERISK_HACK = '*';
-var BACKSLASH_HACK = '\\';
-var IMPORTANT_TOKEN = '!important';
-var UNDERSCORE_HACK = '_';
-var BANG_HACK = '!ie';
-
-function restoreFromOptimizing(properties, restoreCallback) {
- var property;
- var restored;
- var current;
- var i;
-
- for (i = properties.length - 1; i >= 0; i--) {
- property = properties[i];
-
- if (property.unused) {
- continue;
- }
-
- if (!property.dirty && !property.important && !property.hack) {
- continue;
- }
-
- if (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.UNDERSCORE) {
- property.name = UNDERSCORE_HACK + property.name;
- } else if (property.hack[0] == Hack.ASTERISK) {
- property.name = ASTERISK_HACK + property.name;
- } else if (property.hack[0] == Hack.BACKSLASH) {
- property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1];
- } else if (property.hack[0] == Hack.BANG) {
- property.value[property.value.length - 1][1] += Marker.SPACE + BANG_HACK;
- }
-}
-
-module.exports = restoreFromOptimizing;
diff --git a/node_modules/clean-css/lib/optimizer/validator.js b/node_modules/clean-css/lib/optimizer/validator.js
deleted file mode 100644
index fd3fb97e4..000000000
--- a/node_modules/clean-css/lib/optimizer/validator.js
+++ /dev/null
@@ -1,529 +0,0 @@
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)';
-var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
-
-var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i');
-var decimalRegex = /[0-9]/;
-var functionAnyRegex = new RegExp('^' + functionAnyRegexStr + '$', 'i');
-var hslColorRegex = /^hsl\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+\s{0,31}\)$/;
-var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z][a-z0-9\-_]*)$/i;
-var namedEntityRegex = /^[a-z]+$/i;
-var prefixRegex = /^-([a-z0-9]|-)*$/i;
-var rgbColorRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\.\d]+\s{0,31}\)$/;
-var timingFunctionRegex = /^(cubic\-bezier|steps)\([^\)]+\)$/;
-var validTimeUnits = ['ms', 's'];
-var urlRegex = /^url\([\s\S]+\)$/i;
-var variableRegex = new RegExp('^' + variableRegexStr + '$', 'i');
-
-var eightValueColorRegex = /^#[0-9a-f]{8}$/i;
-var fourValueColorRegex = /^#[0-9a-f]{4}$/i;
-var sixValueColorRegex = /^#[0-9a-f]{6}$/i;
-var threeValueColorRegex = /^#[0-9a-f]{3}$/i;
-
-var DECIMAL_DOT = '.';
-var MINUS_SIGN = '-';
-var PLUS_SIGN = '+';
-
-var Keywords = {
- '^': [
- 'inherit',
- 'initial',
- 'unset'
- ],
- '*-style': [
- 'auto',
- 'dashed',
- 'dotted',
- 'double',
- 'groove',
- 'hidden',
- 'inset',
- 'none',
- 'outset',
- 'ridge',
- 'solid'
- ],
- '*-timing-function': [
- 'ease',
- 'ease-in',
- 'ease-in-out',
- 'ease-out',
- 'linear',
- 'step-end',
- 'step-start'
- ],
- 'animation-direction': [
- 'alternate',
- 'alternate-reverse',
- 'normal',
- 'reverse'
- ],
- 'animation-fill-mode': [
- 'backwards',
- 'both',
- 'forwards',
- 'none'
- ],
- 'animation-iteration-count': [
- 'infinite'
- ],
- 'animation-name': [
- 'none'
- ],
- 'animation-play-state': [
- 'paused',
- 'running'
- ],
- 'background-attachment': [
- 'fixed',
- 'inherit',
- 'local',
- 'scroll'
- ],
- 'background-clip': [
- 'border-box',
- 'content-box',
- 'inherit',
- 'padding-box',
- 'text'
- ],
- 'background-origin': [
- 'border-box',
- 'content-box',
- 'inherit',
- 'padding-box'
- ],
- 'background-position': [
- 'bottom',
- 'center',
- 'left',
- 'right',
- 'top'
- ],
- 'background-repeat': [
- 'no-repeat',
- 'inherit',
- 'repeat',
- 'repeat-x',
- 'repeat-y',
- 'round',
- 'space'
- ],
- 'background-size': [
- 'auto',
- 'cover',
- 'contain'
- ],
- 'border-collapse': [
- 'collapse',
- 'inherit',
- 'separate'
- ],
- 'bottom': [
- 'auto'
- ],
- 'clear': [
- 'both',
- 'left',
- 'none',
- 'right'
- ],
- 'color': [
- 'transparent'
- ],
- 'cursor': [
- 'all-scroll',
- 'auto',
- 'col-resize',
- 'crosshair',
- 'default',
- 'e-resize',
- 'help',
- 'move',
- 'n-resize',
- 'ne-resize',
- 'no-drop',
- 'not-allowed',
- 'nw-resize',
- 'pointer',
- 'progress',
- 'row-resize',
- 's-resize',
- 'se-resize',
- 'sw-resize',
- 'text',
- 'vertical-text',
- 'w-resize',
- 'wait'
- ],
- 'display': [
- 'block',
- 'inline',
- 'inline-block',
- 'inline-table',
- 'list-item',
- 'none',
- 'table',
- 'table-caption',
- 'table-cell',
- 'table-column',
- 'table-column-group',
- 'table-footer-group',
- 'table-header-group',
- 'table-row',
- 'table-row-group'
- ],
- 'float': [
- 'left',
- 'none',
- 'right'
- ],
- 'left': [
- 'auto'
- ],
- 'font': [
- 'caption',
- 'icon',
- 'menu',
- 'message-box',
- 'small-caption',
- 'status-bar',
- 'unset'
- ],
- 'font-size': [
- 'large',
- 'larger',
- 'medium',
- 'small',
- 'smaller',
- 'x-large',
- 'x-small',
- 'xx-large',
- 'xx-small'
- ],
- 'font-stretch': [
- 'condensed',
- 'expanded',
- 'extra-condensed',
- 'extra-expanded',
- 'normal',
- 'semi-condensed',
- 'semi-expanded',
- 'ultra-condensed',
- 'ultra-expanded'
- ],
- 'font-style': [
- 'italic',
- 'normal',
- 'oblique'
- ],
- 'font-variant': [
- 'normal',
- 'small-caps'
- ],
- 'font-weight': [
- '100',
- '200',
- '300',
- '400',
- '500',
- '600',
- '700',
- '800',
- '900',
- 'bold',
- 'bolder',
- 'lighter',
- 'normal'
- ],
- 'line-height': [
- 'normal'
- ],
- 'list-style-position': [
- 'inside',
- 'outside'
- ],
- 'list-style-type': [
- 'armenian',
- 'circle',
- 'decimal',
- 'decimal-leading-zero',
- 'disc',
- 'decimal|disc', // this is the default value of list-style-type, see comment in compactable.js
- 'georgian',
- 'lower-alpha',
- 'lower-greek',
- 'lower-latin',
- 'lower-roman',
- 'none',
- 'square',
- 'upper-alpha',
- 'upper-latin',
- 'upper-roman'
- ],
- 'overflow': [
- 'auto',
- 'hidden',
- 'scroll',
- 'visible'
- ],
- 'position': [
- 'absolute',
- 'fixed',
- 'relative',
- 'static'
- ],
- 'right': [
- 'auto'
- ],
- 'text-align': [
- 'center',
- 'justify',
- 'left',
- 'left|right', // this is the default value of list-style-type, see comment in compactable.js
- 'right'
- ],
- 'text-decoration': [
- 'line-through',
- 'none',
- 'overline',
- 'underline'
- ],
- 'text-overflow': [
- 'clip',
- 'ellipsis'
- ],
- 'top': [
- 'auto'
- ],
- 'vertical-align': [
- 'baseline',
- 'bottom',
- 'middle',
- 'sub',
- 'super',
- 'text-bottom',
- 'text-top',
- 'top'
- ],
- 'visibility': [
- 'collapse',
- 'hidden',
- 'visible'
- ],
- 'white-space': [
- 'normal',
- 'nowrap',
- 'pre'
- ],
- 'width': [
- 'inherit',
- 'initial',
- 'medium',
- 'thick',
- 'thin'
- ]
-};
-
-var Units = [
- '%',
- 'ch',
- 'cm',
- 'em',
- 'ex',
- 'in',
- 'mm',
- 'pc',
- 'pt',
- 'px',
- 'rem',
- 'vh',
- 'vm',
- 'vmax',
- 'vmin',
- 'vw'
-];
-
-function isColor(value) {
- return value != 'auto' &&
- (
- isKeyword('color')(value) ||
- isHexColor(value) ||
- isColorFunction(value) ||
- isNamedEntity(value)
- );
-}
-
-function isColorFunction(value) {
- return isRgbColor(value) || isHslColor(value);
-}
-
-function isDynamicUnit(value) {
- return calcRegex.test(value);
-}
-
-function isFunction(value) {
- return functionAnyRegex.test(value);
-}
-
-function isHexColor(value) {
- return threeValueColorRegex.test(value) || fourValueColorRegex.test(value) || sixValueColorRegex.test(value) || eightValueColorRegex.test(value);
-}
-
-function isHslColor(value) {
- return hslColorRegex.test(value);
-}
-
-function isIdentifier(value) {
- return identifierRegex.test(value);
-}
-
-function isImage(value) {
- return value == 'none' || value == 'inherit' || isUrl(value);
-}
-
-function isKeyword(propertyName) {
- return function(value) {
- return Keywords[propertyName].indexOf(value) > -1;
- };
-}
-
-function isNamedEntity(value) {
- return namedEntityRegex.test(value);
-}
-
-function isNumber(value) {
- return scanForNumber(value) == value.length;
-}
-
-function isRgbColor(value) {
- return rgbColorRegex.test(value);
-}
-
-function isPrefixed(value) {
- return prefixRegex.test(value);
-}
-
-function isPositiveNumber(value) {
- return isNumber(value) &&
- parseFloat(value) >= 0;
-}
-
-function isVariable(value) {
- return variableRegex.test(value);
-}
-
-function isTime(value) {
- var numberUpTo = scanForNumber(value);
-
- return numberUpTo == value.length && parseInt(value) === 0 ||
- numberUpTo > -1 && validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1;
-}
-
-function isTimingFunction() {
- var isTimingFunctionKeyword = isKeyword('*-timing-function');
-
- return function (value) {
- return isTimingFunctionKeyword(value) || timingFunctionRegex.test(value);
- };
-}
-
-function isUnit(validUnits, value) {
- var numberUpTo = scanForNumber(value);
-
- return numberUpTo == value.length && parseInt(value) === 0 ||
- numberUpTo > -1 && validUnits.indexOf(value.slice(numberUpTo + 1)) > -1 ||
- value == 'auto' ||
- value == 'inherit';
-}
-
-function isUrl(value) {
- return urlRegex.test(value);
-}
-
-function isZIndex(value) {
- return value == 'auto' ||
- isNumber(value) ||
- isKeyword('^')(value);
-}
-
-function scanForNumber(value) {
- var hasDot = false;
- var hasSign = false;
- var character;
- var i, l;
-
- for (i = 0, l = value.length; i < l; i++) {
- character = value[i];
-
- if (i === 0 && (character == PLUS_SIGN || character == MINUS_SIGN)) {
- hasSign = true;
- } else if (i > 0 && hasSign && (character == PLUS_SIGN || character == MINUS_SIGN)) {
- return i - 1;
- } else if (character == DECIMAL_DOT && !hasDot) {
- hasDot = true;
- } else if (character == DECIMAL_DOT && hasDot) {
- return i - 1;
- } else if (decimalRegex.test(character)) {
- continue;
- } else {
- return i - 1;
- }
- }
-
- return i;
-}
-
-function validator(compatibility) {
- var validUnits = Units.slice(0).filter(function (value) {
- return !(value in compatibility.units) || compatibility.units[value] === true;
- });
-
- return {
- colorOpacity: compatibility.colors.opacity,
- isAnimationDirectionKeyword: isKeyword('animation-direction'),
- isAnimationFillModeKeyword: isKeyword('animation-fill-mode'),
- isAnimationIterationCountKeyword: isKeyword('animation-iteration-count'),
- isAnimationNameKeyword: isKeyword('animation-name'),
- isAnimationPlayStateKeyword: isKeyword('animation-play-state'),
- isTimingFunction: isTimingFunction(),
- isBackgroundAttachmentKeyword: isKeyword('background-attachment'),
- isBackgroundClipKeyword: isKeyword('background-clip'),
- isBackgroundOriginKeyword: isKeyword('background-origin'),
- isBackgroundPositionKeyword: isKeyword('background-position'),
- isBackgroundRepeatKeyword: isKeyword('background-repeat'),
- isBackgroundSizeKeyword: isKeyword('background-size'),
- isColor: isColor,
- isColorFunction: isColorFunction,
- isDynamicUnit: isDynamicUnit,
- isFontKeyword: isKeyword('font'),
- isFontSizeKeyword: isKeyword('font-size'),
- isFontStretchKeyword: isKeyword('font-stretch'),
- isFontStyleKeyword: isKeyword('font-style'),
- isFontVariantKeyword: isKeyword('font-variant'),
- isFontWeightKeyword: isKeyword('font-weight'),
- isFunction: isFunction,
- isGlobal: isKeyword('^'),
- isHslColor: isHslColor,
- isIdentifier: isIdentifier,
- isImage: isImage,
- isKeyword: isKeyword,
- isLineHeightKeyword: isKeyword('line-height'),
- isListStylePositionKeyword: isKeyword('list-style-position'),
- isListStyleTypeKeyword: isKeyword('list-style-type'),
- isNumber: isNumber,
- isPrefixed: isPrefixed,
- isPositiveNumber: isPositiveNumber,
- isRgbColor: isRgbColor,
- isStyleKeyword: isKeyword('*-style'),
- isTime: isTime,
- isUnit: isUnit.bind(null, validUnits),
- isUrl: isUrl,
- isVariable: isVariable,
- isWidth: isKeyword('width'),
- isZIndex: isZIndex
- };
-}
-
-module.exports = validator;
diff --git a/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js b/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
deleted file mode 100644
index c516fbc4a..000000000
--- a/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/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, includeVariable, skipProperties) {
- var wrapped = [];
- var single;
- var property;
- var i;
-
- for (i = properties.length - 1; i >= 0; i--) {
- property = properties[i];
-
- if (property[0] != Token.PROPERTY) {
- continue;
- }
-
- if (!includeVariable && someVariableReferences(property)) {
- continue;
- }
-
- if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) {
- continue;
- }
-
- single = wrapSingle(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.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.PROPERTY_VALUE && (value[1] == Marker.COMMA || value[1] == Marker.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.UNDERSCORE];
- } else if (name[0] == Match.ASTERISK) {
- match = [Hack.ASTERISK];
- } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) {
- match = [Hack.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.BANG];
- } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) {
- match = [Hack.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)];
- } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) {
- match = [Hack.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.BACKSLASH ? Match.BACKSLASH : Match.BANG))
- .trim();
-
- if (lastValue[1].length === 0) {
- property.pop();
- }
-}
-
-function wrapSingle(property) {
- var importantProperty = isImportant(property);
- if (importantProperty) {
- stripImportant(property);
- }
-
- var whichHack = hackFrom(property);
- if (whichHack[0] == Hack.ASTERISK || whichHack[0] == Hack.UNDERSCORE) {
- stripPrefixHack(property);
- } else if (whichHack[0] == Hack.BACKSLASH || whichHack[0] == Hack.BANG) {
- stripSuffixHack(property, whichHack);
- }
-
- return {
- block: property[2] && property[2][0] == Token.PROPERTY_BLOCK,
- components: [],
- dirty: false,
- hack: whichHack,
- important: importantProperty,
- name: property[1][1],
- multiplex: property.length > 3 ? isMultiplex(property) : false,
- position: 0,
- shorthand: false,
- unused: false,
- value: property.slice(2)
- };
-}
-
-module.exports = {
- all: wrapAll,
- single: wrapSingle
-};
diff --git a/node_modules/clean-css/lib/options/compatibility.js b/node_modules/clean-css/lib/options/compatibility.js
deleted file mode 100644
index 8e6a119a8..000000000
--- a/node_modules/clean-css/lib/options/compatibility.js
+++ /dev/null
@@ -1,183 +0,0 @@
-var DEFAULTS = {
- '*': {
- colors: {
- opacity: true // rgba / hsla
- },
- properties: {
- backgroundClipMerging: true, // background-clip to shorthand
- backgroundOriginMerging: true, // background-origin to shorthand
- backgroundSizeMerging: true, // background-size to shorthand
- colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red`
- ieBangHack: false, // !ie suffix hacks on IE<8
- ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties
- iePrefixHack: false, // underscore / asterisk prefix hacks on IE
- ieSuffixHack: false, // \9 suffix hacks on IE6-9
- merging: true, // merging properties into one
- shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units
- spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat'
- urlQuotes: false, // whether to wrap content of `url()` into quotes or not
- zeroUnits: true // 0[unit] -> 0
- },
- selectors: {
- adjacentSpace: false, // div+ nav Android stock browser hack
- ie7Hack: false, // *+html hack
- mergeablePseudoClasses: [
- ':active',
- ':after',
- ':before',
- ':empty',
- ':checked',
- ':disabled',
- ':empty',
- ':enabled',
- ':first-child',
- ':first-letter',
- ':first-line',
- ':first-of-type',
- ':focus',
- ':hover',
- ':lang',
- ':last-child',
- ':last-of-type',
- ':link',
- ':not',
- ':nth-child',
- ':nth-last-child',
- ':nth-last-of-type',
- ':nth-of-type',
- ':only-child',
- ':only-of-type',
- ':root',
- ':target',
- ':visited'
- ], // selectors with these pseudo-classes can be merged as these are universally supported
- mergeablePseudoElements: [
- '::after',
- '::before',
- '::first-letter',
- '::first-line'
- ], // selectors with these pseudo-elements can be merged as these are universally supported
- mergeLimit: 8191, // number of rules that can be safely merged together
- multiplePseudoMerging: true
- },
- units: {
- ch: true,
- in: true,
- pc: true,
- pt: true,
- rem: true,
- vh: true,
- vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length
- vmax: true,
- vmin: true,
- vw: true
- }
- }
-};
-
-DEFAULTS.ie11 = DEFAULTS['*'];
-
-DEFAULTS.ie10 = DEFAULTS['*'];
-
-DEFAULTS.ie9 = merge(DEFAULTS['*'], {
- properties: {
- ieFilters: true,
- ieSuffixHack: true
- }
-});
-
-DEFAULTS.ie8 = merge(DEFAULTS.ie9, {
- colors: {
- opacity: false
- },
- properties: {
- backgroundClipMerging: false,
- backgroundOriginMerging: false,
- backgroundSizeMerging: false,
- iePrefixHack: true,
- merging: false
- },
- selectors: {
- mergeablePseudoClasses: [
- ':after',
- ':before',
- ':first-child',
- ':first-letter',
- ':focus',
- ':hover',
- ':visited'
- ],
- mergeablePseudoElements: []
- },
- units: {
- ch: false,
- rem: false,
- vh: false,
- vm: false,
- vmax: false,
- vmin: false,
- vw: false
- }
-});
-
-DEFAULTS.ie7 = merge(DEFAULTS.ie8, {
- properties: {
- ieBangHack: true
- },
- selectors: {
- ie7Hack: true,
- mergeablePseudoClasses: [
- ':first-child',
- ':first-letter',
- ':hover',
- ':visited'
- ]
- },
-});
-
-function compatibilityFrom(source) {
- return merge(DEFAULTS['*'], calculateSource(source));
-}
-
-function merge(source, target) {
- for (var key in source) {
- var value = source[key];
-
- if (typeof value === 'object' && !Array.isArray(value)) {
- target[key] = merge(value, target[key] || {});
- } else {
- target[key] = key in target ? target[key] : value;
- }
- }
-
- return target;
-}
-
-function calculateSource(source) {
- if (typeof source == 'object')
- return source;
-
- if (!/[,\+\-]/.test(source))
- return DEFAULTS[source] || DEFAULTS['*'];
-
- var parts = source.split(',');
- var template = parts[0] in DEFAULTS ?
- DEFAULTS[parts.shift()] :
- DEFAULTS['*'];
-
- source = {};
-
- parts.forEach(function (part) {
- var isAdd = part[0] == '+';
- var key = part.substring(1).split('.');
- var group = key[0];
- var option = key[1];
-
- source[group] = source[group] || {};
- source[group][option] = isAdd;
- });
-
- return merge(template, source);
-}
-
-module.exports = compatibilityFrom;
diff --git a/node_modules/clean-css/lib/options/fetch.js b/node_modules/clean-css/lib/options/fetch.js
deleted file mode 100644
index 0aaad7866..000000000
--- a/node_modules/clean-css/lib/options/fetch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var loadRemoteResource = require('../reader/load-remote-resource');
-
-function fetchFrom(callback) {
- return callback || loadRemoteResource;
-}
-
-module.exports = fetchFrom;
diff --git a/node_modules/clean-css/lib/options/format.js b/node_modules/clean-css/lib/options/format.js
deleted file mode 100644
index 48c7efa8e..000000000
--- a/node_modules/clean-css/lib/options/format.js
+++ /dev/null
@@ -1,216 +0,0 @@
-var systemLineBreak = require('os').EOL;
-
-var override = require('../utils/override');
-
-var Breaks = {
- 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 = {
- AroundSelectorRelation: 'aroundSelectorRelation',
- BeforeBlockBegins: 'beforeBlockBegins',
- BeforeValue: 'beforeValue'
-};
-
-var DEFAULTS = {
- 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 = ';';
-var OPTION_NAME_VALUE_SEPARATOR = ':';
-var HASH_VALUES_OPTION_SEPARATOR = ',';
-var HASH_VALUES_NAME_VALUE_SEPARATOR = '=';
-
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-function breaks(value) {
- var breakOptions = {};
-
- breakOptions[Breaks.AfterAtRule] = value;
- breakOptions[Breaks.AfterBlockBegins] = value;
- breakOptions[Breaks.AfterBlockEnds] = value;
- breakOptions[Breaks.AfterComment] = value;
- breakOptions[Breaks.AfterProperty] = value;
- breakOptions[Breaks.AfterRuleBegins] = value;
- breakOptions[Breaks.AfterRuleEnds] = value;
- breakOptions[Breaks.BeforeBlockEnds] = value;
- breakOptions[Breaks.BetweenSelectors] = value;
-
- return breakOptions;
-}
-
-function spaces(value) {
- var spaceOptions = {};
-
- spaceOptions[Spaces.AroundSelectorRelation] = value;
- spaceOptions[Spaces.BeforeBlockBegins] = value;
- spaceOptions[Spaces.BeforeValue] = value;
-
- return spaceOptions;
-}
-
-function formatFrom(source) {
- if (source === undefined || source === false) {
- return false;
- }
-
- if (typeof source == 'object' && 'breakWith' in source) {
- source = override(source, { breakWith: mapBreakWith(source.breakWith) });
- }
-
- if (typeof source == 'object' && 'indentBy' in source) {
- source = override(source, { indentBy: parseInt(source.indentBy) });
- }
-
- if (typeof source == 'object' && 'indentWith' in source) {
- source = override(source, { indentWith: mapIndentWith(source.indentWith) });
- }
-
- if (typeof source == 'object') {
- return override(DEFAULTS, source);
- }
-
- if (typeof source == 'object') {
- return override(DEFAULTS, source);
- }
-
- if (typeof source == 'string' && source == BEAUTIFY_ALIAS) {
- return override(DEFAULTS, {
- breaks: breaks(true),
- indentBy: 2,
- spaces: spaces(true)
- });
- }
-
- if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) {
- return override(DEFAULTS, {
- breaks: {
- afterAtRule: true,
- afterBlockBegins: true,
- afterBlockEnds: true,
- afterComment: true,
- afterRuleEnds: true,
- beforeBlockEnds: true
- }
- });
- }
-
- if (typeof source == 'string') {
- return override(DEFAULTS, toHash(source));
- }
-
- return DEFAULTS;
-}
-
-function toHash(string) {
- return string
- .split(OPTION_SEPARATOR)
- .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(value);
-
- return accumulator;
- }, {});
-}
-
-
-function normalizeValue(value) {
- switch (value) {
- case FALSE_KEYWORD_1:
- case FALSE_KEYWORD_2:
- return false;
- case TRUE_KEYWORD_1:
- case TRUE_KEYWORD_2:
- 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;
- }
-}
-
-module.exports = {
- Breaks: Breaks,
- Spaces: Spaces,
- formatFrom: formatFrom
-};
diff --git a/node_modules/clean-css/lib/options/inline-request.js b/node_modules/clean-css/lib/options/inline-request.js
deleted file mode 100644
index 1e14c6393..000000000
--- a/node_modules/clean-css/lib/options/inline-request.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var url = require('url');
-
-var override = require('../utils/override');
-
-function inlineRequestFrom(option) {
- return override(
- /* jshint camelcase: false */
- proxyOptionsFrom(process.env.HTTP_PROXY || process.env.http_proxy),
- option || {}
- );
-}
-
-function proxyOptionsFrom(httpProxy) {
- return httpProxy ?
- {
- hostname: url.parse(httpProxy).hostname,
- port: parseInt(url.parse(httpProxy).port)
- } :
- {};
-}
-
-module.exports = inlineRequestFrom;
diff --git a/node_modules/clean-css/lib/options/inline-timeout.js b/node_modules/clean-css/lib/options/inline-timeout.js
deleted file mode 100644
index c7fb454d5..000000000
--- a/node_modules/clean-css/lib/options/inline-timeout.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DEFAULT_TIMEOUT = 5000;
-
-function inlineTimeoutFrom(option) {
- return option || DEFAULT_TIMEOUT;
-}
-
-module.exports = inlineTimeoutFrom;
diff --git a/node_modules/clean-css/lib/options/inline.js b/node_modules/clean-css/lib/options/inline.js
deleted file mode 100644
index 54761f40a..000000000
--- a/node_modules/clean-css/lib/options/inline.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function inlineOptionsFrom(rules) {
- if (Array.isArray(rules)) {
- return rules;
- }
-
- if (rules === false) {
- return ['none'];
- }
-
- return undefined === rules ?
- ['local'] :
- rules.split(',');
-}
-
-module.exports = inlineOptionsFrom;
diff --git a/node_modules/clean-css/lib/options/optimization-level.js b/node_modules/clean-css/lib/options/optimization-level.js
deleted file mode 100644
index 0d3ad7303..000000000
--- a/node_modules/clean-css/lib/options/optimization-level.js
+++ /dev/null
@@ -1,221 +0,0 @@
-var roundingPrecisionFrom = require('./rounding-precision').roundingPrecisionFrom;
-
-var override = require('../utils/override');
-
-var OptimizationLevel = {
- Zero: '0',
- One: '1',
- Two: '2'
-};
-
-var DEFAULTS = {};
-
-DEFAULTS[OptimizationLevel.Zero] = {};
-DEFAULTS[OptimizationLevel.One] = {
- cleanupCharsets: true,
- normalizeUrls: true,
- optimizeBackground: true,
- optimizeBorderRadius: true,
- optimizeFilter: true,
- optimizeFontWeight: true,
- optimizeOutline: true,
- removeEmpty: true,
- removeNegativePaddings: true,
- removeQuotes: true,
- removeWhitespace: true,
- replaceMultipleZeros: true,
- replaceTimeUnits: true,
- replaceZeroUnits: true,
- roundingPrecision: roundingPrecisionFrom(undefined),
- selectorsSortingMethod: 'standard',
- specialComments: 'all',
- tidyAtRules: true,
- tidyBlockScopes: true,
- tidySelectors: true,
- transform: noop
-};
-DEFAULTS[OptimizationLevel.Two] = {
- mergeAdjacentRules: true,
- mergeIntoShorthands: true,
- mergeMedia: true,
- mergeNonAdjacentRules: true,
- mergeSemantically: false,
- overrideProperties: true,
- removeEmpty: true,
- reduceNonAdjacentRules: true,
- removeDuplicateFontRules: true,
- removeDuplicateMediaBlocks: true,
- removeDuplicateRules: true,
- removeUnusedAtRules: false,
- restructureRules: false,
- skipProperties: []
-};
-
-var ALL_KEYWORD_1 = '*';
-var ALL_KEYWORD_2 = 'all';
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-var LIST_VALUE_SEPARATOR = ',';
-var OPTION_SEPARATOR = ';';
-var OPTION_VALUE_SEPARATOR = ':';
-
-function noop() {}
-
-function optimizationLevelFrom(source) {
- var level = override(DEFAULTS, {});
- var Zero = OptimizationLevel.Zero;
- var One = OptimizationLevel.One;
- var Two = OptimizationLevel.Two;
-
-
- if (undefined === source) {
- delete level[Two];
- return level;
- }
-
- if (typeof source == 'string') {
- source = parseInt(source);
- }
-
- if (typeof source == 'number' && source === parseInt(Two)) {
- return level;
- }
-
- if (typeof source == 'number' && source === parseInt(One)) {
- delete level[Two];
- return level;
- }
-
- if (typeof source == 'number' && source === parseInt(Zero)) {
- delete level[Two];
- delete level[One];
- return level;
- }
-
- if (typeof source == 'object') {
- source = covertValuesToHashes(source);
- }
-
- if (One in source && 'roundingPrecision' in source[One]) {
- source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision);
- }
-
- if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') {
- source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR);
- }
-
- if (Zero in source || One in source || Two in source) {
- level[Zero] = override(level[Zero], source[Zero]);
- }
-
- if (One in source && ALL_KEYWORD_1 in source[One]) {
- level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_1])));
- delete source[One][ALL_KEYWORD_1];
- }
-
- if (One in source && ALL_KEYWORD_2 in source[One]) {
- level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_2])));
- delete source[One][ALL_KEYWORD_2];
- }
-
- if (One in source || Two in source) {
- level[One] = override(level[One], source[One]);
- } else {
- delete level[One];
- }
-
- if (Two in source && ALL_KEYWORD_1 in source[Two]) {
- level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1])));
- delete source[Two][ALL_KEYWORD_1];
- }
-
- if (Two in source && ALL_KEYWORD_2 in source[Two]) {
- level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2])));
- delete source[Two][ALL_KEYWORD_2];
- }
-
- if (Two in source) {
- level[Two] = override(level[Two], source[Two]);
- } else {
- delete level[Two];
- }
-
- return level;
-}
-
-function defaults(level, value) {
- var options = override(DEFAULTS[level], {});
- var key;
-
- for (key in options) {
- if (typeof options[key] == 'boolean') {
- options[key] = value;
- }
- }
-
- return options;
-}
-
-function normalizeValue(value) {
- switch (value) {
- case FALSE_KEYWORD_1:
- case FALSE_KEYWORD_2:
- return false;
- case TRUE_KEYWORD_1:
- case TRUE_KEYWORD_2:
- return true;
- default:
- return value;
- }
-}
-
-function covertValuesToHashes(source) {
- var clonedSource = override(source, {});
- var level;
- var i;
-
- for (i = 0; i <= 2; i++) {
- level = '' + i;
-
- if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) {
- delete clonedSource[level];
- }
-
- if (level in clonedSource && clonedSource[level] === true) {
- clonedSource[level] = {};
- }
-
- if (level in clonedSource && typeof clonedSource[level] == 'string') {
- clonedSource[level] = covertToHash(clonedSource[level], level);
- }
- }
-
- return clonedSource;
-}
-
-function covertToHash(asString, level) {
- return asString
- .split(OPTION_SEPARATOR)
- .reduce(function (accumulator, directive) {
- var parts = directive.split(OPTION_VALUE_SEPARATOR);
- var name = parts[0];
- var value = parts[1];
- var normalizedValue = normalizeValue(value);
-
- if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) {
- accumulator = override(accumulator, defaults(level, normalizedValue));
- } else {
- accumulator[name] = normalizedValue;
- }
-
- return accumulator;
- }, {});
-}
-
-module.exports = {
- OptimizationLevel: OptimizationLevel,
- optimizationLevelFrom: optimizationLevelFrom,
-};
diff --git a/node_modules/clean-css/lib/options/rebase-to.js b/node_modules/clean-css/lib/options/rebase-to.js
deleted file mode 100644
index 134b4a382..000000000
--- a/node_modules/clean-css/lib/options/rebase-to.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var path = require('path');
-
-function rebaseToFrom(option) {
- return option ? path.resolve(option) : process.cwd();
-}
-
-module.exports = rebaseToFrom;
diff --git a/node_modules/clean-css/lib/options/rebase.js b/node_modules/clean-css/lib/options/rebase.js
deleted file mode 100644
index 999c83f50..000000000
--- a/node_modules/clean-css/lib/options/rebase.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function rebaseFrom(rebaseOption) {
- return undefined === rebaseOption ? true : !!rebaseOption;
-}
-
-module.exports = rebaseFrom;
diff --git a/node_modules/clean-css/lib/options/rounding-precision.js b/node_modules/clean-css/lib/options/rounding-precision.js
deleted file mode 100644
index 42ecf1b4d..000000000
--- a/node_modules/clean-css/lib/options/rounding-precision.js
+++ /dev/null
@@ -1,88 +0,0 @@
-var override = require('../utils/override');
-
-var INTEGER_PATTERN = /^\d+$/;
-
-var ALL_UNITS = ['*', 'all'];
-var DEFAULT_PRECISION = 'off'; // all precision changes are disabled
-var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3
-var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5
-
-function roundingPrecisionFrom(source) {
- return override(defaults(DEFAULT_PRECISION), buildPrecisionFrom(source));
-}
-
-function defaults(value) {
- return {
- 'ch': value,
- 'cm': value,
- 'em': value,
- 'ex': value,
- 'in': value,
- 'mm': value,
- 'pc': value,
- 'pt': value,
- 'px': value,
- 'q': value,
- 'rem': value,
- 'vh': value,
- 'vmax': value,
- 'vmin': value,
- 'vw': value,
- '%': value
- };
-}
-
-function buildPrecisionFrom(source) {
- if (source === null || source === undefined) {
- return {};
- }
-
- if (typeof source == 'boolean') {
- return {};
- }
-
- if (typeof source == 'number' && source == -1) {
- return defaults(DEFAULT_PRECISION);
- }
-
- if (typeof source == 'number') {
- return defaults(source);
- }
-
- if (typeof source == 'string' && INTEGER_PATTERN.test(source)) {
- return defaults(parseInt(source));
- }
-
- if (typeof source == 'string' && source == DEFAULT_PRECISION) {
- return defaults(DEFAULT_PRECISION);
- }
-
- if (typeof source == 'object') {
- return source;
- }
-
- return source
- .split(DIRECTIVES_SEPARATOR)
- .reduce(function (accumulator, directive) {
- var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR);
- var name = directiveParts[0];
- var value = parseInt(directiveParts[1]);
-
- if (isNaN(value) || value == -1) {
- value = DEFAULT_PRECISION;
- }
-
- if (ALL_UNITS.indexOf(name) > -1) {
- accumulator = override(accumulator, defaults(value));
- } else {
- accumulator[name] = value;
- }
-
- return accumulator;
- }, {});
-}
-
-module.exports = {
- DEFAULT: DEFAULT_PRECISION,
- roundingPrecisionFrom: roundingPrecisionFrom
-};
diff --git a/node_modules/clean-css/lib/reader/apply-source-maps.js b/node_modules/clean-css/lib/reader/apply-source-maps.js
deleted file mode 100644
index 7c5a9282b..000000000
--- a/node_modules/clean-css/lib/reader/apply-source-maps.js
+++ /dev/null
@@ -1,245 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-var matchDataUri = require('./match-data-uri');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-
-var Token = require('../tokenizer/token');
-var hasProtocol = require('../utils/has-protocol');
-var isDataUriResource = require('../utils/is-data-uri-resource');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var MAP_MARKER_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function applySourceMaps(tokens, context, callback) {
- var applyContext = {
- callback: callback,
- fetch: context.options.fetch,
- index: 0,
- inline: context.options.inline,
- inlineRequest: context.options.inlineRequest,
- inlineTimeout: context.options.inlineTimeout,
- inputSourceMapTracker: context.inputSourceMapTracker,
- localOnly: context.localOnly,
- processedTokens: [],
- rebaseTo: context.options.rebaseTo,
- sourceTokens: tokens,
- warnings: context.warnings
- };
-
- return context.options.sourceMap && tokens.length > 0 ?
- doApplySourceMaps(applyContext) :
- callback(tokens);
-}
-
-function doApplySourceMaps(applyContext) {
- var singleSourceTokens = [];
- var lastSource = findTokenSource(applyContext.sourceTokens[0]);
- var source;
- var token;
- var l;
-
- for (l = applyContext.sourceTokens.length; applyContext.index < l; applyContext.index++) {
- token = applyContext.sourceTokens[applyContext.index];
- source = findTokenSource(token);
-
- if (source != lastSource) {
- singleSourceTokens = [];
- lastSource = source;
- }
-
- singleSourceTokens.push(token);
- applyContext.processedTokens.push(token);
-
- if (token[0] == Token.COMMENT && MAP_MARKER_PATTERN.test(token[1])) {
- return fetchAndApplySourceMap(token[1], source, singleSourceTokens, applyContext);
- }
- }
-
- return applyContext.callback(applyContext.processedTokens);
-}
-
-function findTokenSource(token) {
- var scope;
- var metadata;
-
- if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
- metadata = token[2][0];
- } else {
- scope = token[1][0];
- metadata = scope[2][0];
- }
-
- return metadata[2];
-}
-
-function fetchAndApplySourceMap(sourceMapComment, source, singleSourceTokens, applyContext) {
- return extractInputSourceMapFrom(sourceMapComment, applyContext, function (inputSourceMap) {
- if (inputSourceMap) {
- applyContext.inputSourceMapTracker.track(source, inputSourceMap);
- applySourceMapRecursively(singleSourceTokens, applyContext.inputSourceMapTracker);
- }
-
- applyContext.index++;
- return doApplySourceMaps(applyContext);
- });
-}
-
-function extractInputSourceMapFrom(sourceMapComment, applyContext, whenSourceMapReady) {
- var uri = MAP_MARKER_PATTERN.exec(sourceMapComment)[1];
- var absoluteUri;
- var sourceMap;
- var rebasedMap;
-
- if (isDataUriResource(uri)) {
- sourceMap = extractInputSourceMapFromDataUri(uri);
- return whenSourceMapReady(sourceMap);
- } else if (isRemoteResource(uri)) {
- return loadInputSourceMapFromRemoteUri(uri, applyContext, function (sourceMap) {
- var parsedMap;
-
- if (sourceMap) {
- parsedMap = JSON.parse(sourceMap);
- rebasedMap = rebaseRemoteMap(parsedMap, uri);
- whenSourceMapReady(rebasedMap);
- } else {
- whenSourceMapReady(null);
- }
- });
- } else {
- // at this point `uri` is already rebased, see lib/reader/rebase.js#rebaseSourceMapComment
- // it is rebased to be consistent with rebasing other URIs
- // however here we need to resolve it back to read it from disk
- absoluteUri = path.resolve(applyContext.rebaseTo, uri);
- sourceMap = loadInputSourceMapFromLocalUri(absoluteUri, applyContext);
-
- if (sourceMap) {
- rebasedMap = rebaseLocalMap(sourceMap, absoluteUri, applyContext.rebaseTo);
- return whenSourceMapReady(rebasedMap);
- } else {
- return whenSourceMapReady(null);
- }
- }
-}
-
-function extractInputSourceMapFromDataUri(uri) {
- var dataUriMatch = matchDataUri(uri);
- var charset = dataUriMatch[2] ? dataUriMatch[2].split(/[=;]/)[2] : 'us-ascii';
- var encoding = dataUriMatch[3] ? dataUriMatch[3].split(';')[1] : 'utf8';
- var data = encoding == 'utf8' ? global.unescape(dataUriMatch[4]) : dataUriMatch[4];
-
- var buffer = new Buffer(data, encoding);
- buffer.charset = charset;
-
- return JSON.parse(buffer.toString());
-}
-
-function loadInputSourceMapFromRemoteUri(uri, applyContext, whenLoaded) {
- var isAllowed = isAllowedResource(uri, true, applyContext.inline);
- var isRuntimeResource = !hasProtocol(uri);
-
- if (applyContext.localOnly) {
- applyContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
- return whenLoaded(null);
- } else if (isRuntimeResource) {
- applyContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
- return whenLoaded(null);
- } else if (!isAllowed) {
- applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
- return whenLoaded(null);
- }
-
- applyContext.fetch(uri, applyContext.inlineRequest, applyContext.inlineTimeout, function (error, body) {
- if (error) {
- applyContext.warnings.push('Missing source map at "' + uri + '" - ' + error);
- return whenLoaded(null);
- }
-
- whenLoaded(body);
- });
-}
-
-function loadInputSourceMapFromLocalUri(uri, applyContext) {
- var isAllowed = isAllowedResource(uri, false, applyContext.inline);
- var sourceMap;
-
- if (!fs.existsSync(uri) || !fs.statSync(uri).isFile()) {
- applyContext.warnings.push('Ignoring local source map at "' + uri + '" as resource is missing.');
- return null;
- } else if (!isAllowed) {
- applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
- return null;
- }
-
- sourceMap = fs.readFileSync(uri, 'utf-8');
- return JSON.parse(sourceMap);
-}
-
-function applySourceMapRecursively(tokens, inputSourceMapTracker) {
- var token;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
-
- switch (token[0]) {
- case Token.AT_RULE:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.AT_RULE_BLOCK:
- applySourceMapRecursively(token[1], inputSourceMapTracker);
- applySourceMapRecursively(token[2], inputSourceMapTracker);
- break;
- case Token.AT_RULE_BLOCK_SCOPE:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.NESTED_BLOCK:
- applySourceMapRecursively(token[1], inputSourceMapTracker);
- applySourceMapRecursively(token[2], inputSourceMapTracker);
- break;
- case Token.NESTED_BLOCK_SCOPE:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.COMMENT:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.PROPERTY:
- applySourceMapRecursively(token, inputSourceMapTracker);
- break;
- case Token.PROPERTY_BLOCK:
- applySourceMapRecursively(token[1], inputSourceMapTracker);
- break;
- case Token.PROPERTY_NAME:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.PROPERTY_VALUE:
- applySourceMapTo(token, inputSourceMapTracker);
- break;
- case Token.RULE:
- applySourceMapRecursively(token[1], inputSourceMapTracker);
- applySourceMapRecursively(token[2], inputSourceMapTracker);
- break;
- case Token.RULE_SCOPE:
- applySourceMapTo(token, inputSourceMapTracker);
- }
- }
-
- return tokens;
-}
-
-function applySourceMapTo(token, inputSourceMapTracker) {
- var value = token[1];
- var metadata = token[2];
- var newMetadata = [];
- var i, l;
-
- for (i = 0, l = metadata.length; i < l; i++) {
- newMetadata.push(inputSourceMapTracker.originalPositionFor(metadata[i], value.length));
- }
-
- token[2] = newMetadata;
-}
-
-module.exports = applySourceMaps;
diff --git a/node_modules/clean-css/lib/reader/extract-import-url-and-media.js b/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
deleted file mode 100644
index e309c2f71..000000000
--- a/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var split = require('../utils/split');
-
-var BRACE_PREFIX = /^\(/;
-var BRACE_SUFFIX = /\)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTE_PREFIX_PATTERN = /['"]\s*/;
-var QUOTE_SUFFIX_PATTERN = /\s*['"]/;
-var URL_PREFIX_PATTERN = /^url\(\s*/i;
-var URL_SUFFIX_PATTERN = /\s*\)/i;
-
-function extractImportUrlAndMedia(atRuleValue) {
- var uri;
- var mediaQuery;
- var stripped;
- var parts;
-
- stripped = atRuleValue
- .replace(IMPORT_PREFIX_PATTERN, '')
- .trim()
- .replace(URL_PREFIX_PATTERN, '(')
- .replace(URL_SUFFIX_PATTERN, ')')
- .replace(QUOTE_PREFIX_PATTERN, '')
- .replace(QUOTE_SUFFIX_PATTERN, '');
-
- parts = split(stripped, ' ');
-
- uri = parts[0]
- .replace(BRACE_PREFIX, '')
- .replace(BRACE_SUFFIX, '');
- mediaQuery = parts.slice(1).join(' ');
-
- return [uri, mediaQuery];
-}
-
-module.exports = extractImportUrlAndMedia;
diff --git a/node_modules/clean-css/lib/reader/input-source-map-tracker.js b/node_modules/clean-css/lib/reader/input-source-map-tracker.js
deleted file mode 100644
index 4b8730c29..000000000
--- a/node_modules/clean-css/lib/reader/input-source-map-tracker.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var SourceMapConsumer = require('source-map').SourceMapConsumer;
-
-function inputSourceMapTracker() {
- var maps = {};
-
- return {
- all: all.bind(null, maps),
- isTracking: isTracking.bind(null, maps),
- originalPositionFor: originalPositionFor.bind(null, maps),
- track: track.bind(null, maps)
- };
-}
-
-function all(maps) {
- return maps;
-}
-
-function isTracking(maps, source) {
- return source in maps;
-}
-
-function originalPositionFor(maps, metadata, range, selectorFallbacks) {
- var line = metadata[0];
- var column = metadata[1];
- var source = metadata[2];
- var position = {
- line: line,
- column: column + range
- };
- var originalPosition;
-
- while (!originalPosition && position.column > column) {
- position.column--;
- originalPosition = maps[source].originalPositionFor(position);
- }
-
- if (!originalPosition || originalPosition.column < 0) {
- return metadata;
- }
-
- if (originalPosition.line === null && line > 1 && selectorFallbacks > 0) {
- return originalPositionFor(maps, [line - 1, column, source], range, selectorFallbacks - 1);
- }
-
- return originalPosition.line !== null ?
- toMetadata(originalPosition) :
- metadata;
-}
-
-function toMetadata(asHash) {
- return [asHash.line, asHash.column, asHash.source];
-}
-
-function track(maps, source, data) {
- maps[source] = new SourceMapConsumer(data);
-}
-
-module.exports = inputSourceMapTracker;
diff --git a/node_modules/clean-css/lib/reader/is-allowed-resource.js b/node_modules/clean-css/lib/reader/is-allowed-resource.js
deleted file mode 100644
index 043066e42..000000000
--- a/node_modules/clean-css/lib/reader/is-allowed-resource.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var isRemoteResource = require('../utils/is-remote-resource');
-var hasProtocol = require('../utils/has-protocol');
-
-var HTTP_PROTOCOL = 'http:';
-
-function isAllowedResource(uri, isRemote, rules) {
- var match;
- var absoluteUri;
- var allowed = isRemote ? false : true;
- var rule;
- var isNegated;
- var normalizedRule;
- var i;
-
- if (rules.length === 0) {
- return false;
- }
-
- if (isRemote && !hasProtocol(uri)) {
- uri = HTTP_PROTOCOL + uri;
- }
-
- match = isRemote ?
- url.parse(uri).host :
- uri;
-
- absoluteUri = isRemote ?
- uri :
- path.resolve(uri);
-
- for (i = 0; i < rules.length; i++) {
- rule = rules[i];
- isNegated = rule[0] == '!';
- normalizedRule = rule.substring(1);
-
- if (isNegated && isRemote && isRemoteRule(normalizedRule)) {
- allowed = allowed && !isAllowedResource(uri, true, [normalizedRule]);
- } else if (isNegated && !isRemote && !isRemoteRule(normalizedRule)) {
- allowed = allowed && !isAllowedResource(uri, false, [normalizedRule]);
- } else if (isNegated) {
- allowed = allowed && true;
- } else if (rule == 'all') {
- allowed = true;
- } else if (isRemote && rule == 'local') {
- allowed = allowed || false;
- } else if (isRemote && rule == 'remote') {
- allowed = true;
- } else if (!isRemote && rule == 'remote') {
- allowed = false;
- } else if (!isRemote && rule == 'local') {
- allowed = true;
- } else if (rule === match) {
- allowed = true;
- } else if (rule === uri) {
- allowed = true;
- } else if (isRemote && absoluteUri.indexOf(rule) === 0) {
- allowed = true;
- } else if (!isRemote && absoluteUri.indexOf(path.resolve(rule)) === 0) {
- allowed = true;
- } else if (isRemote != isRemoteRule(normalizedRule)) {
- allowed = allowed && true;
- } else {
- allowed = false;
- }
- }
-
- return allowed;
-}
-
-function isRemoteRule(rule) {
- return isRemoteResource(rule) || url.parse(HTTP_PROTOCOL + '//' + rule).host == rule;
-}
-
-module.exports = isAllowedResource;
diff --git a/node_modules/clean-css/lib/reader/load-original-sources.js b/node_modules/clean-css/lib/reader/load-original-sources.js
deleted file mode 100644
index 465035d6b..000000000
--- a/node_modules/clean-css/lib/reader/load-original-sources.js
+++ /dev/null
@@ -1,126 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-
-var hasProtocol = require('../utils/has-protocol');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-function loadOriginalSources(context, callback) {
- var loadContext = {
- callback: callback,
- fetch: context.options.fetch,
- index: 0,
- inline: context.options.inline,
- inlineRequest: context.options.inlineRequest,
- inlineTimeout: context.options.inlineTimeout,
- localOnly: context.localOnly,
- rebaseTo: context.options.rebaseTo,
- sourcesContent: context.sourcesContent,
- uriToSource: uriToSourceMapping(context.inputSourceMapTracker.all()),
- warnings: context.warnings
- };
-
- return context.options.sourceMap && context.options.sourceMapInlineSources ?
- doLoadOriginalSources(loadContext) :
- callback();
-}
-
-function uriToSourceMapping(allSourceMapConsumers) {
- var mapping = {};
- var consumer;
- var uri;
- var source;
- var i, l;
-
- for (source in allSourceMapConsumers) {
- consumer = allSourceMapConsumers[source];
-
- for (i = 0, l = consumer.sources.length; i < l; i++) {
- uri = consumer.sources[i];
- source = consumer.sourceContentFor(uri, true);
-
- mapping[uri] = source;
- }
- }
-
- return mapping;
-}
-
-function doLoadOriginalSources(loadContext) {
- var uris = Object.keys(loadContext.uriToSource);
- var uri;
- var source;
- var total;
-
- for (total = uris.length; loadContext.index < total; loadContext.index++) {
- uri = uris[loadContext.index];
- source = loadContext.uriToSource[uri];
-
- if (source) {
- loadContext.sourcesContent[uri] = source;
- } else {
- return loadOriginalSource(uri, loadContext);
- }
- }
-
- return loadContext.callback();
-}
-
-function loadOriginalSource(uri, loadContext) {
- var content;
-
- if (isRemoteResource(uri)) {
- return loadOriginalSourceFromRemoteUri(uri, loadContext, function (content) {
- loadContext.index++;
- loadContext.sourcesContent[uri] = content;
- return doLoadOriginalSources(loadContext);
- });
- } else {
- content = loadOriginalSourceFromLocalUri(uri, loadContext);
- loadContext.index++;
- loadContext.sourcesContent[uri] = content;
- return doLoadOriginalSources(loadContext);
- }
-}
-
-function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) {
- var isAllowed = isAllowedResource(uri, true, loadContext.inline);
- var isRuntimeResource = !hasProtocol(uri);
-
- if (loadContext.localOnly) {
- loadContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
- return whenLoaded(null);
- } else if (isRuntimeResource) {
- loadContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
- return whenLoaded(null);
- } else if (!isAllowed) {
- loadContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
- return whenLoaded(null);
- }
-
- loadContext.fetch(uri, loadContext.inlineRequest, loadContext.inlineTimeout, function (error, content) {
- if (error) {
- loadContext.warnings.push('Missing original source at "' + uri + '" - ' + error);
- }
-
- whenLoaded(content);
- });
-}
-
-function loadOriginalSourceFromLocalUri(relativeUri, loadContext) {
- var isAllowed = isAllowedResource(relativeUri, false, loadContext.inline);
- var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri);
-
- if (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile()) {
- loadContext.warnings.push('Ignoring local source map at "' + absoluteUri + '" as resource is missing.');
- return null;
- } else if (!isAllowed) {
- loadContext.warnings.push('Cannot fetch "' + absoluteUri + '" as resource is not allowed.');
- return null;
- }
-
- return fs.readFileSync(absoluteUri, 'utf8');
-}
-
-module.exports = loadOriginalSources;
diff --git a/node_modules/clean-css/lib/reader/load-remote-resource.js b/node_modules/clean-css/lib/reader/load-remote-resource.js
deleted file mode 100644
index 0133c78bf..000000000
--- a/node_modules/clean-css/lib/reader/load-remote-resource.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var http = require('http');
-var https = require('https');
-var url = require('url');
-
-var isHttpResource = require('../utils/is-http-resource');
-var isHttpsResource = require('../utils/is-https-resource');
-var override = require('../utils/override');
-
-var HTTP_PROTOCOL = 'http:';
-
-function loadRemoteResource(uri, inlineRequest, inlineTimeout, callback) {
- var proxyProtocol = inlineRequest.protocol || inlineRequest.hostname;
- var errorHandled = false;
- var requestOptions;
- var fetch;
-
- requestOptions = override(
- url.parse(uri),
- inlineRequest || {}
- );
-
- if (inlineRequest.hostname !== undefined) {
- // overwrite as we always expect a http proxy currently
- requestOptions.protocol = inlineRequest.protocol || HTTP_PROTOCOL;
- requestOptions.path = requestOptions.href;
- }
-
- fetch = (proxyProtocol && !isHttpsResource(proxyProtocol)) || isHttpResource(uri) ?
- http.get :
- https.get;
-
- fetch(requestOptions, function (res) {
- var chunks = [];
- var movedUri;
-
- if (errorHandled) {
- return;
- }
-
- if (res.statusCode < 200 || res.statusCode > 399) {
- return callback(res.statusCode, null);
- } else if (res.statusCode > 299) {
- movedUri = url.resolve(uri, res.headers.location);
- return loadRemoteResource(movedUri, inlineRequest, inlineTimeout, callback);
- }
-
- res.on('data', function (chunk) {
- chunks.push(chunk.toString());
- });
- res.on('end', function () {
- var body = chunks.join('');
- callback(null, body);
- });
- })
- .on('error', function (res) {
- if (errorHandled) {
- return;
- }
-
- errorHandled = true;
- callback(res.message, null);
- })
- .on('timeout', function () {
- if (errorHandled) {
- return;
- }
-
- errorHandled = true;
- callback('timeout', null);
- })
- .setTimeout(inlineTimeout);
-}
-
-module.exports = loadRemoteResource;
diff --git a/node_modules/clean-css/lib/reader/match-data-uri.js b/node_modules/clean-css/lib/reader/match-data-uri.js
deleted file mode 100644
index d0d5a4c74..000000000
--- a/node_modules/clean-css/lib/reader/match-data-uri.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function matchDataUri(uri) {
- return DATA_URI_PATTERN.exec(uri);
-}
-
-module.exports = matchDataUri;
diff --git a/node_modules/clean-css/lib/reader/normalize-path.js b/node_modules/clean-css/lib/reader/normalize-path.js
deleted file mode 100644
index a9eca38cb..000000000
--- a/node_modules/clean-css/lib/reader/normalize-path.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var UNIX_SEPARATOR = '/';
-var WINDOWS_SEPARATOR_PATTERN = /\\/g;
-
-function normalizePath(path) {
- return path.replace(WINDOWS_SEPARATOR_PATTERN, UNIX_SEPARATOR);
-}
-
-module.exports = normalizePath;
diff --git a/node_modules/clean-css/lib/reader/read-sources.js b/node_modules/clean-css/lib/reader/read-sources.js
deleted file mode 100644
index 1338f6adc..000000000
--- a/node_modules/clean-css/lib/reader/read-sources.js
+++ /dev/null
@@ -1,341 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var applySourceMaps = require('./apply-source-maps');
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var isAllowedResource = require('./is-allowed-resource');
-var loadOriginalSources = require('./load-original-sources');
-var normalizePath = require('./normalize-path');
-var rebase = require('./rebase');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-var restoreImport = require('./restore-import');
-
-var tokenize = require('../tokenizer/tokenize');
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
-var hasProtocol = require('../utils/has-protocol');
-var isImport = require('../utils/is-import');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var UNKNOWN_URI = 'uri:unknown';
-
-function readSources(input, context, callback) {
- return doReadSources(input, context, function (tokens) {
- return applySourceMaps(tokens, context, function () {
- return loadOriginalSources(context, function () { return callback(tokens); });
- });
- });
-}
-
-function doReadSources(input, context, callback) {
- if (typeof input == 'string') {
- return fromString(input, context, callback);
- } else if (Buffer.isBuffer(input)) {
- return fromString(input.toString(), context, callback);
- } else if (Array.isArray(input)) {
- return fromArray(input, context, callback);
- } else if (typeof input == 'object') {
- return fromHash(input, context, callback);
- }
-}
-
-function fromString(input, context, callback) {
- context.source = undefined;
- context.sourcesContent[undefined] = input;
- context.stats.originalSize += input.length;
-
- return fromStyles(input, context, { inline: context.options.inline }, callback);
-}
-
-function fromArray(input, context, callback) {
- var inputAsImports = input.reduce(function (accumulator, uriOrHash) {
- if (typeof uriOrHash === 'string') {
- return addStringSource(uriOrHash, accumulator);
- } else {
- return addHashSource(uriOrHash, context, accumulator);
- }
-
- }, []);
-
- return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function fromHash(input, context, callback) {
- var inputAsImports = addHashSource(input, context, []);
- return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function addStringSource(input, imports) {
- imports.push(restoreAsImport(normalizeUri(input)));
- return imports;
-}
-
-function addHashSource(input, context, imports) {
- var uri;
- var normalizedUri;
- var source;
-
- for (uri in input) {
- source = input[uri];
- normalizedUri = normalizeUri(uri);
-
- imports.push(restoreAsImport(normalizedUri));
-
- context.sourcesContent[normalizedUri] = source.styles;
-
- if (source.sourceMap) {
- trackSourceMap(source.sourceMap, normalizedUri, context);
- }
- }
-
- return imports;
-}
-
-function normalizeUri(uri) {
- var currentPath = path.resolve('');
- var absoluteUri;
- var relativeToCurrentPath;
- var normalizedUri;
-
- if (isRemoteResource(uri)) {
- return uri;
- }
-
- absoluteUri = path.isAbsolute(uri) ?
- uri :
- path.resolve(uri);
- relativeToCurrentPath = path.relative(currentPath, absoluteUri);
- normalizedUri = normalizePath(relativeToCurrentPath);
-
- return normalizedUri;
-}
-
-function trackSourceMap(sourceMap, uri, context) {
- var parsedMap = typeof sourceMap == 'string' ?
- JSON.parse(sourceMap) :
- sourceMap;
- var rebasedMap = isRemoteResource(uri) ?
- rebaseRemoteMap(parsedMap, uri) :
- rebaseLocalMap(parsedMap, uri || UNKNOWN_URI, context.options.rebaseTo);
-
- context.inputSourceMapTracker.track(uri, rebasedMap);
-}
-
-function restoreAsImport(uri) {
- return restoreImport('url(' + uri + ')', '') + Marker.SEMICOLON;
-}
-
-function fromStyles(styles, context, parentInlinerContext, callback) {
- var tokens;
- var rebaseConfig = {};
-
- if (!context.source) {
- rebaseConfig.fromBase = path.resolve('');
- rebaseConfig.toBase = context.options.rebaseTo;
- } else if (isRemoteResource(context.source)) {
- rebaseConfig.fromBase = context.source;
- rebaseConfig.toBase = context.source;
- } else if (path.isAbsolute(context.source)) {
- rebaseConfig.fromBase = path.dirname(context.source);
- rebaseConfig.toBase = context.options.rebaseTo;
- } else {
- rebaseConfig.fromBase = path.dirname(path.resolve(context.source));
- rebaseConfig.toBase = context.options.rebaseTo;
- }
-
- tokens = tokenize(styles, context);
- tokens = rebase(tokens, context.options.rebase, context.validator, rebaseConfig);
-
- return allowsAnyImports(parentInlinerContext.inline) ?
- inline(tokens, context, parentInlinerContext, callback) :
- callback(tokens);
-}
-
-function allowsAnyImports(inline) {
- return !(inline.length == 1 && inline[0] == 'none');
-}
-
-function inline(tokens, externalContext, parentInlinerContext, callback) {
- var inlinerContext = {
- afterContent: false,
- callback: callback,
- errors: externalContext.errors,
- externalContext: externalContext,
- fetch: externalContext.options.fetch,
- inlinedStylesheets: parentInlinerContext.inlinedStylesheets || externalContext.inlinedStylesheets,
- inline: parentInlinerContext.inline,
- inlineRequest: externalContext.options.inlineRequest,
- inlineTimeout: externalContext.options.inlineTimeout,
- isRemote: parentInlinerContext.isRemote || false,
- localOnly: externalContext.localOnly,
- outputTokens: [],
- rebaseTo: externalContext.options.rebaseTo,
- sourceTokens: tokens,
- warnings: externalContext.warnings
- };
-
- return doInlineImports(inlinerContext);
-}
-
-function doInlineImports(inlinerContext) {
- var token;
- var i, l;
-
- for (i = 0, l = inlinerContext.sourceTokens.length; i < l; i++) {
- token = inlinerContext.sourceTokens[i];
-
- if (token[0] == Token.AT_RULE && isImport(token[1])) {
- inlinerContext.sourceTokens.splice(0, i);
- return inlineStylesheet(token, inlinerContext);
- } else if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
- inlinerContext.outputTokens.push(token);
- } else {
- inlinerContext.outputTokens.push(token);
- inlinerContext.afterContent = true;
- }
- }
-
- inlinerContext.sourceTokens = [];
- return inlinerContext.callback(inlinerContext.outputTokens);
-}
-
-function inlineStylesheet(token, inlinerContext) {
- var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
- var uri = uriAndMediaQuery[0];
- var mediaQuery = uriAndMediaQuery[1];
- var metadata = token[2];
-
- return isRemoteResource(uri) ?
- inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) :
- inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext);
-}
-
-function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) {
- var isAllowed = isAllowedResource(uri, true, inlinerContext.inline);
- var originalUri = uri;
- var isLoaded = uri in inlinerContext.externalContext.sourcesContent;
- var isRuntimeResource = !hasProtocol(uri);
-
- if (inlinerContext.inlinedStylesheets.indexOf(uri) > -1) {
- inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as it has already been imported.');
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- } else if (inlinerContext.localOnly && inlinerContext.afterContent) {
- inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as no callback given and after other content.');
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- } else if (isRuntimeResource) {
- inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no protocol given.');
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- } else if (inlinerContext.localOnly && !isLoaded) {
- inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no callback given.');
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- } else if (!isAllowed && inlinerContext.afterContent) {
- inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as resource is not allowed and after other content.');
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- } else if (!isAllowed) {
- inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as resource is not allowed.');
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- return doInlineImports(inlinerContext);
- }
-
- inlinerContext.inlinedStylesheets.push(uri);
-
- function whenLoaded(error, importedStyles) {
- if (error) {
- inlinerContext.errors.push('Broken @import declaration of "' + uri + '" - ' + error);
-
- return process.nextTick(function () {
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
- doInlineImports(inlinerContext);
- });
- }
-
- inlinerContext.inline = inlinerContext.externalContext.options.inline;
- inlinerContext.isRemote = true;
-
- inlinerContext.externalContext.source = originalUri;
- inlinerContext.externalContext.sourcesContent[uri] = importedStyles;
- inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
- return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
- importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
- return doInlineImports(inlinerContext);
- });
- }
-
- return isLoaded ?
- whenLoaded(null, inlinerContext.externalContext.sourcesContent[uri]) :
- inlinerContext.fetch(uri, inlinerContext.inlineRequest, inlinerContext.inlineTimeout, whenLoaded);
-}
-
-function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) {
- var currentPath = path.resolve('');
- var absoluteUri = path.isAbsolute(uri) ?
- path.resolve(currentPath, uri[0] == '/' ? uri.substring(1) : uri) :
- path.resolve(inlinerContext.rebaseTo, uri);
- var relativeToCurrentPath = path.relative(currentPath, absoluteUri);
- var importedStyles;
- var isAllowed = isAllowedResource(uri, false, inlinerContext.inline);
- var normalizedPath = normalizePath(relativeToCurrentPath);
- var isLoaded = normalizedPath in inlinerContext.externalContext.sourcesContent;
-
- if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) {
- inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as it has already been imported.');
- } else if (!isLoaded && (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile())) {
- inlinerContext.errors.push('Ignoring local @import of "' + uri + '" as resource is missing.');
- } else if (!isAllowed && inlinerContext.afterContent) {
- inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as resource is not allowed and after other content.');
- } else if (inlinerContext.afterContent) {
- inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as after other content.');
- } else if (!isAllowed) {
- inlinerContext.warnings.push('Skipping local @import of "' + uri + '" as resource is not allowed.');
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
- } else {
- importedStyles = isLoaded ?
- inlinerContext.externalContext.sourcesContent[normalizedPath] :
- fs.readFileSync(absoluteUri, 'utf-8');
-
- inlinerContext.inlinedStylesheets.push(absoluteUri);
- inlinerContext.inline = inlinerContext.externalContext.options.inline;
-
- inlinerContext.externalContext.source = normalizedPath;
- inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles;
- inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
- return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
- importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
- inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
- return doInlineImports(inlinerContext);
- });
- }
-
- inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
- return doInlineImports(inlinerContext);
-}
-
-function wrapInMedia(tokens, mediaQuery, metadata) {
- if (mediaQuery) {
- return [[Token.NESTED_BLOCK, [[Token.NESTED_BLOCK_SCOPE, '@media ' + mediaQuery, metadata]], tokens]];
- } else {
- return tokens;
- }
-}
-
-module.exports = readSources;
diff --git a/node_modules/clean-css/lib/reader/rebase-local-map.js b/node_modules/clean-css/lib/reader/rebase-local-map.js
deleted file mode 100644
index aec8d2324..000000000
--- a/node_modules/clean-css/lib/reader/rebase-local-map.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var path = require('path');
-
-function rebaseLocalMap(sourceMap, sourceUri, rebaseTo) {
- var currentPath = path.resolve('');
- var absoluteUri = path.resolve(currentPath, sourceUri);
- var absoluteUriDirectory = path.dirname(absoluteUri);
-
- sourceMap.sources = sourceMap.sources.map(function(source) {
- return path.relative(rebaseTo, path.resolve(absoluteUriDirectory, source));
- });
-
- return sourceMap;
-}
-
-module.exports = rebaseLocalMap;
diff --git a/node_modules/clean-css/lib/reader/rebase-remote-map.js b/node_modules/clean-css/lib/reader/rebase-remote-map.js
deleted file mode 100644
index 7b6bb7ac9..000000000
--- a/node_modules/clean-css/lib/reader/rebase-remote-map.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-function rebaseRemoteMap(sourceMap, sourceUri) {
- var sourceDirectory = path.dirname(sourceUri);
-
- sourceMap.sources = sourceMap.sources.map(function(source) {
- return url.resolve(sourceDirectory, source);
- });
-
- return sourceMap;
-}
-
-module.exports = rebaseRemoteMap;
diff --git a/node_modules/clean-css/lib/reader/rebase.js b/node_modules/clean-css/lib/reader/rebase.js
deleted file mode 100644
index 181b319ad..000000000
--- a/node_modules/clean-css/lib/reader/rebase.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var restoreImport = require('./restore-import');
-var rewriteUrl = require('./rewrite-url');
-
-var Token = require('../tokenizer/token');
-var isImport = require('../utils/is-import');
-
-var SOURCE_MAP_COMMENT_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function rebase(tokens, rebaseAll, validator, rebaseConfig) {
- return rebaseAll ?
- rebaseEverything(tokens, validator, rebaseConfig) :
- rebaseAtRules(tokens, validator, rebaseConfig);
-}
-
-function rebaseEverything(tokens, validator, rebaseConfig) {
- var token;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
-
- switch (token[0]) {
- case Token.AT_RULE:
- rebaseAtRule(token, validator, rebaseConfig);
- break;
- case Token.AT_RULE_BLOCK:
- rebaseProperties(token[2], validator, rebaseConfig);
- break;
- case Token.COMMENT:
- rebaseSourceMapComment(token, rebaseConfig);
- break;
- case Token.NESTED_BLOCK:
- rebaseEverything(token[2], validator, rebaseConfig);
- break;
- case Token.RULE:
- rebaseProperties(token[2], validator, rebaseConfig);
- break;
- }
- }
-
- return tokens;
-}
-
-function rebaseAtRules(tokens, validator, rebaseConfig) {
- var token;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
-
- switch (token[0]) {
- case Token.AT_RULE:
- rebaseAtRule(token, validator, rebaseConfig);
- break;
- }
- }
-
- return tokens;
-}
-
-function rebaseAtRule(token, validator, rebaseConfig) {
- if (!isImport(token[1])) {
- return;
- }
-
- var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
- var newUrl = rewriteUrl(uriAndMediaQuery[0], rebaseConfig);
- var mediaQuery = uriAndMediaQuery[1];
-
- token[1] = restoreImport(newUrl, mediaQuery);
-}
-
-function rebaseSourceMapComment(token, rebaseConfig) {
- var matches = SOURCE_MAP_COMMENT_PATTERN.exec(token[1]);
-
- if (matches && matches[1].indexOf('data:') === -1) {
- token[1] = token[1].replace(matches[1], rewriteUrl(matches[1], rebaseConfig, true));
- }
-}
-
-function rebaseProperties(properties, validator, rebaseConfig) {
- var property;
- var value;
- var i, l;
- var j, m;
-
- for (i = 0, l = properties.length; i < l; i++) {
- property = properties[i];
-
- for (j = 2 /* 0 is Token.PROPERTY, 1 is name */, m = property.length; j < m; j++) {
- value = property[j][1];
-
- if (validator.isUrl(value)) {
- property[j][1] = rewriteUrl(value, rebaseConfig);
- }
- }
- }
-}
-
-module.exports = rebase;
diff --git a/node_modules/clean-css/lib/reader/restore-import.js b/node_modules/clean-css/lib/reader/restore-import.js
deleted file mode 100644
index 5bdbd92c8..000000000
--- a/node_modules/clean-css/lib/reader/restore-import.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function restoreImport(uri, mediaQuery) {
- return ('@import ' + uri + ' ' + mediaQuery).trim();
-}
-
-module.exports = restoreImport;
diff --git a/node_modules/clean-css/lib/reader/rewrite-url.js b/node_modules/clean-css/lib/reader/rewrite-url.js
deleted file mode 100644
index a4793fd1c..000000000
--- a/node_modules/clean-css/lib/reader/rewrite-url.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var DOUBLE_QUOTE = '"';
-var SINGLE_QUOTE = '\'';
-var URL_PREFIX = 'url(';
-var URL_SUFFIX = ')';
-
-var QUOTE_PREFIX_PATTERN = /^["']/;
-var QUOTE_SUFFIX_PATTERN = /["']$/;
-var ROUND_BRACKETS_PATTERN = /[\(\)]/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var URL_SUFFIX_PATTERN = /\)$/;
-var WHITESPACE_PATTERN = /\s/;
-
-var isWindows = process.platform == 'win32';
-
-function rebase(uri, rebaseConfig) {
- if (!rebaseConfig) {
- return uri;
- }
-
- if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) {
- return uri;
- }
-
- if (isRemote(uri) || isSVGMarker(uri) || isInternal(uri)) {
- return uri;
- }
-
- if (isData(uri)) {
- return '\'' + uri + '\'';
- }
-
- if (isRemote(rebaseConfig.toBase)) {
- return url.resolve(rebaseConfig.toBase, uri);
- }
-
- return rebaseConfig.absolute ?
- normalize(absolute(uri, rebaseConfig)) :
- normalize(relative(uri, rebaseConfig));
-}
-
-function isAbsolute(uri) {
- return path.isAbsolute(uri);
-}
-
-function isSVGMarker(uri) {
- return uri[0] == '#';
-}
-
-function isInternal(uri) {
- return /^\w+:\w+/.test(uri);
-}
-
-function isRemote(uri) {
- return /^[^:]+?:\/\//.test(uri) || uri.indexOf('//') === 0;
-}
-
-function isData(uri) {
- return uri.indexOf('data:') === 0;
-}
-
-function absolute(uri, rebaseConfig) {
- return path
- .resolve(path.join(rebaseConfig.fromBase || '', uri))
- .replace(rebaseConfig.toBase, '');
-}
-
-function relative(uri, rebaseConfig) {
- return path.relative(rebaseConfig.toBase, path.join(rebaseConfig.fromBase || '', uri));
-}
-
-function normalize(uri) {
- return isWindows ? uri.replace(/\\/g, '/') : uri;
-}
-
-function quoteFor(unquotedUrl) {
- if (unquotedUrl.indexOf(SINGLE_QUOTE) > -1) {
- return DOUBLE_QUOTE;
- } else if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) {
- return SINGLE_QUOTE;
- } else if (hasWhitespace(unquotedUrl) || hasRoundBrackets(unquotedUrl)) {
- return SINGLE_QUOTE;
- } else {
- return '';
- }
-}
-
-function hasWhitespace(url) {
- return WHITESPACE_PATTERN.test(url);
-}
-
-function hasRoundBrackets(url) {
- return ROUND_BRACKETS_PATTERN.test(url);
-}
-
-function rewriteUrl(originalUrl, rebaseConfig, pathOnly) {
- var strippedUrl = originalUrl
- .replace(URL_PREFIX_PATTERN, '')
- .replace(URL_SUFFIX_PATTERN, '')
- .trim();
-
- var unquotedUrl = strippedUrl
- .replace(QUOTE_PREFIX_PATTERN, '')
- .replace(QUOTE_SUFFIX_PATTERN, '')
- .trim();
-
- var quote = strippedUrl[0] == SINGLE_QUOTE || strippedUrl[0] == DOUBLE_QUOTE ?
- strippedUrl[0] :
- quoteFor(unquotedUrl);
-
- return pathOnly ?
- rebase(unquotedUrl, rebaseConfig) :
- URL_PREFIX + quote + rebase(unquotedUrl, rebaseConfig) + quote + URL_SUFFIX;
-}
-
-module.exports = rewriteUrl;
diff --git a/node_modules/clean-css/lib/tokenizer/marker.js b/node_modules/clean-css/lib/tokenizer/marker.js
deleted file mode 100644
index 270fdbc3b..000000000
--- a/node_modules/clean-css/lib/tokenizer/marker.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var Marker = {
- 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: '_'
-};
-
-module.exports = Marker;
diff --git a/node_modules/clean-css/lib/tokenizer/token.js b/node_modules/clean-css/lib/tokenizer/token.js
deleted file mode 100644
index a1d726f0e..000000000
--- a/node_modules/clean-css/lib/tokenizer/token.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var Token = {
- 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`
-};
-
-module.exports = Token;
diff --git a/node_modules/clean-css/lib/tokenizer/tokenize.js b/node_modules/clean-css/lib/tokenizer/tokenize.js
deleted file mode 100644
index 39c9e67bc..000000000
--- a/node_modules/clean-css/lib/tokenizer/tokenize.js
+++ /dev/null
@@ -1,571 +0,0 @@
-var Marker = require('./marker');
-var Token = require('./token');
-
-var formatPosition = require('../utils/format-position');
-
-var Level = {
- BLOCK: 'block',
- COMMENT: 'comment',
- DOUBLE_QUOTE: 'double-quote',
- RULE: 'rule',
- SINGLE_QUOTE: 'single-quote'
-};
-
-var AT_RULES = [
- '@charset',
- '@import'
-];
-
-var BLOCK_RULES = [
- '@-moz-document',
- '@document',
- '@-moz-keyframes',
- '@-ms-keyframes',
- '@-o-keyframes',
- '@-webkit-keyframes',
- '@keyframes',
- '@media',
- '@supports'
-];
-
-var IGNORE_END_COMMENT_PATTERN = /\/\* clean\-css ignore:end \*\/$/;
-var IGNORE_START_COMMENT_PATTERN = /^\/\* clean\-css ignore:start \*\//;
-
-var PAGE_MARGIN_BOXES = [
- '@bottom-center',
- '@bottom-left',
- '@bottom-left-corner',
- '@bottom-right',
- '@bottom-right-corner',
- '@left-bottom',
- '@left-middle',
- '@left-top',
- '@right-bottom',
- '@right-middle',
- '@right-top',
- '@top-center',
- '@top-left',
- '@top-left-corner',
- '@top-right',
- '@top-right-corner'
-];
-
-var EXTRA_PAGE_BOXES = [
- '@footnote',
- '@footnotes',
- '@left',
- '@page-float-bottom',
- '@page-float-top',
- '@right'
-];
-
-var REPEAT_PATTERN = /^\[\s{0,31}\d+\s{0,31}\]$/;
-var RULE_WORD_SEPARATOR_PATTERN = /[\s\(]/;
-var TAIL_BROKEN_VALUE_PATTERN = /[\s|\}]*$/;
-
-function tokenize(source, externalContext) {
- var internalContext = {
- level: Level.BLOCK,
- position: {
- source: externalContext.source || undefined,
- line: 1,
- column: 0,
- index: 0
- }
- };
-
- return intoTokens(source, externalContext, internalContext, false);
-}
-
-function intoTokens(source, externalContext, internalContext, isNested) {
- var allTokens = [];
- var newTokens = allTokens;
- var lastToken;
- var ruleToken;
- var ruleTokens = [];
- var propertyToken;
- var metadata;
- var metadatas = [];
- var level = internalContext.level;
- var levels = [];
- var buffer = [];
- var buffers = [];
- var serializedBuffer;
- var serializedBufferPart;
- var roundBracketLevel = 0;
- var isQuoted;
- var isSpace;
- var isNewLineNix;
- var isNewLineWin;
- var isCarriageReturn;
- var isCommentStart;
- var wasCommentStart = false;
- var isCommentEnd;
- var wasCommentEnd = false;
- var isCommentEndMarker;
- var isEscaped;
- var wasEscaped = false;
- var isRaw = false;
- var seekingValue = false;
- var seekingPropertyBlockClosing = false;
- var position = internalContext.position;
- var lastCommentStartAt;
-
- for (; position.index < source.length; position.index++) {
- var character = source[position.index];
-
- isQuoted = level == Level.SINGLE_QUOTE || level == Level.DOUBLE_QUOTE;
- isSpace = character == Marker.SPACE || character == Marker.TAB;
- isNewLineNix = character == Marker.NEW_LINE_NIX;
- isNewLineWin = character == Marker.NEW_LINE_NIX && source[position.index - 1] == Marker.CARRIAGE_RETURN;
- isCarriageReturn = character == Marker.CARRIAGE_RETURN && source[position.index + 1] && source[position.index + 1] != Marker.NEW_LINE_NIX;
- isCommentStart = !wasCommentEnd && level != Level.COMMENT && !isQuoted && character == Marker.ASTERISK && source[position.index - 1] == Marker.FORWARD_SLASH;
- isCommentEndMarker = !wasCommentStart && !isQuoted && character == Marker.FORWARD_SLASH && source[position.index - 1] == Marker.ASTERISK;
- isCommentEnd = level == Level.COMMENT && isCommentEndMarker;
- roundBracketLevel = Math.max(roundBracketLevel, 0);
-
- metadata = buffer.length === 0 ?
- [position.line, position.column, position.source] :
- metadata;
-
- if (isEscaped) {
- // previous character was a backslash
- buffer.push(character);
- } else if (!isCommentEnd && level == Level.COMMENT) {
- buffer.push(character);
- } else if (!isCommentStart && !isCommentEnd && isRaw) {
- buffer.push(character);
- } else if (isCommentStart && (level == Level.BLOCK || level == Level.RULE) && buffer.length > 1) {
- // comment start within block preceded by some content, e.g. div/*<--
- metadatas.push(metadata);
- buffer.push(character);
- buffers.push(buffer.slice(0, buffer.length - 2));
-
- buffer = buffer.slice(buffer.length - 2);
- metadata = [position.line, position.column - 1, position.source];
-
- levels.push(level);
- level = Level.COMMENT;
- } else if (isCommentStart) {
- // comment start, e.g. /*<--
- levels.push(level);
- level = Level.COMMENT;
- buffer.push(character);
- } else if (isCommentEnd && isIgnoreStartComment(buffer)) {
- // ignore:start comment end, e.g. /* clean-css ignore:start */<--
- serializedBuffer = buffer.join('').trim() + character;
- lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
- newTokens.push(lastToken);
-
- isRaw = true;
- metadata = metadatas.pop() || null;
- buffer = buffers.pop() || [];
- } else if (isCommentEnd && isIgnoreEndComment(buffer)) {
- // ignore:start comment end, e.g. /* clean-css ignore:end */<--
- serializedBuffer = buffer.join('') + character;
- lastCommentStartAt = serializedBuffer.lastIndexOf(Marker.FORWARD_SLASH + Marker.ASTERISK);
-
- serializedBufferPart = serializedBuffer.substring(0, lastCommentStartAt);
- lastToken = [Token.RAW, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
- newTokens.push(lastToken);
-
- serializedBufferPart = serializedBuffer.substring(lastCommentStartAt);
- metadata = [position.line, position.column - serializedBufferPart.length + 1, position.source];
- lastToken = [Token.COMMENT, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
- newTokens.push(lastToken);
-
- isRaw = false;
- level = levels.pop();
- metadata = metadatas.pop() || null;
- buffer = buffers.pop() || [];
- } else if (isCommentEnd) {
- // comment end, e.g. /* comment */<--
- serializedBuffer = buffer.join('').trim() + character;
- lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
- newTokens.push(lastToken);
-
- level = levels.pop();
- metadata = metadatas.pop() || null;
- buffer = buffers.pop() || [];
- } else if (isCommentEndMarker && source[position.index + 1] != Marker.ASTERISK) {
- externalContext.warnings.push('Unexpected \'*/\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
- buffer = [];
- } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
- // single quotation start, e.g. a[href^='https<--
- levels.push(level);
- level = Level.SINGLE_QUOTE;
- buffer.push(character);
- } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
- // single quotation end, e.g. a[href^='https'<--
- level = levels.pop();
- buffer.push(character);
- } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
- // double quotation start, e.g. a[href^="<--
- levels.push(level);
- level = Level.DOUBLE_QUOTE;
- buffer.push(character);
- } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
- // double quotation end, e.g. a[href^="https"<--
- level = levels.pop();
- buffer.push(character);
- } else if (!isCommentStart && !isCommentEnd && character != Marker.CLOSE_ROUND_BRACKET && character != Marker.OPEN_ROUND_BRACKET && level != Level.COMMENT && !isQuoted && roundBracketLevel > 0) {
- // character inside any function, e.g. hsla(.<--
- buffer.push(character);
- } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
- // round open bracket, e.g. @import url(<--
- buffer.push(character);
-
- roundBracketLevel++;
- } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
- // round open bracket, e.g. @import url(test.css)<--
- buffer.push(character);
-
- roundBracketLevel--;
- } else if (character == Marker.SEMICOLON && level == Level.BLOCK && buffer[0] == Marker.AT) {
- // semicolon ending rule at block level, e.g. @import '...';<--
- serializedBuffer = buffer.join('').trim();
- allTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- buffer = [];
- } else if (character == Marker.COMMA && level == Level.BLOCK && ruleToken) {
- // comma separator at block level, e.g. a,div,<--
- serializedBuffer = buffer.join('').trim();
- ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
-
- buffer = [];
- } else if (character == Marker.COMMA && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.AT_RULE) {
- // comma separator at block level, e.g. @import url(...) screen,<--
- // keep iterating as end semicolon will create the token
- buffer.push(character);
- } else if (character == Marker.COMMA && level == Level.BLOCK) {
- // comma separator at block level, e.g. a,<--
- ruleToken = [tokenTypeFrom(buffer), [], []];
- serializedBuffer = buffer.join('').trim();
- ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, 0)]]);
-
- buffer = [];
- } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && ruleToken && ruleToken[0] == Token.NESTED_BLOCK) {
- // open brace opening at-rule at block level, e.g. @media{<--
- serializedBuffer = buffer.join('').trim();
- ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- allTokens.push(ruleToken);
-
- levels.push(level);
- position.column++;
- position.index++;
- buffer = [];
-
- ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
- ruleToken = null;
- } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.NESTED_BLOCK) {
- // open brace opening at-rule at block level, e.g. @media{<--
- serializedBuffer = buffer.join('').trim();
- ruleToken = ruleToken || [Token.NESTED_BLOCK, [], []];
- ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- allTokens.push(ruleToken);
-
- levels.push(level);
- position.column++;
- position.index++;
- buffer = [];
-
- ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
- ruleToken = null;
- } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK) {
- // open brace opening rule at block level, e.g. div{<--
- serializedBuffer = buffer.join('').trim();
- ruleToken = ruleToken || [tokenTypeFrom(buffer), [], []];
- ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
- newTokens = ruleToken[2];
- allTokens.push(ruleToken);
-
- levels.push(level);
- level = Level.RULE;
- buffer = [];
- } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && seekingValue) {
- // open brace opening rule at rule level, e.g. div{--variable:{<--
- ruleTokens.push(ruleToken);
- ruleToken = [Token.PROPERTY_BLOCK, []];
- propertyToken.push(ruleToken);
- newTokens = ruleToken[1];
-
- levels.push(level);
- level = Level.RULE;
- seekingValue = false;
- } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && isPageMarginBox(buffer)) {
- // open brace opening page-margin box at rule level, e.g. @page{@top-center{<--
- serializedBuffer = buffer.join('').trim();
- ruleTokens.push(ruleToken);
- ruleToken = [Token.AT_RULE_BLOCK, [], []];
- ruleToken[1].push([Token.AT_RULE_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- newTokens.push(ruleToken);
- newTokens = ruleToken[2];
-
- levels.push(level);
- level = Level.RULE;
- buffer = [];
- } else if (character == Marker.COLON && level == Level.RULE && !seekingValue) {
- // colon at rule level, e.g. a{color:<--
- serializedBuffer = buffer.join('').trim();
- propertyToken = [Token.PROPERTY, [Token.PROPERTY_NAME, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]];
- newTokens.push(propertyToken);
-
- seekingValue = true;
- buffer = [];
- } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && ruleTokens.length > 0 && buffer.length > 0 && buffer[0] == Marker.AT) {
- // semicolon at rule level for at-rule, e.g. a{--color:{@apply(--other-color);<--
- serializedBuffer = buffer.join('').trim();
- ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- buffer = [];
- } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length > 0) {
- // semicolon at rule level, e.g. a{color:red;<--
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- propertyToken = null;
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length === 0) {
- // semicolon after bracketed value at rule level, e.g. a{color:rgb(...);<--
- propertyToken = null;
- seekingValue = false;
- } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
- // semicolon for at-rule at rule level, e.g. a{@apply(--variable);<--
- serializedBuffer = buffer.join('');
- newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.SEMICOLON && level == Level.RULE && seekingPropertyBlockClosing) {
- // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<--
- seekingPropertyBlockClosing = false;
- buffer = [];
- } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length === 0) {
- // stray semicolon at rule level, e.g. a{;<--
- // noop
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && seekingValue && buffer.length > 0 && ruleTokens.length > 0) {
- // close brace at rule level, e.g. a{--color:{color:red}<--
- serializedBuffer = buffer.join('');
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- propertyToken = null;
- ruleToken = ruleTokens.pop();
- newTokens = ruleToken[2];
-
- level = levels.pop();
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0 && buffer[0] == Marker.AT && ruleTokens.length > 0) {
- // close brace at rule level for at-rule, e.g. a{--color:{@apply(--other-color)}<--
- serializedBuffer = buffer.join('');
- ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- propertyToken = null;
- ruleToken = ruleTokens.pop();
- newTokens = ruleToken[2];
-
- level = levels.pop();
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && ruleTokens.length > 0) {
- // close brace at rule level after space, e.g. a{--color:{color:red }<--
- propertyToken = null;
- ruleToken = ruleTokens.pop();
- newTokens = ruleToken[2];
-
- level = levels.pop();
- seekingValue = false;
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0) {
- // close brace at rule level, e.g. a{color:red}<--
- serializedBuffer = buffer.join('');
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- propertyToken = null;
- ruleToken = ruleTokens.pop();
- newTokens = allTokens;
-
- level = levels.pop();
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
- // close brace after at-rule at rule level, e.g. a{@apply(--variable)}<--
- propertyToken = null;
- ruleToken = null;
- serializedBuffer = buffer.join('').trim();
- newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- newTokens = allTokens;
-
- level = levels.pop();
- seekingValue = false;
- buffer = [];
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && levels[levels.length - 1] == Level.RULE) {
- // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<--
- propertyToken = null;
- ruleToken = ruleTokens.pop();
- newTokens = ruleToken[2];
-
- level = levels.pop();
- seekingValue = false;
- seekingPropertyBlockClosing = true;
- buffer = [];
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE) {
- // close brace after a rule, e.g. a{color:red;}<--
- propertyToken = null;
- ruleToken = null;
- newTokens = allTokens;
-
- level = levels.pop();
- seekingValue = false;
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK && !isNested && position.index <= source.length - 1) {
- // stray close brace at block level, e.g. a{color:red}color:blue}<--
- externalContext.warnings.push('Unexpected \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
- buffer.push(character);
- } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK) {
- // close brace at block level, e.g. @media screen {...}<--
- break;
- } else if (character == Marker.OPEN_ROUND_BRACKET && level == Level.RULE && seekingValue) {
- // round open bracket, e.g. a{color:hsla(<--
- buffer.push(character);
- roundBracketLevel++;
- } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue && roundBracketLevel == 1) {
- // round close bracket, e.g. a{color:hsla(0,0%,0%)<--
- buffer.push(character);
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- roundBracketLevel--;
- buffer = [];
- } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue) {
- // round close bracket within other brackets, e.g. a{width:calc((10rem / 2)<--
- buffer.push(character);
- roundBracketLevel--;
- } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue && buffer.length > 0) {
- // forward slash within a property, e.g. a{background:url(image.png) 0 0/<--
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
- buffer = [];
- } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue) {
- // forward slash within a property after space, e.g. a{background:url(image.png) 0 0 /<--
- propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
- buffer = [];
- } else if (character == Marker.COMMA && level == Level.RULE && seekingValue && buffer.length > 0) {
- // comma within a property, e.g. a{background:url(image.png),<--
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
- propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
- buffer = [];
- } else if (character == Marker.COMMA && level == Level.RULE && seekingValue) {
- // comma within a property after space, e.g. a{background:url(image.png) ,<--
- propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
- buffer = [];
- } else if (character == Marker.CLOSE_SQUARE_BRACKET && propertyToken && propertyToken.length > 1 && buffer.length > 0 && isRepeatToken(buffer)) {
- buffer.push(character);
- serializedBuffer = buffer.join('').trim();
- propertyToken[propertyToken.length - 1][1] += serializedBuffer;
-
- buffer = [];
- } else if ((isSpace || (isNewLineNix && !isNewLineWin)) && level == Level.RULE && seekingValue && propertyToken && buffer.length > 0) {
- // space or *nix newline within property, e.g. a{margin:0 <--
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- buffer = [];
- } else if (isNewLineWin && level == Level.RULE && seekingValue && propertyToken && buffer.length > 1) {
- // win newline within property, e.g. a{margin:0\r\n<--
- serializedBuffer = buffer.join('').trim();
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- buffer = [];
- } else if (isNewLineWin && level == Level.RULE && seekingValue) {
- // win newline
- buffer = [];
- } else if (buffer.length == 1 && isNewLineWin) {
- // ignore windows newline which is composed of two characters
- buffer.pop();
- } else if (buffer.length > 0 || !isSpace && !isNewLineNix && !isNewLineWin && !isCarriageReturn) {
- // any character
- buffer.push(character);
- }
-
- wasEscaped = isEscaped;
- isEscaped = !wasEscaped && character == Marker.BACK_SLASH;
- wasCommentStart = isCommentStart;
- wasCommentEnd = isCommentEnd;
-
- position.line = (isNewLineWin || isNewLineNix || isCarriageReturn) ? position.line + 1 : position.line;
- position.column = (isNewLineWin || isNewLineNix || isCarriageReturn) ? 0 : position.column + 1;
- }
-
- if (seekingValue) {
- externalContext.warnings.push('Missing \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
- }
-
- if (seekingValue && buffer.length > 0) {
- serializedBuffer = buffer.join('').replace(TAIL_BROKEN_VALUE_PATTERN, '');
- propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
- buffer = [];
- }
-
- if (buffer.length > 0) {
- externalContext.warnings.push('Invalid character(s) \'' + buffer.join('') + '\' at ' + formatPosition(metadata) + '. Ignoring.');
- }
-
- return allTokens;
-}
-
-function isIgnoreStartComment(buffer) {
- return IGNORE_START_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function isIgnoreEndComment(buffer) {
- return IGNORE_END_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function originalMetadata(metadata, value, externalContext, selectorFallbacks) {
- var source = metadata[2];
-
- return externalContext.inputSourceMapTracker.isTracking(source) ?
- externalContext.inputSourceMapTracker.originalPositionFor(metadata, value.length, selectorFallbacks) :
- metadata;
-}
-
-function tokenTypeFrom(buffer) {
- var isAtRule = buffer[0] == Marker.AT || buffer[0] == Marker.UNDERSCORE;
- var ruleWord = buffer.join('').split(RULE_WORD_SEPARATOR_PATTERN)[0];
-
- if (isAtRule && BLOCK_RULES.indexOf(ruleWord) > -1) {
- return Token.NESTED_BLOCK;
- } else if (isAtRule && AT_RULES.indexOf(ruleWord) > -1) {
- return Token.AT_RULE;
- } else if (isAtRule) {
- return Token.AT_RULE_BLOCK;
- } else {
- return Token.RULE;
- }
-}
-
-function tokenScopeFrom(tokenType) {
- if (tokenType == Token.RULE) {
- return Token.RULE_SCOPE;
- } else if (tokenType == Token.NESTED_BLOCK) {
- return Token.NESTED_BLOCK_SCOPE;
- } else if (tokenType == Token.AT_RULE_BLOCK) {
- return Token.AT_RULE_BLOCK_SCOPE;
- }
-}
-
-function isPageMarginBox(buffer) {
- var serializedBuffer = buffer.join('').trim();
-
- return PAGE_MARGIN_BOXES.indexOf(serializedBuffer) > -1 || EXTRA_PAGE_BOXES.indexOf(serializedBuffer) > -1;
-}
-
-function isRepeatToken(buffer) {
- return REPEAT_PATTERN.test(buffer.join('') + Marker.CLOSE_SQUARE_BRACKET);
-}
-
-module.exports = tokenize;
diff --git a/node_modules/clean-css/lib/utils/clone-array.js b/node_modules/clean-css/lib/utils/clone-array.js
deleted file mode 100644
index b95ee6843..000000000
--- a/node_modules/clean-css/lib/utils/clone-array.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function cloneArray(array) {
- var cloned = array.slice(0);
-
- for (var i = 0, l = cloned.length; i < l; i++) {
- if (Array.isArray(cloned[i]))
- cloned[i] = cloneArray(cloned[i]);
- }
-
- return cloned;
-}
-
-module.exports = cloneArray;
diff --git a/node_modules/clean-css/lib/utils/format-position.js b/node_modules/clean-css/lib/utils/format-position.js
deleted file mode 100644
index 0e3713c19..000000000
--- a/node_modules/clean-css/lib/utils/format-position.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function formatPosition(metadata) {
- var line = metadata[0];
- var column = metadata[1];
- var source = metadata[2];
-
- return source ?
- source + ':' + line + ':' + column :
- line + ':' + column;
-}
-
-module.exports = formatPosition;
diff --git a/node_modules/clean-css/lib/utils/has-protocol.js b/node_modules/clean-css/lib/utils/has-protocol.js
deleted file mode 100644
index fa1b61fd5..000000000
--- a/node_modules/clean-css/lib/utils/has-protocol.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var NO_PROTOCOL_RESOURCE_PATTERN = /^\/\//;
-
-function hasProtocol(uri) {
- return !NO_PROTOCOL_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = hasProtocol;
diff --git a/node_modules/clean-css/lib/utils/is-data-uri-resource.js b/node_modules/clean-css/lib/utils/is-data-uri-resource.js
deleted file mode 100644
index 58558110f..000000000
--- a/node_modules/clean-css/lib/utils/is-data-uri-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function isDataUriResource(uri) {
- return DATA_URI_PATTERN.test(uri);
-}
-
-module.exports = isDataUriResource;
diff --git a/node_modules/clean-css/lib/utils/is-http-resource.js b/node_modules/clean-css/lib/utils/is-http-resource.js
deleted file mode 100644
index 5179c2ea9..000000000
--- a/node_modules/clean-css/lib/utils/is-http-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTP_RESOURCE_PATTERN = /^http:\/\//;
-
-function isHttpResource(uri) {
- return HTTP_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpResource;
diff --git a/node_modules/clean-css/lib/utils/is-https-resource.js b/node_modules/clean-css/lib/utils/is-https-resource.js
deleted file mode 100644
index c6938f57d..000000000
--- a/node_modules/clean-css/lib/utils/is-https-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTPS_RESOURCE_PATTERN = /^https:\/\//;
-
-function isHttpsResource(uri) {
- return HTTPS_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpsResource;
diff --git a/node_modules/clean-css/lib/utils/is-import.js b/node_modules/clean-css/lib/utils/is-import.js
deleted file mode 100644
index 72abc3287..000000000
--- a/node_modules/clean-css/lib/utils/is-import.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-
-function isImport(value) {
- return IMPORT_PREFIX_PATTERN.test(value);
-}
-
-module.exports = isImport;
diff --git a/node_modules/clean-css/lib/utils/is-remote-resource.js b/node_modules/clean-css/lib/utils/is-remote-resource.js
deleted file mode 100644
index fb3b61f3d..000000000
--- a/node_modules/clean-css/lib/utils/is-remote-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var REMOTE_RESOURCE_PATTERN = /^(\w+:\/\/|\/\/)/;
-
-function isRemoteResource(uri) {
- return REMOTE_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isRemoteResource;
diff --git a/node_modules/clean-css/lib/utils/natural-compare.js b/node_modules/clean-css/lib/utils/natural-compare.js
deleted file mode 100644
index 7a5246762..000000000
--- a/node_modules/clean-css/lib/utils/natural-compare.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956
-
-var NUMBER_PATTERN = /([0-9]+)/;
-
-function naturalCompare(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;
-}
-
-module.exports = naturalCompare;
diff --git a/node_modules/clean-css/lib/utils/override.js b/node_modules/clean-css/lib/utils/override.js
deleted file mode 100644
index e7f84948c..000000000
--- a/node_modules/clean-css/lib/utils/override.js
+++ /dev/null
@@ -1,34 +0,0 @@
-function override(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(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(target[key2], item);
- } else {
- target[key2] = item;
- }
- }
-
- return target;
-}
-
-module.exports = override;
diff --git a/node_modules/clean-css/lib/utils/split.js b/node_modules/clean-css/lib/utils/split.js
deleted file mode 100644
index c91625506..000000000
--- a/node_modules/clean-css/lib/utils/split.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var Marker = require('../tokenizer/marker');
-
-function split(value, separator) {
- var openLevel = Marker.OPEN_ROUND_BRACKET;
- var closeLevel = Marker.CLOSE_ROUND_BRACKET;
- var level = 0;
- var cursor = 0;
- var lastStart = 0;
- var lastValue;
- var lastCharacter;
- var len = value.length;
- var parts = [];
-
- if (value.indexOf(separator) == -1) {
- return [value];
- }
-
- if (value.indexOf(openLevel) == -1) {
- return value.split(separator);
- }
-
- while (cursor < len) {
- if (value[cursor] == openLevel) {
- level++;
- } else if (value[cursor] == closeLevel) {
- level--;
- }
-
- if (level === 0 && cursor > 0 && cursor + 1 < len && value[cursor] == separator) {
- parts.push(value.substring(lastStart, cursor));
- lastStart = cursor + 1;
- }
-
- cursor++;
- }
-
- if (lastStart < cursor + 1) {
- lastValue = value.substring(lastStart);
- lastCharacter = lastValue[lastValue.length - 1];
- if (lastCharacter == separator) {
- lastValue = lastValue.substring(0, lastValue.length - 1);
- }
-
- parts.push(lastValue);
- }
-
- return parts;
-}
-
-module.exports = split;
diff --git a/node_modules/clean-css/lib/writer/helpers.js b/node_modules/clean-css/lib/writer/helpers.js
deleted file mode 100644
index 11727402c..000000000
--- a/node_modules/clean-css/lib/writer/helpers.js
+++ /dev/null
@@ -1,243 +0,0 @@
-var emptyCharacter = '';
-
-var Breaks = require('../options/format').Breaks;
-var Spaces = require('../options/format').Spaces;
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/token');
-
-function supportsAfterClosingBrace(token) {
- return token[1][1] == 'background' || token[1][1] == 'transform' || token[1][1] == 'src';
-}
-
-function afterClosingBrace(token, valueIndex) {
- return token[valueIndex][1][token[valueIndex][1].length - 1] == Marker.CLOSE_ROUND_BRACKET;
-}
-
-function afterComma(token, valueIndex) {
- return token[valueIndex][1] == Marker.COMMA;
-}
-
-function afterSlash(token, valueIndex) {
- return token[valueIndex][1] == Marker.FORWARD_SLASH;
-}
-
-function beforeComma(token, valueIndex) {
- return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.COMMA;
-}
-
-function beforeSlash(token, valueIndex) {
- return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.FORWARD_SLASH;
-}
-
-function inFilter(token) {
- return token[1][1] == 'filter' || token[1][1] == '-ms-filter';
-}
-
-function disallowsSpace(context, token, valueIndex) {
- return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) ||
- beforeSlash(token, valueIndex) ||
- afterSlash(token, valueIndex) ||
- beforeComma(token, valueIndex) ||
- afterComma(token, valueIndex);
-}
-
-function rules(context, tokens) {
- var store = context.store;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- store(context, tokens[i]);
-
- if (i < l - 1) {
- store(context, comma(context));
- }
- }
-}
-
-function body(context, tokens) {
- var lastPropertyAt = lastPropertyIndex(tokens);
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- property(context, tokens, i, lastPropertyAt);
- }
-}
-
-function lastPropertyIndex(tokens) {
- var index = tokens.length - 1;
-
- for (; index >= 0; index--) {
- if (tokens[index][0] != Token.COMMENT) {
- break;
- }
- }
-
- return index;
-}
-
-function property(context, tokens, position, lastPropertyAt) {
- var store = context.store;
- var token = tokens[position];
- var isPropertyBlock = token[2][0] == Token.PROPERTY_BLOCK;
-
- var needsSemicolon;
- if ( context.format ) {
- if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) {
- needsSemicolon = true;
- } else if ( position < lastPropertyAt ) {
- needsSemicolon = true;
- } else {
- needsSemicolon = false;
- }
- } else {
- needsSemicolon = position < lastPropertyAt || isPropertyBlock;
- }
-
- var isLast = position === lastPropertyAt;
-
- switch (token[0]) {
- case Token.AT_RULE:
- store(context, token);
- store(context, semicolon(context, Breaks.AfterProperty, false));
- break;
- case Token.AT_RULE_BLOCK:
- rules(context, token[1]);
- store(context, openBrace(context, Breaks.AfterRuleBegins, true));
- body(context, token[2]);
- store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
- break;
- case Token.COMMENT:
- store(context, token);
- break;
- case Token.PROPERTY:
- store(context, token[1]);
- store(context, colon(context));
- value(context, token);
- store(context, needsSemicolon ? semicolon(context, Breaks.AfterProperty, isLast) : emptyCharacter);
- break;
- case Token.RAW:
- store(context, token);
- }
-}
-
-function value(context, token) {
- var store = context.store;
- var j, m;
-
- if (token[2][0] == Token.PROPERTY_BLOCK) {
- store(context, openBrace(context, Breaks.AfterBlockBegins, false));
- body(context, token[2][1]);
- store(context, closeBrace(context, Breaks.AfterBlockEnds, false, true));
- } else {
- for (j = 2, m = token.length; j < m; j++) {
- store(context, token[j]);
-
- if (j < m - 1 && (inFilter(token) || !disallowsSpace(context, token, j))) {
- store(context, Marker.SPACE);
- }
- }
- }
-}
-
-function allowsBreak(context, where) {
- return context.format && context.format.breaks[where];
-}
-
-function allowsSpace(context, where) {
- return context.format && context.format.spaces[where];
-}
-
-function openBrace(context, where, needsPrefixSpace) {
- if (context.format) {
- context.indentBy += context.format.indentBy;
- context.indentWith = context.format.indentWith.repeat(context.indentBy);
- return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? Marker.SPACE : emptyCharacter) +
- Marker.OPEN_CURLY_BRACKET +
- (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) +
- context.indentWith;
- } else {
- return Marker.OPEN_CURLY_BRACKET;
- }
-}
-
-function closeBrace(context, where, beforeBlockEnd, isLast) {
- if (context.format) {
- context.indentBy -= context.format.indentBy;
- context.indentWith = context.format.indentWith.repeat(context.indentBy);
- return (allowsBreak(context, Breaks.AfterProperty) || beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds) ? context.format.breakWith : emptyCharacter) +
- context.indentWith +
- Marker.CLOSE_CURLY_BRACKET +
- (isLast ? emptyCharacter : (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith);
- } else {
- return Marker.CLOSE_CURLY_BRACKET;
- }
-}
-
-function colon(context) {
- return context.format ?
- Marker.COLON + (allowsSpace(context, Spaces.BeforeValue) ? Marker.SPACE : emptyCharacter) :
- Marker.COLON;
-}
-
-function semicolon(context, where, isLast) {
- return context.format ?
- Marker.SEMICOLON + (isLast || !allowsBreak(context, where) ? emptyCharacter : context.format.breakWith + context.indentWith) :
- Marker.SEMICOLON;
-}
-
-function comma(context) {
- return context.format ?
- Marker.COMMA + (allowsBreak(context, Breaks.BetweenSelectors) ? context.format.breakWith : emptyCharacter) + context.indentWith :
- Marker.COMMA;
-}
-
-function all(context, tokens) {
- var store = context.store;
- var token;
- var isLast;
- var i, l;
-
- for (i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i];
- isLast = i == l - 1;
-
- switch (token[0]) {
- case Token.AT_RULE:
- store(context, token);
- store(context, semicolon(context, Breaks.AfterAtRule, isLast));
- break;
- case Token.AT_RULE_BLOCK:
- rules(context, token[1]);
- store(context, openBrace(context, Breaks.AfterRuleBegins, true));
- body(context, token[2]);
- store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
- break;
- case Token.NESTED_BLOCK:
- rules(context, token[1]);
- store(context, openBrace(context, Breaks.AfterBlockBegins, true));
- all(context, token[2]);
- store(context, closeBrace(context, Breaks.AfterBlockEnds, true, isLast));
- break;
- case Token.COMMENT:
- store(context, token);
- store(context, allowsBreak(context, Breaks.AfterComment) ? context.format.breakWith : emptyCharacter);
- break;
- case Token.RAW:
- store(context, token);
- break;
- case Token.RULE:
- rules(context, token[1]);
- store(context, openBrace(context, Breaks.AfterRuleBegins, true));
- body(context, token[2]);
- store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
- break;
- }
- }
-}
-
-module.exports = {
- all: all,
- body: body,
- property: property,
- rules: rules,
- value: value
-};
diff --git a/node_modules/clean-css/lib/writer/one-time.js b/node_modules/clean-css/lib/writer/one-time.js
deleted file mode 100644
index 33fccead6..000000000
--- a/node_modules/clean-css/lib/writer/one-time.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var helpers = require('./helpers');
-
-function store(serializeContext, token) {
- serializeContext.output.push(typeof token == 'string' ? token : token[1]);
-}
-
-function context() {
- var newContext = {
- output: [],
- store: store
- };
-
- return newContext;
-}
-
-function all(tokens) {
- var oneTimeContext = context();
- helpers.all(oneTimeContext, tokens);
- return oneTimeContext.output.join('');
-}
-
-function body(tokens) {
- var oneTimeContext = context();
- helpers.body(oneTimeContext, tokens);
- return oneTimeContext.output.join('');
-}
-
-function property(tokens, position) {
- var oneTimeContext = context();
- helpers.property(oneTimeContext, tokens, position, true);
- return oneTimeContext.output.join('');
-}
-
-function rules(tokens) {
- var oneTimeContext = context();
- helpers.rules(oneTimeContext, tokens);
- return oneTimeContext.output.join('');
-}
-
-function value(tokens) {
- var oneTimeContext = context();
- helpers.value(oneTimeContext, tokens);
- return oneTimeContext.output.join('');
-}
-
-module.exports = {
- all: all,
- body: body,
- property: property,
- rules: rules,
- value: value
-};
diff --git a/node_modules/clean-css/lib/writer/simple.js b/node_modules/clean-css/lib/writer/simple.js
deleted file mode 100644
index 20fde2a29..000000000
--- a/node_modules/clean-css/lib/writer/simple.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var all = require('./helpers').all;
-
-function store(serializeContext, token) {
- var value = typeof token == 'string' ?
- token :
- token[1];
- var wrap = serializeContext.wrap;
-
- wrap(serializeContext, value);
- track(serializeContext, value);
- serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
- if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
- track(serializeContext, serializeContext.format.breakWith);
- serializeContext.output.push(serializeContext.format.breakWith);
- }
-}
-
-function track(serializeContext, value) {
- var parts = value.split('\n');
-
- serializeContext.line += parts.length - 1;
- serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function serializeStyles(tokens, context) {
- var serializeContext = {
- column: 0,
- format: context.options.format,
- indentBy: 0,
- indentWith: '',
- line: 1,
- output: [],
- spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
- store: store,
- wrap: context.options.format.wrapAt ?
- wrap :
- function () { /* noop */ }
- };
-
- all(serializeContext, tokens);
-
- return {
- styles: serializeContext.output.join('')
- };
-}
-
-module.exports = serializeStyles;
diff --git a/node_modules/clean-css/lib/writer/source-maps.js b/node_modules/clean-css/lib/writer/source-maps.js
deleted file mode 100644
index 6856579f0..000000000
--- a/node_modules/clean-css/lib/writer/source-maps.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var SourceMapGenerator = require('source-map').SourceMapGenerator;
-var all = require('./helpers').all;
-
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var isWindows = process.platform == 'win32';
-
-var NIX_SEPARATOR_PATTERN = /\//g;
-var UNKNOWN_SOURCE = '$stdin';
-var WINDOWS_SEPARATOR = '\\';
-
-function store(serializeContext, element) {
- var fromString = typeof element == 'string';
- var value = fromString ? element : element[1];
- var mappings = fromString ? null : element[2];
- var wrap = serializeContext.wrap;
-
- wrap(serializeContext, value);
- track(serializeContext, value, mappings);
- serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
- if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
- track(serializeContext, serializeContext.format.breakWith, false);
- serializeContext.output.push(serializeContext.format.breakWith);
- }
-}
-
-function track(serializeContext, value, mappings) {
- var parts = value.split('\n');
-
- if (mappings) {
- trackAllMappings(serializeContext, mappings);
- }
-
- serializeContext.line += parts.length - 1;
- serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function trackAllMappings(serializeContext, mappings) {
- for (var i = 0, l = mappings.length; i < l; i++) {
- trackMapping(serializeContext, mappings[i]);
- }
-}
-
-function trackMapping(serializeContext, mapping) {
- var line = mapping[0];
- var column = mapping[1];
- var originalSource = mapping[2];
- var source = originalSource;
- var storedSource = source || UNKNOWN_SOURCE;
-
- if (isWindows && source && !isRemoteResource(source)) {
- storedSource = source.replace(NIX_SEPARATOR_PATTERN, WINDOWS_SEPARATOR);
- }
-
- serializeContext.outputMap.addMapping({
- generated: {
- line: serializeContext.line,
- column: serializeContext.column
- },
- source: storedSource,
- original: {
- line: line,
- column: column
- }
- });
-
- if (serializeContext.inlineSources && (originalSource in serializeContext.sourcesContent)) {
- serializeContext.outputMap.setSourceContent(storedSource, serializeContext.sourcesContent[originalSource]);
- }
-}
-
-function serializeStylesAndSourceMap(tokens, context) {
- var serializeContext = {
- column: 0,
- format: context.options.format,
- indentBy: 0,
- indentWith: '',
- inlineSources: context.options.sourceMapInlineSources,
- line: 1,
- output: [],
- outputMap: new SourceMapGenerator(),
- sourcesContent: context.sourcesContent,
- spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
- store: store,
- wrap: context.options.format.wrapAt ?
- wrap :
- function () { /* noop */ }
- };
-
- all(serializeContext, tokens);
-
- return {
- sourceMap: serializeContext.outputMap,
- styles: serializeContext.output.join('')
- };
-}
-
-module.exports = serializeStylesAndSourceMap;
diff --git a/node_modules/clean-css/package.json b/node_modules/clean-css/package.json
deleted file mode 100644
index 1de9bc540..000000000
--- a/node_modules/clean-css/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "name": "clean-css",
- "version": "4.2.1",
- "author": "Jakub Pawlowicz <contact@jakubpawlowicz.com> (http://twitter.com/jakubpawlowicz)",
- "description": "A well-tested CSS minifier",
- "license": "MIT",
- "keywords": [
- "css",
- "minifier"
- ],
- "homepage": "https://github.com/jakubpawlowicz/clean-css",
- "repository": {
- "type": "git",
- "url": "https://github.com/jakubpawlowicz/clean-css.git"
- },
- "bugs": {
- "url": "https://github.com/jakubpawlowicz/clean-css/issues"
- },
- "main": "index.js",
- "files": [
- "lib",
- "History.md",
- "index.js",
- "LICENSE"
- ],
- "scripts": {
- "browserify": "browserify --standalone CleanCSS index.js | uglifyjs --compress --mangle -o cleancss-browser.js",
- "bench": "node ./test/bench.js",
- "check": "jshint .",
- "prepublish": "npm run check",
- "test": "vows"
- },
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "devDependencies": {
- "browserify": "^14.0.0",
- "http-proxy": "1.x",
- "jshint": "2.x",
- "nock": "9.x",
- "server-destroy": "1.x",
- "uglify-js": ">=2.6.1",
- "vows": "0.8.x"
- },
- "engines": {
- "node": ">= 4.0"
- }
-}