diff --git a/index.js b/index.js index 98edec9..66131c1 100644 --- a/index.js +++ b/index.js @@ -239,9 +239,10 @@ const Module = module.exports = exports = class Module { } let { - imports = null, - protocol = this._protocolFor(specifier, this._protocols['file:']), referrer = null, + protocol = this._protocolFor(specifier, this._protocols['file:']), + imports = null, + builtins = null, dynamic = false, main = referrer ? referrer._main : null, type = 0, @@ -270,22 +271,26 @@ const Module = module.exports = exports = class Module { const module = this._cache[specifier] = new this(specifier) - module._defaultType = defaultType - module._main = main || module - module._info = this._loadPackageManifest(path.dirname(module._filename), protocol) + if (builtins && specifier in builtins) { + module._exports = builtins[specifier] + } else { + module._defaultType = defaultType + module._main = main || module + module._info = this._loadPackageManifest(path.dirname(module._filename), protocol) - let extension = this._extensionFor(type) || path.extname(specifier) + let extension = this._extensionFor(type) || path.extname(specifier) - if (extension in this._extensions === false) { - if (defaultType) extension = this._extensionFor(defaultType) || '.js' - else extension = '.js' - } + if (extension in this._extensions === false) { + if (defaultType) extension = this._extensionFor(defaultType) || '.js' + else extension = '.js' + } - if (extension === '.bundle' && path.extname(specifier) !== extension) { - throw errors.INVALID_BUNDLE_EXTENSION(`Invalid extension for bundle '${specifier}'`) - } + if (extension === '.bundle' && path.extname(specifier) !== extension) { + throw errors.INVALID_BUNDLE_EXTENSION(`Invalid extension for bundle '${specifier}'`) + } - this._extensions[extension].call(this, module, source, referrer, protocol, imports) + this._extensions[extension].call(this, module, source, referrer, protocol, imports) + } return this._transform(module, referrer, dynamic) } @@ -320,9 +325,10 @@ const Module = module.exports = exports = class Module { } let { - imports = null, - protocol = this._protocols['file:'], referrer = null, + protocol = this._protocols['file:'], + imports = null, + builtins = null, conditions = ['import', 'require', 'bare', 'node'] } = opts @@ -344,7 +350,7 @@ const Module = module.exports = exports = class Module { }) } - const [resolved = null] = this._resolve(specifier, dirname, protocol, imports, conditions) + const [resolved = null] = this._resolve(specifier, dirname, protocol, imports, builtins, conditions) if (resolved === null) { let msg = `Cannot find module '${specifier}'` @@ -357,7 +363,7 @@ const Module = module.exports = exports = class Module { return protocol.postresolve(resolved, dirname) } - static * _resolve (specifier, dirname, protocol, imports, conditions) { + static * _resolve (specifier, dirname, protocol, imports, builtins, conditions) { const info = this._loadPackageManifest(dirname, protocol) specifier = this._mapConditionalSpecifier( @@ -372,6 +378,8 @@ const Module = module.exports = exports = class Module { yield * protocol.resolve(specifier, dirname, imports) + if (builtins && specifier in builtins) yield specifier + if (path.isAbsolute(specifier)) { yield * this._resolveFile(specifier, protocol) yield * this._resolveDirectory(specifier, protocol, conditions) @@ -783,7 +791,8 @@ Module._protocols['file:'] = new Protocol({ }, postresolve (specifier) { - return binding.realpath(specifier) + if (path.isAbsolute(specifier)) return binding.realpath(specifier) + return specifier }, exists (filename) { diff --git a/test.js b/test.js index 8c25ca8..a5334ee 100644 --- a/test.js +++ b/test.js @@ -1361,6 +1361,17 @@ test('imports in node_modules', (t) => { Module.load('/node_modules/foo/foo.js', { protocol }) }) +test('builtins', (t) => { + t.teardown(onteardown) + + const builtins = { + foo: 42 + } + + t.is(Module.resolve('foo', { builtins }), 'foo') + t.is(Module.load('foo', { builtins }).exports, 42) +}) + test('load file that cannot be read', async (t) => { t.teardown(onteardown)