From 7aa59fb9114ba623b0a4787c9d5787d4f2edda5d Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Mon, 26 Dec 2016 15:26:09 +0100 Subject: [PATCH] Fixes #767 - refactors inlining options. Merges `processImport` and `processImportFrom` API options into a single `inline` option. It accepts the same set of rules as `processImportFrom` previously, e.g. `{ inline: 'none' }` `{ inline: ['local', '127.0.0.1] }` Also the `inline` option defaults to `local` now, which means remote `@import` rules are **NOT** inlined by default anymore. To re-enable it use any of the following: `{ inline: 'all' }` `{ inline: 'local,remote' }` Why: * These two options were meant to be merged as they represent the same concept; * Inlining remote `@import` rules by default may not be desirable; * "Inline" as the option name better represents what this option does, as it also applies to source maps. --- History.md | 1 + README.md | 11 ++-- bin/cleancss | 24 +------- lib/clean.js | 13 ++-- lib/reader/apply-source-maps.js | 6 +- lib/reader/load-original-sources.js | 6 +- lib/reader/read-sources.js | 27 ++++---- test/binary-test.js | 23 ++++--- test/integration-test.js | 8 +-- test/module-test.js | 16 ++--- test/protocol-imports-test.js | 95 ++++++++++++++--------------- test/source-map-test.js | 20 +++--- 12 files changed, 119 insertions(+), 131 deletions(-) diff --git a/History.md b/History.md index 1c446ff2..6b9c447d 100644 --- a/History.md +++ b/History.md @@ -14,6 +14,7 @@ * Fixed issue [#686](https://github.com/jakubpawlowicz/clean-css/issues/686) - adds rounding precision for all units. * 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 [#791](https://github.com/jakubpawlowicz/clean-css/issues/791) - resolves imports in-memory if possible. * 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. diff --git a/README.md b/README.md index 11e2cb69..a11616e9 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ There will be some breaking changes: * `debug` API 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. Please note this list is not final. You are more than welcome to comment these changes in [4.0 release discussion](https://github.com/jakubpawlowicz/clean-css/issues/842) thread. @@ -60,16 +61,15 @@ cleancss [options] source-file, [source-file, ...] -c, --compatibility [ie7|ie8] Force compatibility mode (see Readme for advanced examples) -d, --debug Shows debug information (minification time & compression efficiency) -o, --output [output-file] Use [output-file] as output instead of STDOUT --s, --skip-import Disable @import processing -t, --timeout [seconds] Per connection timeout when fetching remote @imports (defaults to 5 seconds) --beautify Formats output CSS by using indentation and one rule or property per line +--inline [rules] Enables inlining for listed sources (defaults to `local`) --rounding-precision [n] Rounds pixel values to `N` decimal places. `off` disables rounding (defaults to `off`) --s0 Remove all special comments, i.e. /*! comment */ --s1 Remove all special comments but the first one --semantic-merging Enables unsafe mode by assuming BEM-like semantic stylesheets (warning, this may break your styling!) --skip-advanced Disable advanced optimizations - ruleset reordering & merging --skip-aggressive-merging Disable properties merging based on their order ---skip-import-from [rules] Disable @import processing for specified rules --skip-media-merging Disable @media merging --skip-rebase Disable URLs rebasing --skip-restructuring Disable restructuring optimizations @@ -127,12 +127,11 @@ CleanCSS constructor accepts a hash as a parameter, i.e., * `beautify` - formats output CSS by using indentation and one rule or property per line. * `benchmark` - turns on benchmarking mode measuring time spent on cleaning up (run `npm run bench` to see example) * `compatibility` - enables compatibility mode, see [below for more examples](#how-to-set-a-compatibility-mode) +* `inline` - whether to inline `@import` rules, can be `['all']`, `['local']` (default), `['remote']`, or a blacklisted domain/path e.g. `['!fonts.googleapis.com']` * `inliner` - a hash of options for `@import` inliner, see [test/protocol-imports-test.js](https://github.com/jakubpawlowicz/clean-css/blob/master/test/protocol-imports-test.js#L372) for examples, or [this comment](https://github.com/jakubpawlowicz/clean-css/issues/612#issuecomment-119594185) for a proxy use case. * `keepBreaks` - whether to keep line breaks (default is false) * `keepSpecialComments` - `*` for keeping all (default), `1` for keeping first one only, `0` for removing all * `mediaMerging` - whether to merge `@media` at-rules (default is true) -* `processImport` - whether to process `@import` rules -* `processImportFrom` - a list of `@import` rules, can be `['all']` (default), `['local']`, `['remote']`, or a blacklisted path e.g. `['!fonts.googleapis.com']` * `rebase` - set to false to skip URL rebasing * `rebaseTo` - a directory to which all URLs are rebased (most likely the directory under which the output file will live), defaults to the current directory * `restructuring` - set to false to disable restructuring in advanced optimizations @@ -384,8 +383,7 @@ All advanced optimizations are dispatched [here](https://github.com/jakubpawlowi ## Acknowledgments (sorted alphabetically) * Anthony Barre ([@abarre](https://github.com/abarre)) for improvements to - `@import` processing, namely introducing the `--skip-import` / - `processImport` options. + `@import` processing. * Simon Altschuler ([@altschuler](https://github.com/altschuler)) for fixing `@import` processing inside comments. * Isaac ([@facelessuser](https://github.com/facelessuser)) for pointing out @@ -394,6 +392,7 @@ All advanced optimizations are dispatched [here](https://github.com/jakubpawlowi removing node.js' old `sys` package. * Luke Page ([@lukeapage](https://github.com/lukeapage)) 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. +* Peter Wagenet ([@wagenet](https://github.com/wagenet)) for suggesting improvements to `@import` inlining behavior. * Timur Kristóf ([@Venemo](https://github.com/Venemo)) for an outstanding contribution of advanced property optimizer for 2.2 release. * Vincent Voyer ([@vvo](https://github.com/vvo)) for a patch with better diff --git a/bin/cleancss b/bin/cleancss index 2be995c0..9e090046 100755 --- a/bin/cleancss +++ b/bin/cleancss @@ -19,16 +19,15 @@ commands .option('-c, --compatibility [ie7|ie8]', 'Force compatibility mode (see Readme for advanced examples)') .option('-d, --debug', 'Shows debug information (minification time & compression efficiency)') .option('-o, --output [output-file]', 'Use [output-file] as output instead of STDOUT') - .option('-s, --skip-import', 'Disable @import processing') .option('-t, --timeout [seconds]', 'Per connection timeout when fetching remote @imports (defaults to 5 seconds)') .option('--beautify', 'Formats output CSS by using indentation and one rule or property per line') + .option('--inline [rules]', 'Enables inlining for listed sources (defaults to `local`)') .option('--rounding-precision [n]', 'Rounds pixel values to `N` decimal places. -1 disables rounding (defaults to -1)') .option('--s0', 'Remove all special comments, i.e. /*! comment */') .option('--s1', 'Remove all special comments but the first one') .option('--semantic-merging', 'Enables unsafe mode by assuming BEM-like semantic stylesheets (warning, this may break your styling!)') .option('--skip-advanced', 'Disable advanced optimizations - ruleset reordering & merging') .option('--skip-aggressive-merging', 'Disable properties merging based on their order') - .option('--skip-import-from [rules]', 'Disable @import processing for specified rules', function (val) { return val.split(','); }, []) .option('--skip-media-merging', 'Disable @media merging') .option('--skip-rebase', 'Disable URLs rebasing') .option('--skip-restructuring', 'Disable restructuring optimizations') @@ -66,13 +65,12 @@ var options = { aggressiveMerging: commands.skipAggressiveMerging ? false : true, beautify: commands.beautify, compatibility: commands.compatibility, + inline: commands.inline || 'local', inliner: commands.timeout ? { timeout: parseFloat(commands.timeout) * 1000 } : undefined, keepBreaks: !!commands.keepLineBreaks, keepSpecialComments: commands.s0 ? 0 : (commands.s1 ? 1 : '*'), mediaMerging: commands.skipMediaMerging ? false : true, output: commands.output, - processImport: commands.skipImport ? false : true, - processImportFrom: processImportFrom(commands.skipImportFrom), rebase: commands.skipRebase ? false : true, rebaseTo: ('output' in commands) && commands.output.length > 0 ? path.dirname(path.resolve(commands.output)) : process.cwd(), restructuring: commands.skipRestructuring ? false : true, @@ -103,24 +101,6 @@ if (commands.args.length > 0) { }); } -function processImportFrom(rules) { - if (rules.length === 0) { - return ['all']; - } else if (rules.length == 1 && rules[0] == 'all') { - return []; - } else { - return rules.map(function (rule) { - if (rule == 'local') { - return 'remote'; - } else if (rule == 'remote') { - return 'local'; - } else { - return '!' + rule; - } - }); - } -} - function minify(data) { new CleanCSS(options).minify(data, function (errors, minified) { if (debugMode) { diff --git a/lib/clean.js b/lib/clean.js index 9e28b243..7108104d 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -30,12 +30,11 @@ var CleanCSS = module.exports = function CleanCSS(options) { beautify: undefined === options.beautify ? false : !!options.beautify, benchmark: options.benchmark, compatibility: compatibility(options.compatibility), + inline: inlineOptionsFrom(options.inline), inliner: options.inliner || {}, keepBreaks: options.keepBreaks || false, keepSpecialComments: 'keepSpecialComments' in options ? options.keepSpecialComments : '*', mediaMerging: undefined === options.mediaMerging ? true : !!options.mediaMerging, - processImport: undefined === options.processImport ? true : !!options.processImport, - processImportFrom: importOptionsFrom(options.processImportFrom), rebase: undefined === options.rebase ? true : !!options.rebase, rebaseTo: ('rebaseTo' in options) ? path.resolve(options.rebaseTo) : process.cwd(), restructuring: undefined === options.restructuring ? true : !!options.restructuring, @@ -54,8 +53,14 @@ var CleanCSS = module.exports = function CleanCSS(options) { ); }; -function importOptionsFrom(rules) { - return undefined === rules ? ['all'] : rules; +function inlineOptionsFrom(rules) { + if (Array.isArray(rules)) { + return rules; + } + + return undefined === rules ? + ['local'] : + rules.split(','); } function proxyOptionsFrom(httpProxy) { diff --git a/lib/reader/apply-source-maps.js b/lib/reader/apply-source-maps.js index 4e2912bb..de58bea4 100644 --- a/lib/reader/apply-source-maps.js +++ b/lib/reader/apply-source-maps.js @@ -17,11 +17,11 @@ function applySourceMaps(tokens, context, callback) { var applyContext = { callback: callback, index: 0, + inline: context.options.inline, inliner: context.options.inliner, inputSourceMapTracker: context.inputSourceMapTracker, localOnly: context.localOnly, processedTokens: [], - processImportFrom: context.options.processImportFrom, rebaseTo: context.options.rebaseTo, sourceTokens: tokens, warnings: context.warnings @@ -135,7 +135,7 @@ function extractInputSourceMapFromDataUri(uri) { } function loadInputSourceMapFromRemoteUri(uri, applyContext, whenLoaded) { - var isAllowed = isAllowedResource(uri, true, applyContext.processImportFrom); + var isAllowed = isAllowedResource(uri, true, applyContext.inline); if (applyContext.localOnly) { applyContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.'); @@ -156,7 +156,7 @@ function loadInputSourceMapFromRemoteUri(uri, applyContext, whenLoaded) { } function loadInputSourceMapFromLocalUri(uri, applyContext) { - var isAllowed = isAllowedResource(uri, true, applyContext.processImportFrom); + var isAllowed = isAllowedResource(uri, false, applyContext.inline); var sourceMap; if (!fs.existsSync(uri) || !fs.statSync(uri).isFile()) { diff --git a/lib/reader/load-original-sources.js b/lib/reader/load-original-sources.js index 95a3ebf4..1bf55084 100644 --- a/lib/reader/load-original-sources.js +++ b/lib/reader/load-original-sources.js @@ -10,9 +10,9 @@ function loadOriginalSources(context, callback) { var loadContext = { callback: callback, index: 0, + inline: context.options.inline, inliner: context.options.inliner, localOnly: context.localOnly, - processImportFrom: context.options.processImportFrom, rebaseTo: context.options.rebaseTo, sourcesContent: context.sourcesContent, uriToSource: uriToSourceMapping(context.inputSourceMapTracker.all()), @@ -81,7 +81,7 @@ function loadOriginalSource(uri, loadContext) { } function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) { - var isAllowed = isAllowedResource(uri, true, loadContext.processImportFrom); + var isAllowed = isAllowedResource(uri, true, loadContext.inline); if (loadContext.localOnly) { loadContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.'); @@ -101,7 +101,7 @@ function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) { } function loadOriginalSourceFromLocalUri(relativeUri, loadContext) { - var isAllowed = isAllowedResource(relativeUri, true, loadContext.processImportFrom); + var isAllowed = isAllowedResource(relativeUri, false, loadContext.inline); var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri); if (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile()) { diff --git a/lib/reader/read-sources.js b/lib/reader/read-sources.js index 8715cfb4..fc6f41ea 100644 --- a/lib/reader/read-sources.js +++ b/lib/reader/read-sources.js @@ -51,7 +51,7 @@ function fromString(input, context, callback) { trackSourceMap(context.options.sourceMap, undefined, context); } - return fromStyles(input, context, { processImports: context.options.processImport }, callback); + return fromStyles(input, context, { inline: context.options.inline }, callback); } function fromArray(input, context, callback) { @@ -60,7 +60,7 @@ function fromArray(input, context, callback) { return accumulator; }, []); - return fromStyles(inputAsImports.join(''), context, { processImports: true }, callback); + return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback); } function fromHash(input, context, callback) { @@ -79,7 +79,7 @@ function fromHash(input, context, callback) { } } - return fromStyles(inputAsImports.join(''), context, { processImports: true }, callback); + return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback); } function trackSourceMap(sourceMap, uri, context) { @@ -131,24 +131,27 @@ function fromStyles(styles, context, parentInlinerContext, callback) { tokens = tokenize(styles, context); tokens = rebase(tokens, context.options.rebase, context.validator, rebaseConfig); - return parentInlinerContext.processImports ? - inlineImports(tokens, context, parentInlinerContext, callback) : + return allowsAnyImports(parentInlinerContext.inline) ? + inline(tokens, context, parentInlinerContext, callback) : callback(tokens); } -function inlineImports(tokens, externalContext, parentInlinerContext, callback) { +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, inlinedStylesheets: parentInlinerContext.inlinedStylesheets || externalContext.inlinedStylesheets, + inline: parentInlinerContext.inline, inlinerOptions: externalContext.options.inliner, isRemote: parentInlinerContext.isRemote || false, localOnly: externalContext.localOnly, outputTokens: [], - processImports: parentInlinerContext.processImports, - processImportFrom: externalContext.options.processImportFrom, rebaseTo: externalContext.options.rebaseTo, sourceTokens: tokens, warnings: externalContext.warnings @@ -191,7 +194,7 @@ function inlineStylesheet(token, inlinerContext) { } function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) { - var isAllowed = isAllowedResource(uri, true, inlinerContext.processImportFrom); + var isAllowed = isAllowedResource(uri, true, inlinerContext.inline); var originalUri = uri; var isLoaded = uri in inlinerContext.externalContext.sourcesContent; @@ -232,7 +235,7 @@ function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) { }); } - inlinerContext.processImports = inlinerContext.externalContext.options.processImport; + inlinerContext.inline = inlinerContext.externalContext.options.inline; inlinerContext.isRemote = true; inlinerContext.externalContext.source = originalUri; @@ -262,7 +265,7 @@ function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) { var relativeToCurrentPath = path.relative(currentPath, absoluteUri); var importedStyles; var importedTokens; - var isAllowed = isAllowedResource(uri, false, inlinerContext.processImportFrom); + var isAllowed = isAllowedResource(uri, false, inlinerContext.inline); var isLoaded = relativeToCurrentPath in inlinerContext.externalContext.sourcesContent; if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) { @@ -282,7 +285,7 @@ function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) { fs.readFileSync(absoluteUri, 'utf-8'); inlinerContext.inlinedStylesheets.push(absoluteUri); - inlinerContext.processImports = inlinerContext.externalContext.options.processImport; + inlinerContext.inline = inlinerContext.externalContext.options.inline; inlinerContext.externalContext.source = relativeToCurrentPath; inlinerContext.externalContext.sourcesContent[relativeToCurrentPath] = importedStyles; diff --git a/test/binary-test.js b/test/binary-test.js index 4041677e..7d157d37 100644 --- a/test/binary-test.js +++ b/test/binary-test.js @@ -208,25 +208,30 @@ vows.describe('./bin/cleancss') }) }) .addBatch({ - 'disable @import': binaryContext('-s ./test/fixtures/imports.css', { + 'disable @import': binaryContext('--inline none ./test/fixtures/imports.css', { 'should disable the import processing': function (error, stdout) { assert.equal(stdout, '@import url(test/fixtures/partials/one.css);@import url(test/fixtures/partials/two.css);.imports{color:#000}'); } }) }) .addBatch({ - 'disable all @import': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--skip-import-from all', { - 'should disable the remote import processing': function (error, stdout) { + 'disable all @import': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--inline none', { + 'keeps original import rules': function (error, stdout) { assert.equal(stdout, '@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'); } }), - 'disable remote @import': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--skip-import-from remote', { - 'should disable the remote import processing': function (error, stdout) { + 'disable remote @import': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--inline !remote', { + 'keeps remote import rule': function (error, stdout) { assert.equal(stdout, '@import url(http://127.0.0.1/remote.css);.one{color:red}'); } }), - 'disable remote @import by host': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--skip-import-from 127.0.0.1', { - 'should disable the remote import processing': function (error, stdout) { + 'disable remote @import as default': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '', { + 'keeps remote import rule': function (error, stdout) { + assert.equal(stdout, '@import url(http://127.0.0.1/remote.css);.one{color:red}'); + } + }), + 'disable remote @import by host': pipedContext('@import url(http://127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);', '--inline !127.0.0.1', { + 'keeps remote import rule': function (error, stdout) { assert.equal(stdout, '@import url(http://127.0.0.1/remote.css);.one{color:red}'); } }) @@ -331,7 +336,7 @@ vows.describe('./bin/cleancss') setTimeout(function () {}, 1000); }); this.server.listen('24682', function () { - exec('echo "' + source + '" | ./bin/cleancss --timeout 0.01', self.callback); + exec('echo "' + source + '" | ./bin/cleancss --timeout 0.01 --inline all', self.callback); }); }, 'should raise warning': function (error, stdout, stderr) { @@ -364,7 +369,7 @@ vows.describe('./bin/cleancss') }); this.server.listen(8080); - exec('echo "@import url(http://127.0.0.1:8080/test.css);" | HTTP_PROXY=http://127.0.0.1:8081 ./bin/cleancss', this.callback); + exec('echo "@import url(http://127.0.0.1:8080/test.css);" | HTTP_PROXY=http://127.0.0.1:8081 ./bin/cleancss --inline all', this.callback); }, 'proxies the connection': function () { assert.isTrue(this.proxied); diff --git a/test/integration-test.js b/test/integration-test.js index 6025d0cb..d79375d3 100644 --- a/test/integration-test.js +++ b/test/integration-test.js @@ -2088,7 +2088,7 @@ vows.describe('integration tests') }) ) .addBatch( - optimizerContext('@import with option processImport', { + optimizerContext('@import with inline option', { 'of an unknown file': [ '@import url(/fake.css);', '@import url(/fake.css);' @@ -2101,7 +2101,7 @@ vows.describe('integration tests') '@import \'necolas/normalize.css@*/normalize.css\';', '@import url(necolas/normalize.css@*/normalize.css);' ] - }, { processImport: false }) + }, { inline: 'none' }) ) .addBatch( optimizerContext('@import with no import and no advanced', { @@ -2113,7 +2113,7 @@ vows.describe('integration tests') '@import url(//fonts.googleapis.com/css?family=Domine:700);body{color:red}body h1{font-family:Domine}', '@import url(//fonts.googleapis.com/css?family=Domine:700);body{color:red}body h1{font-family:Domine}' ] - }, { processImport: false, advanced: false }) + }, { inline: 'none', advanced: false }) ) .addBatch( optimizerContext('@import with no url', { @@ -2121,7 +2121,7 @@ vows.describe('integration tests') '@import url(test.css);@font-face{font-family:"icomoon"}', '@import url(test.css);@font-face{font-family:icomoon}' ] - }, { processImport: false }) + }, { inline: 'none' }) ) .addBatch( optimizerContext('body at-rules', { diff --git a/test/module-test.js b/test/module-test.js index 6fff4ddf..b04b162c 100644 --- a/test/module-test.js +++ b/test/module-test.js @@ -69,7 +69,7 @@ vows.describe('module tests').addBatch({ }, 'with callback passed to remote import': { topic: function () { - new CleanCSS({ processImportFrom: ['local'] }).minify('@import url(https://fonts.googleapis.com/css?family=Open+Sans);', this.callback); + new CleanCSS({ inline: 'local' }).minify('@import url(https://fonts.googleapis.com/css?family=Open+Sans);', this.callback); }, 'should yield no error and minify': function (errors, minified) { assert.equal(minified.styles, '@import url(https://fonts.googleapis.com/css?family=Open+Sans);'); @@ -325,7 +325,7 @@ vows.describe('module tests').addBatch({ }, 'process import': { 'topic': function () { - return new CleanCSS({ processImport: true }).minify('@import url(/test/fixtures/partials/one.css);'); + return new CleanCSS({ inline: 'all' }).minify('@import url(/test/fixtures/partials/one.css);'); }, 'gets right output': function (minified) { assert.equal(minified.styles, '.one{color:red}'); @@ -457,7 +457,7 @@ vows.describe('module tests').addBatch({ 'with imports': { 'off - one file': { 'topic': function () { - return new CleanCSS({ processImport: false }).minify(['./test/fixtures/partials/two.css']); + return new CleanCSS({ inline: 'none' }).minify(['./test/fixtures/partials/two.css']); }, 'should give right output': function (minified) { assert.equal(minified.styles, '@import url(test/fixtures/partials/one.css);@import url(test/fixtures/partials/extra/three.css);@import url(test/fixtures/partials/extra/four.css);.two{color:#fff}'); @@ -465,7 +465,7 @@ vows.describe('module tests').addBatch({ }, 'off - many files': { 'topic': function () { - return new CleanCSS({ processImport: false }).minify(['./test/fixtures/partials/remote.css', './test/fixtures/partials-absolute/base.css']); + return new CleanCSS({ inline: 'none' }).minify(['./test/fixtures/partials/remote.css', './test/fixtures/partials-absolute/base.css']); }, 'should give right output': function (minified) { assert.equal(minified.styles, '@import url(http://jakubpawlowicz.com/styles.css);@import url(test/fixtures/partials-absolute/extra/sub.css);.base{margin:0}'); @@ -473,7 +473,7 @@ vows.describe('module tests').addBatch({ }, 'off - many files with content': { 'topic': function () { - return new CleanCSS({ processImport: false }).minify(['./test/fixtures/partials/two.css', './test/fixtures/partials-absolute/base.css']); + return new CleanCSS({ inline: 'none' }).minify(['./test/fixtures/partials/two.css', './test/fixtures/partials-absolute/base.css']); }, 'should give right output': function (minified) { assert.equal(minified.styles, '@import url(test/fixtures/partials/one.css);@import url(test/fixtures/partials/extra/three.css);@import url(test/fixtures/partials/extra/four.css);.two{color:#fff}.base{margin:0}'); @@ -591,7 +591,7 @@ vows.describe('module tests').addBatch({ 'with other imports and processing imports off': { 'relative': { 'topic': function () { - return new CleanCSS({ processImport: false }).minify( + return new CleanCSS({ inline: 'none' }).minify( sourcesAsHash([ 'test/fixtures/partials/two.css' ]) @@ -603,7 +603,7 @@ vows.describe('module tests').addBatch({ }, 'absolute': { 'topic': function () { - return new CleanCSS({ processImport: false }).minify( + return new CleanCSS({ inline: 'none' }).minify( sourcesAsHash([ 'test/fixtures/partials/two.css' ], true) @@ -640,7 +640,7 @@ vows.describe('module tests').addBatch({ }, 'with already resolved imports': { 'topic': function () { - new CleanCSS({ advanced: false }).minify({ + new CleanCSS({ advanced: false, inline: 'all' }).minify({ 'main.css': { styles: '@import url(test/fixtures/partials/one.css);\n@import url(http://127.0.0.1/test.css);' }, diff --git a/test/protocol-imports-test.js b/test/protocol-imports-test.js index b73615be..7a7474a5 100644 --- a/test/protocol-imports-test.js +++ b/test/protocol-imports-test.js @@ -21,7 +21,7 @@ vows.describe('protocol imports').addBatch({ .get('/missing.css') .reply(404); - new CleanCSS().minify('@import url(http://127.0.0.1/missing.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/missing.css);a{color:red}', this.callback); }, 'should raise error': function (errors, minified) { assert.lengthOf(errors, 1); @@ -40,7 +40,7 @@ vows.describe('protocol imports').addBatch({ .get('/present.css') .reply(200, 'p{font-size:13px}'); - new CleanCSS().minify('@import url(http://127.0.0.1/present.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/present.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -59,7 +59,7 @@ vows.describe('protocol imports').addBatch({ .get('/css?family=Oleo%20Script%20Swash%20Caps') .reply(200, 'p{font-size:13px}'); - new CleanCSS().minify('@import url(\'//fonts.googleapis.com/css?family=Oleo Script Swash Caps\');', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(\'//fonts.googleapis.com/css?family=Oleo Script Swash Caps\');', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -78,7 +78,7 @@ vows.describe('protocol imports').addBatch({ .get('/present.css') .reply(200, 'p{font-size:13px}'); - new CleanCSS().minify('@import url(https://127.0.0.1/present.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(https://127.0.0.1/present.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -97,7 +97,7 @@ vows.describe('protocol imports').addBatch({ .get('/present.css') .reply(200, 'p{font-size:13px}'); - new CleanCSS().minify('@import url(http://127.0.0.1/present.css) screen;a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/present.css) screen;a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -121,7 +121,7 @@ vows.describe('protocol imports').addBatch({ .get('/base.css') .reply(200, 'div{padding:0}'); - new CleanCSS().minify('@import url(http://127.0.0.1/present.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/present.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -143,7 +143,7 @@ vows.describe('protocol imports').addBatch({ .get('/vendor/reset.css') .reply(200, 'body{margin:0}'); - new CleanCSS().minify('@import url(http://127.0.0.1/nested/present.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/nested/present.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -164,7 +164,7 @@ vows.describe('protocol imports').addBatch({ .get('/missing.css') .reply(404); - new CleanCSS().minify('@import url(http://127.0.0.1/nested/present.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/nested/present.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.lengthOf(errors, 1); @@ -184,7 +184,7 @@ vows.describe('protocol imports').addBatch({ .get('/urls.css') .reply(200, 'a{background:url(test.png)}'); - new CleanCSS().minify('@import url(http://127.0.0.1/urls.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/urls.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -205,7 +205,7 @@ vows.describe('protocol imports').addBatch({ .get('/deeply/nested/urls.css') .reply(200, 'a{background:url(../images/test.png)}'); - new CleanCSS().minify('@import url(http://127.0.0.1/base.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/base.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -226,7 +226,7 @@ vows.describe('protocol imports').addBatch({ .get('/deeply/nested/urls.css') .reply(200, 'a{background:url(../images/test.png)}'); - new CleanCSS({ rebase: false }).minify('@import url(http://127.0.0.1/base.css);', this.callback); + new CleanCSS({ inline: 'all', rebase: false }).minify('@import url(http://127.0.0.1/base.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -245,7 +245,7 @@ vows.describe('protocol imports').addBatch({ .get('/base.css') .reply(200, 'a{background:url(http://example.com/deeply/images/test.png)}'); - new CleanCSS().minify('@import url(http://127.0.0.1/base.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/base.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -260,7 +260,7 @@ vows.describe('protocol imports').addBatch({ }, 'of an unreachable domain': { topic: function () { - new CleanCSS().minify('@import url(http://0.0.0.0/custom.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://0.0.0.0/custom.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.lengthOf(errors, 1); @@ -278,7 +278,7 @@ vows.describe('protocol imports').addBatch({ .get('/present.css') .reply(200, 'body{margin:0}'); - new CleanCSS().minify('@import url(http://127.0.0.1/moved.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/moved.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -299,7 +299,7 @@ vows.describe('protocol imports').addBatch({ .get('/present.css') .reply(200, 'body{margin:0}'); - new CleanCSS().minify('@import url(http://127.0.0.1/moved.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/moved.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -320,7 +320,7 @@ vows.describe('protocol imports').addBatch({ .get('/two.css') .reply(200, '@import url(http://127.0.0.1/two.css);body{margin:0}'); - new CleanCSS().minify('@import url(http://127.0.0.1/one.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/one.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -339,7 +339,7 @@ vows.describe('protocol imports').addBatch({ .get('/no-protocol.css') .reply(200, 'div{padding:0}'); - new CleanCSS().minify('@import url(//127.0.0.1/no-protocol.css);a{color:red}', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(//127.0.0.1/no-protocol.css);a{color:red}', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -358,7 +358,7 @@ vows.describe('protocol imports').addBatch({ .get('/no-protocol.css') .reply(200, 'a{background:url(image.png)}'); - new CleanCSS().minify('@import url(//127.0.0.1/no-protocol.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(//127.0.0.1/no-protocol.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -377,7 +377,7 @@ vows.describe('protocol imports').addBatch({ .get('/no-protocol.css') .reply(200, 'a{background:url(//127.0.0.1/image.png)}'); - new CleanCSS().minify('@import url(http://127.0.0.1/no-protocol.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/no-protocol.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -396,7 +396,7 @@ vows.describe('protocol imports').addBatch({ .get('/no-protocol.css') .reply(200, 'a{background:url(//127.0.0.2/image.png)}'); - new CleanCSS().minify('@import url(http://127.0.0.1/no-protocol.css);', this.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://127.0.0.1/no-protocol.css);', this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -416,6 +416,7 @@ vows.describe('protocol imports').addBatch({ .reply(200, 'div{padding:0}'); new CleanCSS({ + inline: 'all', inliner: { request: { method: 'POST' @@ -441,7 +442,7 @@ vows.describe('protocol imports').addBatch({ .get('/remote.css') .reply(200, 'div{padding:0}'); - new CleanCSS().minify(source, this.callback); + new CleanCSS({ inline: 'all' }).minify(source, this.callback); }, 'should not raise errors': function (errors, minified) { assert.isNull(errors); @@ -461,7 +462,7 @@ vows.describe('protocol imports').addBatch({ .get('/remote.css') .reply(200, 'div{padding:0}'); - return new CleanCSS().minify(source); + return new CleanCSS({ inline: 'all' }).minify(source); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -485,7 +486,7 @@ vows.describe('protocol imports').addBatch({ .get('/remote.css') .reply(200, 'div{padding:0}'); - return new CleanCSS().minify(source); + return new CleanCSS({ inline: 'all' }).minify(source); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -505,7 +506,7 @@ vows.describe('protocol imports').addBatch({ 'of a remote resource mixed with local ones and disabled remote imports': { topic: function () { var source = '@import url(http://127.0.0.1/skipped.css);@import url(test/fixtures/partials/one.css);'; - new CleanCSS({ processImportFrom: ['local'] }).minify(source, this.callback); + new CleanCSS({ inline: ['local'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -529,7 +530,7 @@ vows.describe('protocol imports').addBatch({ .get('/test/folder/deepersubfolder/fonts.css') .reply(200, 'a{color:red}'); - new CleanCSS().minify(source, this.callback); + new CleanCSS({ inline: 'all' }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -554,6 +555,7 @@ vows.describe('protocol imports').addBatch({ }); this.server.listen(port, function () { new CleanCSS({ + inline: 'all', inliner: { timeout: timeout } @@ -592,6 +594,7 @@ vows.describe('protocol imports').addBatch({ }); this.proxyServer.listen(8080, function () { var options = { + inline: 'all', inliner: { request: { hostname: '127.0.0.1', @@ -636,6 +639,7 @@ vows.describe('protocol imports').addBatch({ }); this.proxyServer.listen(8080, function () { var options = { + inline: 'all', inliner: { request: { hostname: '127.0.0.1', @@ -681,7 +685,7 @@ vows.describe('protocol imports').addBatch({ }); this.proxyServer.listen(8081, function () { process.env.http_proxy = 'http://127.0.0.1:8081'; - new CleanCSS().minify('@import url(http://assets.127.0.0.1/styles.css);', self.callback); + new CleanCSS({ inline: 'all' }).minify('@import url(http://assets.127.0.0.1/styles.css);', self.callback); }); enableDestroy(this.proxyServer); }, @@ -716,6 +720,7 @@ vows.describe('protocol imports').addBatch({ }); this.proxyServer.listen(8082, function () { var options = { + inline: 'all', inliner: { request: { hostname: '127.0.0.1', @@ -746,34 +751,24 @@ vows.describe('protocol imports').addBatch({ 'allowed imports - not set': { topic: function () { var source = '@import url(http://127.0.0.1/remote.css);@import url(http://assets.127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'; - this.reqMocks1 = nock('http://127.0.0.1') - .get('/remote.css') - .reply(200, 'div{border:0}'); - this.reqMocks2 = nock('http://assets.127.0.0.1') - .get('/remote.css') - .reply(200, 'p{width:100%}'); - new CleanCSS().minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); }, - 'should not raise warnings': function (error, minified) { - assert.isEmpty(minified.warnings); + 'should raise warnings': function (error, minified) { + assert.lengthOf(minified.warnings, 2); + assert.equal(minified.warnings[0], 'Skipping remote @import of "http://127.0.0.1/remote.css" as resource is not allowed.'); + assert.equal(minified.warnings[1], 'Skipping remote @import of "http://assets.127.0.0.1/remote.css" as resource is not allowed.'); }, 'should process imports': function (error, minified) { - assert.equal(minified.styles, 'div{border:0}p{width:100%}.one{color:red}'); - }, - teardown: function () { - assert.isTrue(this.reqMocks1.isDone()); - assert.isTrue(this.reqMocks2.isDone()); - nock.cleanAll(); + assert.equal(minified.styles, '@import url(http://127.0.0.1/remote.css);@import url(http://assets.127.0.0.1/remote.css);.one{color:red}'); } }, - 'allowed imports - not set and disabled by processImport': { + 'allowed imports - not set and disabled by `inline`': { topic: function () { var source = '@import url(http://127.0.0.1/remote.css);@import url(http://assets.127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'; - new CleanCSS({ processImport: false }).minify(source, this.callback); + new CleanCSS({ inline: ['none'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -788,7 +783,7 @@ vows.describe('protocol imports').addBatch({ 'allowed imports - local': { topic: function () { var source = '@import url(http://127.0.0.1/remote.css);@import url(http://assets.127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'; - new CleanCSS({ processImportFrom: ['local'] }).minify(source, this.callback); + new CleanCSS({ inline: ['local'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -811,7 +806,7 @@ vows.describe('protocol imports').addBatch({ this.reqMocks2 = nock('http://assets.127.0.0.1') .get('/remote.css') .reply(200, 'p{width:100%}'); - new CleanCSS({ processImportFrom: ['remote'] }).minify(source, this.callback); + new CleanCSS({ inline: ['remote'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -837,7 +832,7 @@ vows.describe('protocol imports').addBatch({ this.reqMocks2 = nock('http://assets.127.0.0.1') .get('/remote.css') .reply(200, 'p{width:100%}'); - new CleanCSS({ processImportFrom: ['all'] }).minify(source, this.callback); + new CleanCSS({ inline: ['all'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -857,7 +852,7 @@ vows.describe('protocol imports').addBatch({ 'allowed imports - blacklisted': { topic: function () { var source = '@import url(http://127.0.0.1/remote.css);@import url(http://assets.127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'; - new CleanCSS({ processImportFrom: ['remote', 'local', '!assets.127.0.0.1', '!127.0.0.1', '!test/fixtures/partials/one.css'] }).minify(source, this.callback); + new CleanCSS({ inline: ['remote', 'local', '!assets.127.0.0.1', '!127.0.0.1', '!test/fixtures/partials/one.css'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -875,7 +870,7 @@ vows.describe('protocol imports').addBatch({ 'allowed imports - blacklisted & no-protocol': { topic: function () { var source = '@import url(//127.0.0.1/remote.css);@import url(test/fixtures/partials/one.css);'; - new CleanCSS({ processImportFrom: ['!127.0.0.1'] }).minify(source, this.callback); + new CleanCSS({ inline: ['!127.0.0.1'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -894,7 +889,7 @@ vows.describe('protocol imports').addBatch({ this.reqMocks = nock('http://assets.127.0.0.1') .get('/remote.css') .reply(200, 'p{width:100%}'); - new CleanCSS({ processImportFrom: ['http://assets.127.0.0.1/remote.css', 'test/fixtures/partials/one.css'] }).minify(source, this.callback); + new CleanCSS({ inline: ['http://assets.127.0.0.1/remote.css', 'test/fixtures/partials/one.css'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); @@ -916,7 +911,7 @@ vows.describe('protocol imports').addBatch({ this.reqMocks = nock('http://assets.127.0.0.1') .get('/remote.css') .reply(200, 'p{width:100%}'); - new CleanCSS({ processImportFrom: ['!http://127.0.0.1/', 'test/fixtures/partials'] }).minify(source, this.callback); + new CleanCSS({ inline: ['!http://127.0.0.1/', 'test/fixtures/partials'] }).minify(source, this.callback); }, 'should not raise errors': function (error, minified) { assert.isEmpty(minified.errors); diff --git a/test/source-map-test.js b/test/source-map-test.js index 7d1fa689..b95d1183 100644 --- a/test/source-map-test.js +++ b/test/source-map-test.js @@ -940,7 +940,7 @@ vows.describe('source-map') .get('/remote.css.map') .reply(404); - new CleanCSS({ sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); + new CleanCSS({ inline: 'all', sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); }, 'has mapping': function (errors, minified) { assert.isDefined(minified.sourceMap); @@ -976,7 +976,7 @@ vows.describe('source-map') } }); this.server.listen(port, '127.0.0.1', function () { - new CleanCSS({ sourceMap: true, inliner: { timeout: timeout } }) + new CleanCSS({ inline: 'all', sourceMap: true, inliner: { timeout: timeout } }) .minify('@import url(http://127.0.0.1:' + port + '/remote.css);', self.callback); }); enableDestroy(this.server); @@ -1004,7 +1004,7 @@ vows.describe('source-map') .get('/remote.css.map') .reply(200, inputMap); - new CleanCSS({ sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); + new CleanCSS({ inline: 'all', sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); }, 'has mapping': function (errors, minified) { assert.isDefined(minified.sourceMap); @@ -1025,7 +1025,7 @@ vows.describe('source-map') .get('/remote.css.map') .reply(200, inputMap); - new CleanCSS({ sourceMap: true }).minify('@import url(https://127.0.0.1/remote.css);', this.callback); + new CleanCSS({ inline: 'all', sourceMap: true }).minify('@import url(https://127.0.0.1/remote.css);', this.callback); }, 'has mapping': function (errors, minified) { assert.isDefined(minified.sourceMap); @@ -1046,7 +1046,7 @@ vows.describe('source-map') .get('/remote.css.map') .reply(200, inputMap); - new CleanCSS({ sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); + new CleanCSS({ inline: 'all', sourceMap: true }).minify('@import url(http://127.0.0.1/remote.css);', this.callback); }, 'has mapping': function (errors, minified) { assert.isDefined(minified.sourceMap); @@ -1067,7 +1067,7 @@ vows.describe('source-map') .post('/remote.css.map') .reply(200, inputMap); - new CleanCSS({ sourceMap: true, inliner: { request: { method: 'POST' } } }) + new CleanCSS({ inline: 'all', sourceMap: true, inliner: { request: { method: 'POST' } } }) .minify('@import url(http://127.0.0.1/remote.css);', this.callback); }, 'has mapping': function (errors, minified) { @@ -1369,7 +1369,7 @@ vows.describe('source-map') .get('/some.css') .reply(200, 'div{background:url(image.png)}'); - new CleanCSS({ sourceMap: true, sourceMapInlineSources: true }).minify([ + new CleanCSS({ inline: 'all', sourceMap: true, sourceMapInlineSources: true }).minify([ 'http://127.0.0.1/some.css' ], this.callback); }, @@ -1684,7 +1684,7 @@ vows.describe('source-map') .get('/styles.less') .reply(200, 'div > a {\n color: blue;\n}\n'); - new CleanCSS({ sourceMap: true, sourceMapInlineSources: true }).minify({ + new CleanCSS({ inline: 'all', sourceMap: true, sourceMapInlineSources: true }).minify({ 'http://127.0.0.1/some.css': { styles: 'div {\n color: red;\n}', sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}' @@ -1729,7 +1729,7 @@ vows.describe('source-map') .get('/styles.less') .reply(200, 'div > a {\n color: blue;\n}\n'); - new CleanCSS({ sourceMap: true, sourceMapInlineSources: true }).minify({ + new CleanCSS({ inline: 'all', sourceMap: true, sourceMapInlineSources: true }).minify({ 'http://127.0.0.1/some.css': { styles: 'div {\n color: red;\n}', sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}' @@ -1771,7 +1771,7 @@ vows.describe('source-map') }, 'mixed remote and no callback': { 'topic': function () { - return new CleanCSS({ sourceMap: true, sourceMapInlineSources: true }).minify({ + return new CleanCSS({ inline: 'all', sourceMap: true, sourceMapInlineSources: true }).minify({ 'http://127.0.0.1/some.css': { styles: 'div {\n color: red;\n}', sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}' -- 2.34.1