--- /dev/null
+var UNIX_SEPARATOR = '/';
+var WINDOWS_SEPARATOR_PATTERN = /\\/g;
+
+function normalizePath(path) {
+ return path.replace(WINDOWS_SEPARATOR_PATTERN, UNIX_SEPARATOR);
+}
+
+module.exports = normalizePath;
var isAllowedResource = require('./is-allowed-resource');
var loadOriginalSources = require('./load-original-sources');
var loadRemoteResource = require('./load-remote-resource');
+var normalizePath = require('./normalize-path');
var rebase = require('./rebase');
var rebaseLocalMap = require('./rebase-local-map');
var rebaseRemoteMap = require('./rebase-remote-map');
function fromArray(input, context, callback) {
var inputAsImports = input.reduce(function (accumulator, uri) {
- accumulator.push(restoreAsRelativeImport(uri));
+ var normalizedUri = isRemoteResource(uri) ? uri : normalizePath(uri);
+
+ accumulator.push(restoreAsRelativeImport(normalizedUri));
return accumulator;
}, []);
function fromHash(input, context, callback) {
var uri;
+ var normalizedUri;
var source;
var inputAsImports = [];
for (uri in input) {
source = input[uri];
- inputAsImports.push(restoreAsRelativeImport(uri));
+ normalizedUri = isRemoteResource(uri) ? uri : normalizePath(uri);
+
+ inputAsImports.push(restoreAsRelativeImport(normalizedUri));
- context.sourcesContent[uri] = source.styles;
+ context.sourcesContent[normalizedUri] = source.styles;
if (source.sourceMap) {
- trackSourceMap(source.sourceMap, uri, context);
+ trackSourceMap(source.sourceMap, normalizedUri, context);
}
}
var importedStyles;
var importedTokens;
var isAllowed = isAllowedResource(uri, false, inlinerContext.inline);
- var isLoaded = relativeToCurrentPath in inlinerContext.externalContext.sourcesContent;
+ 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.');
inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
} else {
importedStyles = isLoaded ?
- inlinerContext.externalContext.sourcesContent[relativeToCurrentPath] :
+ inlinerContext.externalContext.sourcesContent[normalizedPath] :
fs.readFileSync(absoluteUri, 'utf-8');
inlinerContext.inlinedStylesheets.push(absoluteUri);
inlinerContext.inline = inlinerContext.externalContext.options.inline;
- inlinerContext.externalContext.source = relativeToCurrentPath;
- inlinerContext.externalContext.sourcesContent[relativeToCurrentPath] = importedStyles;
+ inlinerContext.externalContext.source = normalizedPath;
+ inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles;
inlinerContext.externalContext.stats.originalSize += importedStyles.length;
importedTokens = fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (tokens) { return tokens; });
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(element, serializeContext) {
var fromString = typeof element == 'string';
var storedSource = source || UNKNOWN_SOURCE;
if (isWindows && source && !isRemoteResource(source)) {
- source = source.replace(/\\/g, '/');
+ storedSource = source.replace(NIX_SEPARATOR_PATTERN, WINDOWS_SEPARATOR);
}
serializeContext.outputMap.addMapping({
assert.equal(minified.styles, '.one{background-color:red}.test{color:#000}');
}
},
+ 'with mixed-style paths': {
+ 'topic': function () {
+ new CleanCSS({ level: 1, inline: 'all' }).minify({
+ 'main.css': {
+ styles: '@import url(test/fixtures/partials/one.css);\n@import url(http://127.0.0.1/test.css);'
+ },
+ 'test\\fixtures\\partials\\one.css': {
+ styles: '.one { background-color:#f00; }'
+ },
+ 'http://127.0.0.1/test.css': {
+ styles: '.test { color: #000 }'
+ }
+ }, this.callback);
+ },
+ 'gives right output without reading resources': function (minified) {
+ assert.equal(minified.styles, '.one{background-color:red}.test{color:#000}');
+ }
+ },
'with @import and rules after': {
'topic': function () {
return new CleanCSS().minify(sourcesAsHash(['./test/fixtures/partials/two.css', './test/fixtures/partials-absolute/base.css']));
},
'has embedded sources': function (minified) {
assert.deepEqual(JSON.parse(minified.sourceMap.toString()).sources, [
- 'test/fixtures/source-maps/some.css',
- 'test/fixtures/source-maps/nested/once.css',
- 'test/fixtures/source-maps/styles.css'
+ path.join('test', 'fixtures', 'source-maps', 'some.css'),
+ path.join('test', 'fixtures', 'source-maps', 'nested', 'once.css'),
+ path.join('test', 'fixtures', 'source-maps', 'styles.css')
]);
},
'has embedded sources content': function (minified) {
},
'has embedded sources': function (minified) {
assert.deepEqual(JSON.parse(minified.sourceMap.toString()).sources, [
- 'test/fixtures/source-maps/some.css',
- 'test/fixtures/source-maps/nested/once.css',
- 'test/fixtures/source-maps/styles.css'
+ path.join('test', 'fixtures', 'source-maps', 'some.css'),
+ path.join('test', 'fixtures', 'source-maps', 'nested', 'once.css'),
+ path.join('test', 'fixtures', 'source-maps', 'styles.css')
]);
},
'has embedded sources content': function (minified) {