File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 77 ObjectSetPrototypeOf,
88 SafeArrayIterator,
99 SafeSet,
10+ StringPrototypeStartsWith,
11+ StringPrototypeSlice,
1012} = primordials ;
1113
1214const binding = internalBinding ( 'mksnapshot' ) ;
@@ -96,23 +98,29 @@ function supportedInUserSnapshot(id) {
9698}
9799
98100function requireForUserSnapshot ( id ) {
99- if ( ! BuiltinModule . canBeRequiredByUsers ( id ) ) {
101+ let normalizedId = id ;
102+ if ( StringPrototypeStartsWith ( id , 'node:' ) ) {
103+ normalizedId = StringPrototypeSlice ( id , 5 ) ;
104+ }
105+ if ( ! BuiltinModule . canBeRequiredByUsers ( normalizedId ) ||
106+ ( id !== normalizedId &&
107+ ! BuiltinModule . canBeRequiredWithoutScheme ( normalizedId ) ) ) {
100108 // eslint-disable-next-line no-restricted-syntax
101109 const err = new Error (
102110 `Cannot find module '${ id } '. ` ,
103111 ) ;
104112 err . code = 'MODULE_NOT_FOUND' ;
105113 throw err ;
106114 }
107- if ( ! supportedInUserSnapshot ( id ) ) {
108- if ( ! warnedModules . has ( id ) ) {
115+ if ( ! supportedInUserSnapshot ( normalizedId ) ) {
116+ if ( ! warnedModules . has ( normalizedId ) ) {
109117 process . emitWarning (
110118 `built-in module ${ id } is not yet supported in user snapshots` ) ;
111- warnedModules . add ( id ) ;
119+ warnedModules . add ( normalizedId ) ;
112120 }
113121 }
114122
115- return require ( id ) ;
123+ return require ( normalizedId ) ;
116124}
117125
118126function main ( ) {
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments