summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/internal/bootstrap/realm.js14
-rw-r--r--lib/internal/main/mksnapshot.js13
-rw-r--r--lib/internal/util/embedding.js11
-rw-r--r--test/fixtures/sea.js17
4 files changed, 39 insertions, 16 deletions
diff --git a/lib/internal/bootstrap/realm.js b/lib/internal/bootstrap/realm.js
index c8cdaeff7d..9dc0aee751 100644
--- a/lib/internal/bootstrap/realm.js
+++ b/lib/internal/bootstrap/realm.js
@@ -285,6 +285,20 @@ class BuiltinModule {
return canBeRequiredByUsersWithoutSchemeList.has(id);
}
+ static normalizeRequirableId(id) {
+ let normalizedId = id;
+ if (StringPrototypeStartsWith(id, 'node:')) {
+ normalizedId = StringPrototypeSlice(id, 5);
+ }
+
+ if (!BuiltinModule.canBeRequiredByUsers(normalizedId) ||
+ (id === normalizedId && !BuiltinModule.canBeRequiredWithoutScheme(normalizedId))) {
+ return undefined;
+ }
+
+ return normalizedId;
+ }
+
static isBuiltin(id) {
return BuiltinModule.canBeRequiredWithoutScheme(id) || (
typeof id === 'string' &&
diff --git a/lib/internal/main/mksnapshot.js b/lib/internal/main/mksnapshot.js
index 376639ef91..2a9b5d9851 100644
--- a/lib/internal/main/mksnapshot.js
+++ b/lib/internal/main/mksnapshot.js
@@ -7,12 +7,10 @@ const {
ObjectSetPrototypeOf,
SafeArrayIterator,
SafeSet,
- StringPrototypeStartsWith,
- StringPrototypeSlice,
} = primordials;
const binding = internalBinding('mksnapshot');
-const { BuiltinModule } = require('internal/bootstrap/realm');
+const { BuiltinModule: { normalizeRequirableId } } = require('internal/bootstrap/realm');
const {
getEmbedderEntryFunction,
compileSerializeMain,
@@ -98,13 +96,8 @@ function supportedInUserSnapshot(id) {
}
function requireForUserSnapshot(id) {
- let normalizedId = id;
- if (StringPrototypeStartsWith(id, 'node:')) {
- normalizedId = StringPrototypeSlice(id, 5);
- }
- if (!BuiltinModule.canBeRequiredByUsers(normalizedId) ||
- (id !== normalizedId &&
- !BuiltinModule.canBeRequiredWithoutScheme(normalizedId))) {
+ const normalizedId = normalizeRequirableId(id);
+ if (!normalizedId) {
// eslint-disable-next-line no-restricted-syntax
const err = new Error(
`Cannot find module '${id}'. `,
diff --git a/lib/internal/util/embedding.js b/lib/internal/util/embedding.js
index 139d4c7a25..e2e6720247 100644
--- a/lib/internal/util/embedding.js
+++ b/lib/internal/util/embedding.js
@@ -1,5 +1,6 @@
'use strict';
const { codes: { ERR_UNKNOWN_BUILTIN_MODULE } } = require('internal/errors');
+const { BuiltinModule: { normalizeRequirableId } } = require('internal/bootstrap/realm');
const { Module, wrapSafe } = require('internal/modules/cjs/loader');
// This is roughly the same as:
@@ -36,12 +37,12 @@ function embedderRunCjs(contents) {
customDirname);
}
-function embedderRequire(path) {
- if (!Module.isBuiltin(path)) {
- throw new ERR_UNKNOWN_BUILTIN_MODULE(path);
+function embedderRequire(id) {
+ const normalizedId = normalizeRequirableId(id);
+ if (!normalizedId) {
+ throw new ERR_UNKNOWN_BUILTIN_MODULE(id);
}
-
- return require(path);
+ return require(normalizedId);
}
module.exports = { embedderRequire, embedderRunCjs };
diff --git a/test/fixtures/sea.js b/test/fixtures/sea.js
index efdc32708b..2cd82c709e 100644
--- a/test/fixtures/sea.js
+++ b/test/fixtures/sea.js
@@ -9,8 +9,23 @@ expectWarning('ExperimentalWarning',
'Single executable application is an experimental feature and ' +
'might change at any time');
+// Should be possible to require core modules that optionally require the
+// "node:" scheme.
const { deepStrictEqual, strictEqual, throws } = require('assert');
-const { dirname } = require('path');
+const { dirname } = require('node:path');
+
+// Should be possible to require a core module that requires using the "node:"
+// scheme.
+{
+ const { test } = require('node:test');
+ strictEqual(typeof test, 'function');
+}
+
+// Should not be possible to require a core module without the "node:" scheme if
+// it requires using the "node:" scheme.
+throws(() => require('test'), {
+ code: 'ERR_UNKNOWN_BUILTIN_MODULE',
+});
deepStrictEqual(process.argv, [process.execPath, process.execPath, '-a', '--b=c', 'd']);