postcss-import
Advanced tools
Comparing version 5.2.2 to 6.0.0
@@ -0,1 +1,7 @@ | ||
# 6.0.0 - 2015-06-17 | ||
- Changed: warnings messages are now using postcss message api (4.1.x) | ||
- Added: warning when a import statement has not been closed correctly | ||
([#42](https://github.com/postcss/postcss-import/issues/42)) | ||
# 5.2.2 - 2015-04-19 | ||
@@ -2,0 +8,0 @@ |
224
index.js
@@ -1,3 +0,1 @@ | ||
"use strict"; | ||
/** | ||
@@ -9,2 +7,3 @@ * Module dependencies. | ||
var assign = require("object-assign") | ||
var clone = require("clone") | ||
@@ -22,12 +21,8 @@ var resolve = require("resolve") | ||
"web_modules", | ||
"node_modules" | ||
"node_modules", | ||
] | ||
/** | ||
* Expose the plugin. | ||
*/ | ||
module.exports = AtImport | ||
module.exports.postcss = function(styles) { | ||
return module.exports()(styles) | ||
} | ||
var warnNodesMessage = | ||
"It looks like you didn't end correctly your @import statement. " + | ||
"Some children nodes are attached to it" | ||
@@ -40,3 +35,3 @@ /** | ||
function AtImport(options) { | ||
options = options || {} | ||
options = assign({}, options || {}) | ||
options.root = options.root || process.cwd() | ||
@@ -50,5 +45,13 @@ options.path = ( | ||
return function(styles) { | ||
return function(styles, result) { | ||
// auto add from option if possible | ||
if (!options.from && styles && styles.nodes && styles.nodes[0] && styles.nodes[0].source && styles.nodes[0].source.input && styles.nodes[0].source.input.file) { | ||
if ( | ||
!options.from && | ||
styles && | ||
styles.nodes && | ||
styles.nodes[0] && | ||
styles.nodes[0].source && | ||
styles.nodes[0].source.input && | ||
styles.nodes[0].source.input.file | ||
) { | ||
options.from = styles.nodes[0].source.input.file | ||
@@ -68,3 +71,3 @@ } | ||
importedFiles[options.from] = { | ||
"": true | ||
"": true, | ||
} | ||
@@ -76,3 +79,12 @@ } | ||
parseStyles(styles, options, insertRules, importedFiles, ignoredAtRules, null, hashFiles) | ||
parseStyles( | ||
result, | ||
styles, | ||
options, | ||
insertRules, | ||
importedFiles, | ||
ignoredAtRules, | ||
null, | ||
hashFiles | ||
) | ||
addIgnoredAtRulesOnTop(styles, ignoredAtRules) | ||
@@ -92,5 +104,17 @@ | ||
*/ | ||
function parseStyles(styles, options, cb, importedFiles, ignoredAtRules, media, hashFiles) { | ||
function parseStyles( | ||
result, | ||
styles, | ||
options, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
media, | ||
hashFiles | ||
) { | ||
var imports = [] | ||
styles.eachAtRule("import", function checkAtRule(atRule) { | ||
if (atRule.nodes) { | ||
result.warn(warnNodesMessage, {node: atRule}) | ||
} | ||
if (options.glob && glob.hasMagic(atRule.params)) { | ||
@@ -105,3 +129,12 @@ imports = parseGlob(atRule, options, imports) | ||
helpers.try(function transformAtImport() { | ||
readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media, hashFiles) | ||
readAtImport( | ||
result, | ||
atRule, | ||
options, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
media, | ||
hashFiles | ||
) | ||
}, atRule.source) | ||
@@ -119,8 +152,10 @@ }) | ||
function parseGlob(atRule, options, imports) { | ||
var globPattern = atRule.params.replace(/['"]/g, "").replace(/(?:url\(|\))/g, "") | ||
var globPattern = atRule.params | ||
.replace(/['"]/g, "") | ||
.replace(/(?:url\(|\))/g, "") | ||
var paths = options.path.concat(moduleDirectories) | ||
var files = [] | ||
var dir = options.source && options.source.input && options.source.input.file ? | ||
path.dirname(path.resolve(options.root, options.source.input.file)) : | ||
options.root | ||
var dir = options.source && options.source.input && options.source.input.file | ||
? path.dirname(path.resolve(options.root, options.source.input.file)) | ||
: options.root | ||
paths.forEach(function(p) { | ||
@@ -132,17 +167,23 @@ p = path.resolve(dir, p) | ||
files.push(file) | ||
}); | ||
}); | ||
}) | ||
}) | ||
files.forEach(function(file) { | ||
var deglobbedAtRule = atRule.clone({ | ||
params: "\"" + file + "\"" | ||
params: "\"" + file + "\"", | ||
}) | ||
if (deglobbedAtRule.source && deglobbedAtRule.source.input && deglobbedAtRule.source.input.css) { | ||
deglobbedAtRule.source.input.css = atRule.source.input.css.replace(globPattern, file) | ||
if ( | ||
deglobbedAtRule.source && | ||
deglobbedAtRule.source.input && | ||
deglobbedAtRule.source.input.css | ||
) { | ||
deglobbedAtRule.source.input.css = atRule.source.input.css | ||
.replace(globPattern, file) | ||
} | ||
atRule.parent.insertBefore(atRule, deglobbedAtRule) | ||
imports.push(deglobbedAtRule) | ||
}); | ||
}) | ||
atRule.removeSelf() | ||
return imports; | ||
return imports | ||
} | ||
@@ -163,3 +204,4 @@ | ||
var ignoredAtRule = ignoredAtRules[i][0] | ||
ignoredAtRule.params = ignoredAtRules[i][1].fullUri + (ignoredAtRules[i][1].media ? " " + ignoredAtRules[i][1].media : "") | ||
ignoredAtRule.params = ignoredAtRules[i][1].fullUri + | ||
(ignoredAtRules[i][1].media ? " " + ignoredAtRules[i][1].media : "") | ||
@@ -174,3 +216,4 @@ // keep ast ref | ||
// separate remote import a little with others rules if no newlines already | ||
if (first && first.before.indexOf("\n") === -1) { | ||
if (first && | ||
first.before.indexOf("\n") === -1) { | ||
first.before = "\n\n" + first.before | ||
@@ -187,3 +230,12 @@ } | ||
*/ | ||
function readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media, hashFiles) { | ||
function readAtImport( | ||
result, | ||
atRule, | ||
options, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
media, | ||
hashFiles | ||
) { | ||
// parse-import module parse entire line | ||
@@ -194,5 +246,8 @@ // @todo extract what can be interesting from this one | ||
// adjust media according to current scope | ||
media = parsedAtImport.media ? (media ? media + " and " : "") + parsedAtImport.media : (media ? media : null) | ||
media = parsedAtImport.media | ||
? (media ? media + " and " : "") + parsedAtImport.media | ||
: (media ? media : null) | ||
// just update protocol base uri (protocol://url) or protocol-relative (//url) if media needed | ||
// just update protocol base uri (protocol://url) or protocol-relative | ||
// (//url) if media needed | ||
if (parsedAtImport.uri.match(/^(?:[a-z]+:)?\/\//i)) { | ||
@@ -211,6 +266,15 @@ parsedAtImport.media = media | ||
addInputToPath(options) | ||
var resolvedFilename = resolveFilename(parsedAtImport.uri, options.root, options.path, atRule.source) | ||
var resolvedFilename = resolveFilename( | ||
parsedAtImport.uri, | ||
options.root, | ||
options.path, | ||
atRule.source, | ||
options.resolve | ||
) | ||
// skip files already imported at the same scope | ||
if (importedFiles[resolvedFilename] && importedFiles[resolvedFilename][media]) { | ||
if ( | ||
importedFiles[resolvedFilename] && | ||
importedFiles[resolvedFilename][media] | ||
) { | ||
detach(atRule) | ||
@@ -226,4 +290,14 @@ return | ||
readImportedContent(atRule, parsedAtImport, clone(options), resolvedFilename, cb, importedFiles, ignoredAtRules, media, hashFiles) | ||
readImportedContent( | ||
result, | ||
atRule, | ||
parsedAtImport, | ||
clone(options), | ||
resolvedFilename, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
media, | ||
hashFiles | ||
) | ||
} | ||
@@ -240,3 +314,14 @@ | ||
*/ | ||
function readImportedContent(atRule, parsedAtImport, options, resolvedFilename, cb, importedFiles, ignoredAtRules, media, hashFiles) { | ||
function readImportedContent( | ||
result, | ||
atRule, | ||
parsedAtImport, | ||
options, | ||
resolvedFilename, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
media, | ||
hashFiles | ||
) { | ||
// add directory containing the @imported file in the paths | ||
@@ -251,6 +336,12 @@ // to allow local import from this file | ||
options.from = resolvedFilename | ||
var fileContent = readFile(resolvedFilename, options.encoding, options.transform || function(value) { return value }) | ||
var fileContent = readFile( | ||
resolvedFilename, | ||
options.encoding, | ||
options.transform || function(value) { | ||
return value | ||
} | ||
) | ||
if (fileContent.trim() === "") { | ||
console.log(helpers.message(resolvedFilename + " is empty", atRule.source)) | ||
result.warn(resolvedFilename + " is empty", {node: atRule}) | ||
detach(atRule) | ||
@@ -261,3 +352,3 @@ return | ||
// skip files wich only contain @import rules | ||
var newFileContent = fileContent.replace(/@import (.*);/,"") | ||
var newFileContent = fileContent.replace(/@import (.*);/, "") | ||
if (newFileContent.trim() !== "") { | ||
@@ -282,3 +373,12 @@ var fileContentHash = hash(fileContent) | ||
// recursion: import @import from imported file | ||
parseStyles(newStyles, options, cb, importedFiles, ignoredAtRules, parsedAtImport.media, hashFiles) | ||
parseStyles( | ||
result, | ||
newStyles, | ||
options, | ||
cb, | ||
importedFiles, | ||
ignoredAtRules, | ||
parsedAtImport.media, | ||
hashFiles | ||
) | ||
@@ -303,3 +403,2 @@ cb(atRule, parsedAtImport, newStyles, resolvedFilename) | ||
newStyles.nodes[0].before = newStyles.nodes[0].before || "\n" | ||
// newStyles.nodes[newStyles.nodes.length - 1].after = (newStyles.nodes[newStyles.nodes.length - 1].after || "") + "\n" | ||
} | ||
@@ -310,7 +409,9 @@ | ||
name: "media", | ||
params: parsedAtImport.media | ||
params: parsedAtImport.media, | ||
}) | ||
// keep AST clean | ||
newNodes.forEach(function(node) {node.parent = wrapper}) | ||
newNodes.forEach(function(node) { | ||
node.parent = wrapper | ||
}) | ||
wrapper.source = atRule.source | ||
@@ -331,3 +432,5 @@ | ||
// keep AST clean | ||
newNodes.forEach(function(node) {node.parent = atRule.parent}) | ||
newNodes.forEach(function(node) { | ||
node.parent = atRule.parent | ||
}) | ||
@@ -353,3 +456,3 @@ // replace atRule by imported nodes | ||
uri: matches[2], | ||
media: matches[3] ? matches[3] : null | ||
media: matches[3] ? matches[3] : null, | ||
} | ||
@@ -363,4 +466,6 @@ } | ||
*/ | ||
function resolveFilename(name, root, paths, source) { | ||
var dir = source && source.input && source.input.file ? path.dirname(path.resolve(root, source.input.file)) : root | ||
function resolveFilename(name, root, paths, source, resolver) { | ||
var dir = source && source.input && source.input.file | ||
? path.dirname(path.resolve(root, source.input.file)) | ||
: root | ||
@@ -376,7 +481,8 @@ try { | ||
return pkg | ||
} | ||
}, | ||
} | ||
var file | ||
resolver = resolver || resolve.sync | ||
try { | ||
file = resolve.sync(name, resolveOpts) | ||
file = resolver(name, resolveOpts) | ||
} | ||
@@ -388,11 +494,11 @@ catch (e) { | ||
try { | ||
file = resolve.sync("./" + name, resolveOpts) | ||
file = resolver("./" + name, resolveOpts) | ||
} | ||
catch (e) { | ||
catch (err) { | ||
// LAST HOPE | ||
if (!paths.some(function(dir) { | ||
file = path.join(dir, name) | ||
if (!paths.some(function(dir2) { | ||
file = path.join(dir2, name) | ||
return fs.existsSync(file) | ||
})) { | ||
throw e | ||
throw err | ||
} | ||
@@ -441,1 +547,7 @@ } | ||
} | ||
module.exports = postcss.plugin( | ||
"postcss-import", | ||
AtImport | ||
) | ||
module.exports.warnNodesMessage = warnNodesMessage |
{ | ||
"name": "postcss-import", | ||
"version": "5.2.2", | ||
"version": "6.0.0", | ||
"description": "PostCSS plugin to import CSS files", | ||
@@ -27,3 +27,4 @@ "keywords": [ | ||
"glob": "^5.0.1", | ||
"postcss": "^4.0.2", | ||
"object-assign": "^3.0.0", | ||
"postcss": "^4.1.4", | ||
"postcss-message-helpers": "^2.0.0", | ||
@@ -35,12 +36,8 @@ "resolve": "^1.0.0", | ||
"css-whitespace": "^1.1.0", | ||
"jscs": "^1.6.2", | ||
"jshint": "^2.5.6", | ||
"eslint": "^0.23.0", | ||
"tape": "^3.0.0" | ||
}, | ||
"scripts": { | ||
"jscs": "jscs .", | ||
"jshint": "jshint . --exclude-path .gitignore", | ||
"pretest": "npm run jscs && npm run jshint", | ||
"test": "tape test/*.js" | ||
"test": "eslint . && tape test" | ||
} | ||
} |
@@ -124,2 +124,9 @@ # postcss-import [![Travis Build Status](https://travis-ci.org/postcss/postcss-import.svg)](https://travis-ci.org/postcss/postcss-import) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/u8l6u3lr6s5u5tpi?svg=true)](https://ci.appveyor.com/project/MoOx/postcss-import) | ||
#### `resolve` | ||
Type: `Function` | ||
Default: `null` | ||
You can overwrite the default path resolving way by setting this option, using the `resolve.sync(id, opts)` signature that [resolve.sync](https://github.com/substack/node-resolve#resolvesyncid-opts) has. | ||
#### Example with some options | ||
@@ -126,0 +133,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22670
3
469
162
7
+ Addedobject-assign@^3.0.0
+ Addedobject-assign@3.0.0(transitive)
Updatedpostcss@^4.1.4