Skip to content
This repository has been archived by the owner on Jan 13, 2022. It is now read-only.

Ignore specific module ids #77

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ Options:
-x, --extension <js | coffee | ...> File extension to assume when resolving module identifiers
--relativize Rewrite all module identifiers to be relative
--follow-requires Scan modules for required dependencies
--ignore-dependencies Ignore modules defined as dependencies in package.json
--ignore-node-core Ignore Node's core modules ('fs', 'events', etc.)
--cache-dir <directory> Alternate directory to use for disk cache
--no-cache-dir Disable the disk cache
--source-charset <utf8 | win1252 | ...> Charset of source (default: utf8)
Expand Down
41 changes: 33 additions & 8 deletions lib/commoner.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ function Commoner() {
Object.defineProperties(self, {
customVersion: { value: null, writable: true },
customOptions: { value: [] },
ignorePatterns: { value: [] },
resolvers: { value: [] },
processors: { value: [] }
});
Expand Down Expand Up @@ -69,6 +70,16 @@ Cp.process = function(processor) {
return this; // For chaining.
};

// Specify specific id patterns that should be ignored and not processed
Cp.ignore = function() {
each.call(arguments, function(pattern) {
assert.ok(pattern instanceof RegExp, "ignore pattern must be a regular expression");
this.ignorePatterns.push(pattern);
}, this);

return this; // For chaining.
};

Cp.buildP = function(options, roots) {
var self = this;
var sourceDir = options.sourceDir;
Expand Down Expand Up @@ -119,18 +130,28 @@ Cp.buildP = function(options, roots) {

context.setCacheDirectory(self.cacheDir);

context.setIgnoreDependencies(self.ignoreDependencies);
context.setFollowRequires(self.followRequires);

context.setRelativize(self.relativize);

context.setUseProvidesModule(self.useProvidesModule);

if (self.ignoreDependencies) {
self.ignorePatterns.push(util.makeDepsIgnorePattern());
}

if (self.ignoreNodeCore) {
self.ignorePatterns.push(util.makeCoreIgnorePattern());
}

context.setIgnorePatterns(self.ignorePatterns);

return new ModuleReader(
context,
self.resolvers,
self.processors
).readMultiP(context.expandIdsOrGlobsP(roots))
.then(context.ignoreDependencies ? pass : collectDepsP)
.then(context.followRequires ? collectRequiresP : pass)
.then(outputModules)
.then(outputDir ? printModuleIds : pass)
.then(finish, function(err) {
Expand All @@ -156,7 +177,7 @@ function pass(modules) {
return modules;
}

function collectDepsP(rootModules) {
function collectRequiresP(rootModules) {
var modules = [];
var seenIds = {};

Expand Down Expand Up @@ -212,6 +233,8 @@ function cliBuildP(commoner, version) {
"File extension to assume when resolving module identifiers")
.option("--relativize", "Rewrite all module identifiers to be relative")
.option("--follow-requires", "Scan modules for required dependencies")
.option("--ignore-dependencies", "Ignore modules defined as dependencies in package.json")
.option("--ignore-node-core", "Ignore Node's core modules ('fs', 'events', etc.)")
.option("--use-provides-module", "Respect @providesModules pragma in files")
.option("--cache-dir <directory>", "Alternate directory to use for disk cache")
.option("--no-cache-dir", "Disable the disk cache")
Expand All @@ -232,7 +255,9 @@ function cliBuildP(commoner, version) {
// variables is preferable to passing them as arguments.
commoner.preferredFileExtension = pfe;
commoner.watch = options.watch;
commoner.ignoreDependencies = !options.followRequires;
commoner.followRequires = options.followRequires;
commoner.ignoreDependencies = options.ignoreDependencies;
commoner.ignoreNodeCore = options.ignoreNodeCore;
commoner.relativize = options.relativize;
commoner.useProvidesModule = options.useProvidesModule;
commoner.sourceCharset = normalizeCharset(options.sourceCharset);
Expand All @@ -258,8 +283,8 @@ function cliBuildP(commoner, version) {
roots = ["<stdin>"];
commoner.forceResolve("<stdin>", util.readFromStdinP());

// Ignore dependencies because we wouldn't know how to find them.
commoner.ignoreDependencies = true;
// Don't follow requires because we wouldn't know how to find them.
commoner.followRequires = false;

} else {
var first = absolutePath(workingDir, args[0]);
Expand All @@ -275,8 +300,8 @@ function cliBuildP(commoner, version) {
util.readFileP(first, commoner.sourceCharset)
);

// Ignore dependencies because we wouldn't know how to find them.
commoner.ignoreDependencies = true;
// Don't follow requires because we wouldn't know how to find them.
commoner.followRequires = false;

} else if (stats.isDirectory(first)) {
sourceDir = first;
Expand Down
15 changes: 12 additions & 3 deletions lib/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,14 @@ BCp.spawnP = function(command, args, kwargs) {
return deferred.promise;
};

BCp.setIgnoreDependencies = function(value) {
Object.defineProperty(this, "ignoreDependencies", {
BCp.setFollowRequires = function(value) {
Object.defineProperty(this, "followRequires", {
value: !!value
});
};

// This default can be overridden by individual BuildContext instances.
BCp.setIgnoreDependencies(false);
BCp.setFollowRequires(true);

BCp.setRelativize = function(value) {
Object.defineProperty(this, "relativize", {
Expand All @@ -109,6 +109,15 @@ BCp.setUseProvidesModule = function(value) {
// This default can be overridden by individual BuildContext instances.
BCp.setUseProvidesModule(false);

BCp.setIgnorePatterns = function(ignorePatterns) {
Object.defineProperty(this, "ignorePatterns", {
value: ignorePatterns || []
});
};

// This default can be overridden by individual BuildContext instances.
BCp.setIgnorePatterns([]);

BCp.setCacheDirectory = function(dir) {
if (!dir) {
// Disable the cache directory.
Expand Down
15 changes: 14 additions & 1 deletion lib/reader.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ function ModuleReader(context, resolvers, processors) {
resolvers = hashCallbacks("resolvers", resolvers, warnMissingModule);

var procArgs = [processors];
if (context.relativize && !context.ignoreDependencies)
if (context.relativize && context.followRequires)
procArgs.push(require("./relative").getProcessor(self));
processors = hashCallbacks("processors", procArgs);

Expand Down Expand Up @@ -215,11 +215,24 @@ ModuleReader.prototype = {

readMultiP: function(ids) {
var reader = this;
var ignorePatterns = reader.context.ignorePatterns;

return Q(ids).all().then(function(ids) {
if (ids.length === 0)
return ids; // Shortcut.

if (ignorePatterns.length) {
ids = ids.filter(function(id) {
for (var i = 0; i < ignorePatterns.length; i++) {
if (ignorePatterns[i].test(id)) {
return false;
}
}

return true;
});
}

var modulePs = ids.map(reader.readModuleP, reader);
return Q(modulePs).all().then(function(modules) {
var seen = {};
Expand Down
8 changes: 8 additions & 0 deletions lib/relative.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ Rp.absolutizeP = function(moduleId, requiredId) {
};

Rp.relativizeP = function(moduleId, requiredId) {
var ignorePatterns = this.reader && this.reader.context.ignorePatterns || [];

for (var i = 0; i < ignorePatterns.length; i++) {
if (ignorePatterns[i].test(requiredId)) {
return Q(requiredId);
}
}

return this.absolutizeP(
moduleId,
requiredId
Expand Down
19 changes: 19 additions & 0 deletions lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var Q = require("q");
var createHash = require("crypto").createHash;
var mkdirp = require("mkdirp");
var iconv = require("iconv-lite");
var findup = require('findup-sync');
var Ap = Array.prototype;
var slice = Ap.slice;
var join = Ap.join;
Expand Down Expand Up @@ -368,3 +369,21 @@ function camelize(hyphenated) {
});
}
exports.camelize = camelize;

function makeIgnorePattern(modules) {
return new RegExp("^(" + modules.join('|') + ")(\\/|$)");
}
exports.makeIgnorePattern = makeIgnorePattern;

function makeDepsIgnorePattern() {
var packageInfo = require(findup("package.json"));
var deps = Object.keys(packageInfo.dependencies || {});
var devDeps = Object.keys(packageInfo.devDependencies || {});
return makeIgnorePattern(deps.concat(devDeps));
}
exports.makeDepsIgnorePattern = makeDepsIgnorePattern;

function makeCoreIgnorePattern() {
return makeIgnorePattern(require("repl")._builtinLibs);
}
exports.makeCoreIgnorePattern = makeCoreIgnorePattern;
1 change: 1 addition & 0 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ function defCallback(name) {
defCallback("version");
defCallback("resolve");
defCallback("process");
defCallback("ignore");
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"mkdirp": "~0.5.0",
"private": "~0.1.6",
"install": "~0.1.7",
"iconv-lite": "~0.4.5"
"iconv-lite": "~0.4.5",
"findup-sync": "~0.2.1"
},
"devDependencies": {
"mocha": "~2.0.1"
Expand Down
15 changes: 11 additions & 4 deletions test/run.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ function getNewContext(options) {
context.setCacheDirectory(path.join(outputDir, options.cacheDirectory));
context.setRelativize(options.relative === undefined || options.relative);
context.setUseProvidesModule(options.useProvidesModule === undefined || options.useProvidesModule );
context.setIgnorePatterns(options.ignorePatterns || [ /ignored/, /^react[\/$]/, util.makeDepsIgnorePattern(), util.makeCoreIgnorePattern() ]);
return context;
}

Expand Down Expand Up @@ -76,11 +77,17 @@ function checkHome(assert, home) {
assert.strictEqual(home.id, "home");
assert.strictEqual(typeof home.source, "string");
assert.notEqual(home.source.indexOf("exports"), -1);
assert.strictEqual(home.source.indexOf('require("./assert");'), 0);
assert.strictEqual(home.source.indexOf('require("./myassert");'), 0);
assert.notEqual(home.source.indexOf('require("ignored-module");'), -1);
assert.notEqual(home.source.indexOf('require("react/addons");'), -1);
assert.notEqual(home.source.indexOf('require("recast");'), -1);
assert.notEqual(home.source.indexOf('require("recast/lib/types");'), -1);
assert.notEqual(home.source.indexOf('require("mocha");'), -1);
assert.notEqual(home.source.indexOf('require("fs");'), -1);
return home;
}).invoke("getRequiredP").then(function(reqs) {
assert.strictEqual(reqs.length, 1);
assert.strictEqual(reqs[0].id, "assert");
assert.strictEqual(reqs[0].id, "myassert");
});
}

Expand Down Expand Up @@ -401,7 +408,7 @@ describe("canonical module identifiers", function() {

it("should replace non-canonical required identifiers", function(done) {
function helperP(context) {
assert.strictEqual(context.ignoreDependencies, false);
assert.strictEqual(context.followRequires, true);

var reader = new ModuleReader(context, [
getProvidedP,
Expand All @@ -422,7 +429,7 @@ describe("canonical module identifiers", function() {
), 2);

assert.strictEqual(strCount(
'require("../assert")',
'require("../myassert")',
follow.source
), 2);
});
Expand Down
7 changes: 0 additions & 7 deletions test/source/assert.js

This file was deleted.

15 changes: 12 additions & 3 deletions test/source/home.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
require("assert");
require("./assert");
require("./tests/../assert");
require("myassert");
require("./myassert");
require("./tests/../myassert");

require("ignored-module");
require("react/addons"); // also ignored

require("recast"); // defined as dependency in package.json
require("recast/lib/types");
require("mocha"); // a dev dependency

require("fs"); // node built-in

exports.name = "home";
7 changes: 7 additions & 0 deletions test/source/myassert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function myassert(test, msg) {
if (!test) {
throw new Error(msg);
}
}

module.exports = myassert.ok = myassert;
6 changes: 3 additions & 3 deletions test/source/widget/follow.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ require("../WidgetShare");
require("../widget/gallery");
require("./gallery");

// These both become "../assert".
require("assert");
require("../assert");
// These both become "../myassert".
require("myassert");
require("../myassert");

// These circular references should both become "./follow".
require("./follow");
Expand Down