summaryrefslogtreecommitdiff
path: root/lib/internal/modules
diff options
context:
space:
mode:
authorBradley Farias <bradley.meck@gmail.com>2019-07-18 09:01:59 -0500
committerBradley Farias <bradley.meck@gmail.com>2019-07-26 15:13:53 -0500
commit7e8ad9bad85f1ef6e400c7643e11d52405490b7b (patch)
tree99307350292a99770d40bee937408033dfc3e300 /lib/internal/modules
parent499533f72a2dce111d6fde9c21b90b51fff35ab6 (diff)
downloadandroid-node-v8-7e8ad9bad85f1ef6e400c7643e11d52405490b7b.tar.gz
android-node-v8-7e8ad9bad85f1ef6e400c7643e11d52405490b7b.tar.bz2
android-node-v8-7e8ad9bad85f1ef6e400c7643e11d52405490b7b.zip
policy: add dependencies map for resources
Adds a "dependencies" field to resources in policy manifest files. In order to ease development and testing while using manifests, wildcard values for both "dependencies" and "integrity" have been added using the boolean value "true" in the policy manifest. PR-URL: https://github.com/nodejs/node/pull/28767 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'lib/internal/modules')
-rw-r--r--lib/internal/modules/cjs/helpers.js62
-rw-r--r--lib/internal/modules/cjs/loader.js17
-rw-r--r--lib/internal/modules/esm/translators.js7
3 files changed, 70 insertions, 16 deletions
diff --git a/lib/internal/modules/cjs/helpers.js b/lib/internal/modules/cjs/helpers.js
index 71abcbf880..5e0e1b06ae 100644
--- a/lib/internal/modules/cjs/helpers.js
+++ b/lib/internal/modules/cjs/helpers.js
@@ -1,19 +1,72 @@
'use strict';
const { Object } = primordials;
+const {
+ ERR_MANIFEST_DEPENDENCY_MISSING,
+ ERR_UNKNOWN_BUILTIN_MODULE
+} = require('internal/errors').codes;
+const { NativeModule } = require('internal/bootstrap/loaders');
+const { getOptionValue } = require('internal/options');
+const experimentalModules = getOptionValue('--experimental-modules');
const { validateString } = require('internal/validators');
const path = require('path');
-const { pathToFileURL } = require('internal/url');
+const { pathToFileURL, fileURLToPath } = require('internal/url');
const { URL } = require('url');
+const debug = require('internal/util/debuglog').debuglog('module');
+
+function loadNativeModule(filename, request, experimentalModules) {
+ const mod = NativeModule.map.get(filename);
+ if (mod) {
+ debug('load native module %s', request);
+ mod.compileForPublicLoader(experimentalModules);
+ return mod;
+ }
+}
+
// Invoke with makeRequireFunction(module) where |module| is the Module object
// to use as the context for the require() function.
-function makeRequireFunction(mod) {
+// Use redirects to set up a mapping from a policy and restrict dependencies
+function makeRequireFunction(mod, redirects) {
const Module = mod.constructor;
- function require(path) {
- return mod.require(path);
+ let require;
+ if (redirects) {
+ const { map, reaction } = redirects;
+ const id = mod.filename || mod.id;
+ require = function require(path) {
+ let missing = true;
+ if (map === true) {
+ missing = false;
+ } else if (map.has(path)) {
+ const redirect = map.get(path);
+ if (redirect === true) {
+ missing = false;
+ } else if (typeof redirect === 'string') {
+ const parsed = new URL(redirect);
+ if (parsed.protocol === 'node:') {
+ const specifier = parsed.pathname;
+ const mod = loadNativeModule(
+ specifier,
+ redirect,
+ experimentalModules);
+ if (mod && mod.canBeRequiredByUsers) return mod.exports;
+ throw new ERR_UNKNOWN_BUILTIN_MODULE(specifier);
+ } else if (parsed.protocol === 'file:') {
+ return mod.require(fileURLToPath(parsed));
+ }
+ }
+ }
+ if (missing) {
+ reaction(new ERR_MANIFEST_DEPENDENCY_MISSING(id, path));
+ }
+ return mod.require(path);
+ };
+ } else {
+ require = function require(path) {
+ return mod.require(path);
+ };
}
function resolve(request, options) {
@@ -114,6 +167,7 @@ function normalizeReferrerURL(referrer) {
module.exports = {
addBuiltinLibsToObject,
builtinLibs,
+ loadNativeModule,
makeRequireFunction,
normalizeReferrerURL,
stripBOM,
diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
index c769ce535a..bdc0122590 100644
--- a/lib/internal/modules/cjs/loader.js
+++ b/lib/internal/modules/cjs/loader.js
@@ -46,6 +46,7 @@ const {
makeRequireFunction,
normalizeReferrerURL,
stripBOM,
+ loadNativeModule
} = require('internal/modules/cjs/helpers');
const { getOptionValue } = require('internal/options');
const preserveSymlinks = getOptionValue('--preserve-symlinks');
@@ -618,11 +619,8 @@ Module._load = function(request, parent, isMain) {
return cachedModule.exports;
}
- const mod = NativeModule.map.get(filename);
- if (mod && mod.canBeRequiredByUsers) {
- debug('load native module %s', request);
- return mod.compileForPublicLoader(experimentalModules);
- }
+ const mod = loadNativeModule(filename, request, experimentalModules);
+ if (mod && mod.canBeRequiredByUsers) return mod.exports;
// Don't call updateChildren(), Module constructor already does.
const module = new Module(filename, parent);
@@ -828,8 +826,11 @@ function wrapSafe(filename, content) {
// the file.
// Returns exception, if any.
Module.prototype._compile = function(content, filename) {
+ let moduleURL;
+ let redirects;
if (manifest) {
- const moduleURL = pathToFileURL(filename);
+ moduleURL = pathToFileURL(filename);
+ redirects = manifest.getRedirects(moduleURL);
manifest.assertIntegrity(moduleURL, content);
}
@@ -853,7 +854,7 @@ Module.prototype._compile = function(content, filename) {
}
}
const dirname = path.dirname(filename);
- const require = makeRequireFunction(this);
+ const require = makeRequireFunction(this, redirects);
var result;
const exports = this.exports;
const thisValue = exports;
@@ -942,7 +943,7 @@ function createRequireFromPath(filename) {
m.filename = proxyPath;
m.paths = Module._nodeModulePaths(m.path);
- return makeRequireFunction(m);
+ return makeRequireFunction(m, null);
}
Module.createRequireFromPath = deprecate(
diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js
index b1f2c9f259..584a330300 100644
--- a/lib/internal/modules/esm/translators.js
+++ b/lib/internal/modules/esm/translators.js
@@ -9,9 +9,9 @@ const {
StringPrototype
} = primordials;
-const { NativeModule } = require('internal/bootstrap/loaders');
const {
- stripBOM
+ stripBOM,
+ loadNativeModule
} = require('internal/modules/cjs/helpers');
const CJSModule = require('internal/modules/cjs/loader').Module;
const internalURLModule = require('internal/url');
@@ -93,11 +93,10 @@ translators.set('builtin', async function builtinStrategy(url) {
debug(`Translating BuiltinModule ${url}`);
// Slice 'node:' scheme
const id = url.slice(5);
- const module = NativeModule.map.get(id);
+ const module = loadNativeModule(id, url, true);
if (!module) {
throw new ERR_UNKNOWN_BUILTIN_MODULE(id);
}
- module.compileForPublicLoader(true);
return createDynamicModule(
[], [...module.exportKeys, 'default'], url, (reflect) => {
debug(`Loading BuiltinModule ${url}`);