Skip to content

Commit 394c61c

Browse files
joyeecheungMoLow
authored andcommitted
bootstrap: support namespaced builtins in snapshot scripts
PR-URL: nodejs#47467 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent a24d72a commit 394c61c

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

lib/internal/main/mksnapshot.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const {
77
ObjectSetPrototypeOf,
88
SafeArrayIterator,
99
SafeSet,
10+
StringPrototypeStartsWith,
11+
StringPrototypeSlice,
1012
} = primordials;
1113

1214
const binding = internalBinding('mksnapshot');
@@ -95,23 +97,29 @@ function supportedInUserSnapshot(id) {
9597
}
9698

9799
function requireForUserSnapshot(id) {
98-
if (!BuiltinModule.canBeRequiredByUsers(id)) {
100+
let normalizedId = id;
101+
if (StringPrototypeStartsWith(id, 'node:')) {
102+
normalizedId = StringPrototypeSlice(id, 5);
103+
}
104+
if (!BuiltinModule.canBeRequiredByUsers(normalizedId) ||
105+
(id !== normalizedId &&
106+
!BuiltinModule.canBeRequiredWithoutScheme(normalizedId))) {
99107
// eslint-disable-next-line no-restricted-syntax
100108
const err = new Error(
101109
`Cannot find module '${id}'. `,
102110
);
103111
err.code = 'MODULE_NOT_FOUND';
104112
throw err;
105113
}
106-
if (!supportedInUserSnapshot(id)) {
107-
if (!warnedModules.has(id)) {
114+
if (!supportedInUserSnapshot(normalizedId)) {
115+
if (!warnedModules.has(normalizedId)) {
108116
process.emitWarning(
109117
`built-in module ${id} is not yet supported in user snapshots`);
110-
warnedModules.add(id);
118+
warnedModules.add(normalizedId);
111119
}
112120
}
113121

114-
return require(id);
122+
return require(normalizedId);
115123
}
116124

117125
function main() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
'use strict';
2+
3+
// This tests snapshot JS API using the example in the docs.
4+
5+
require('../common');
6+
const assert = require('assert');
7+
const { spawnSync } = require('child_process');
8+
const tmpdir = require('../common/tmpdir');
9+
const path = require('path');
10+
const fs = require('fs');
11+
12+
tmpdir.refresh();
13+
const blobPath = path.join(tmpdir.path, 'snapshot.blob');
14+
{
15+
// The list of modules supported in the snapshot is unstable, so just check
16+
// a few that are known to work.
17+
const code = `
18+
require("node:v8");
19+
require("node:fs");
20+
require("node:fs/promises");
21+
`;
22+
fs.writeFileSync(
23+
path.join(tmpdir.path, 'entry.js'),
24+
code,
25+
'utf8'
26+
);
27+
const child = spawnSync(process.execPath, [
28+
'--snapshot-blob',
29+
blobPath,
30+
'--build-snapshot',
31+
'entry.js',
32+
], {
33+
cwd: tmpdir.path
34+
});
35+
if (child.status !== 0) {
36+
console.log(child.stderr.toString());
37+
console.log(child.stdout.toString());
38+
assert.strictEqual(child.status, 0);
39+
}
40+
const stats = fs.statSync(path.join(tmpdir.path, 'snapshot.blob'));
41+
assert(stats.isFile());
42+
}

0 commit comments

Comments
 (0)