8
8
ArrayPrototypeSome,
9
9
ObjectDefineProperty,
10
10
ObjectGetPrototypeOf,
11
+ ObjectPrototypeHasOwnProperty,
11
12
ObjectSetPrototypeOf,
12
13
ReflectApply,
13
14
SafePromiseAllReturnVoid,
@@ -43,6 +44,7 @@ const {
43
44
validateObject,
44
45
validateUint32,
45
46
validateString,
47
+ validateInternalField,
46
48
} = require ( 'internal/validators' ) ;
47
49
48
50
const binding = internalBinding ( 'module_wrap' ) ;
@@ -75,6 +77,13 @@ const kLink = Symbol('kLink');
75
77
76
78
const { isContext } = require ( 'internal/vm' ) ;
77
79
80
+ function isModule ( object ) {
81
+ if ( typeof object !== 'object' || object === null || ! ObjectPrototypeHasOwnProperty ( object , kWrap ) ) {
82
+ return false ;
83
+ }
84
+ return true ;
85
+ }
86
+
78
87
class Module {
79
88
constructor ( options ) {
80
89
emitExperimentalWarning ( 'VM Modules' ) ;
@@ -148,50 +157,38 @@ class Module {
148
157
}
149
158
150
159
get identifier ( ) {
151
- if ( this [ kWrap ] === undefined ) {
152
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
153
- }
160
+ validateInternalField ( this , kWrap , 'Module' ) ;
154
161
return this [ kWrap ] . url ;
155
162
}
156
163
157
164
get context ( ) {
158
- if ( this [ kWrap ] === undefined ) {
159
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
160
- }
165
+ validateInternalField ( this , kWrap , 'Module' ) ;
161
166
return this [ kContext ] ;
162
167
}
163
168
164
169
get namespace ( ) {
165
- if ( this [ kWrap ] === undefined ) {
166
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
167
- }
170
+ validateInternalField ( this , kWrap , 'Module' ) ;
168
171
if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
169
172
throw new ERR_VM_MODULE_STATUS ( 'must not be unlinked or linking' ) ;
170
173
}
171
174
return this [ kWrap ] . getNamespace ( ) ;
172
175
}
173
176
174
177
get status ( ) {
175
- if ( this [ kWrap ] === undefined ) {
176
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
177
- }
178
+ validateInternalField ( this , kWrap , 'Module' ) ;
178
179
return STATUS_MAP [ this [ kWrap ] . getStatus ( ) ] ;
179
180
}
180
181
181
182
get error ( ) {
182
- if ( this [ kWrap ] === undefined ) {
183
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
184
- }
183
+ validateInternalField ( this , kWrap , 'Module' ) ;
185
184
if ( this [ kWrap ] . getStatus ( ) !== kErrored ) {
186
185
throw new ERR_VM_MODULE_STATUS ( 'must be errored' ) ;
187
186
}
188
187
return this [ kWrap ] . getError ( ) ;
189
188
}
190
189
191
190
async link ( linker ) {
192
- if ( this [ kWrap ] === undefined ) {
193
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
194
- }
191
+ validateInternalField ( this , kWrap , 'Module' ) ;
195
192
validateFunction ( linker , 'linker' ) ;
196
193
if ( this . status === 'linked' ) {
197
194
throw new ERR_VM_MODULE_ALREADY_LINKED ( ) ;
@@ -204,10 +201,7 @@ class Module {
204
201
}
205
202
206
203
async evaluate ( options = kEmptyObject ) {
207
- if ( this [ kWrap ] === undefined ) {
208
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
209
- }
210
-
204
+ validateInternalField ( this , kWrap , 'Module' ) ;
211
205
validateObject ( options , 'options' ) ;
212
206
213
207
let timeout = options . timeout ;
@@ -230,9 +224,7 @@ class Module {
230
224
}
231
225
232
226
[ customInspectSymbol ] ( depth , options ) {
233
- if ( this [ kWrap ] === undefined ) {
234
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
235
- }
227
+ validateInternalField ( this , kWrap , 'Module' ) ;
236
228
if ( typeof depth === 'number' && depth < 0 )
237
229
return this ;
238
230
@@ -307,7 +299,7 @@ class SourceTextModule extends Module {
307
299
308
300
const promises = this [ kWrap ] . link ( async ( identifier , attributes ) => {
309
301
const module = await linker ( identifier , this , { attributes, assert : attributes } ) ;
310
- if ( module [ kWrap ] === undefined ) {
302
+ if ( ! isModule ( module ) ) {
311
303
throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
312
304
}
313
305
if ( module . context !== this . context ) {
@@ -338,19 +330,13 @@ class SourceTextModule extends Module {
338
330
}
339
331
340
332
get dependencySpecifiers ( ) {
341
- if ( this [ kWrap ] === undefined ) {
342
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
343
- }
344
- if ( this [ kDependencySpecifiers ] === undefined ) {
345
- this [ kDependencySpecifiers ] = this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
346
- }
333
+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
334
+ this [ kDependencySpecifiers ] ??= this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
347
335
return this [ kDependencySpecifiers ] ;
348
336
}
349
337
350
338
get status ( ) {
351
- if ( this [ kWrap ] === undefined ) {
352
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
353
- }
339
+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
354
340
if ( this . #error !== kNoError ) {
355
341
return 'errored' ;
356
342
}
@@ -361,9 +347,7 @@ class SourceTextModule extends Module {
361
347
}
362
348
363
349
get error ( ) {
364
- if ( this [ kWrap ] === undefined ) {
365
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
366
- }
350
+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
367
351
if ( this . #error !== kNoError ) {
368
352
return this . #error;
369
353
}
@@ -416,9 +400,7 @@ class SyntheticModule extends Module {
416
400
}
417
401
418
402
setExport ( name , value ) {
419
- if ( this [ kWrap ] === undefined ) {
420
- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
421
- }
403
+ validateInternalField ( this , kWrap , 'SyntheticModule' ) ;
422
404
validateString ( name , 'name' ) ;
423
405
if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
424
406
throw new ERR_VM_MODULE_STATUS ( 'must be linked' ) ;
@@ -433,7 +415,7 @@ function importModuleDynamicallyWrap(importModuleDynamically) {
433
415
if ( isModuleNamespaceObject ( m ) ) {
434
416
return m ;
435
417
}
436
- if ( ! m || m [ kWrap ] === undefined ) {
418
+ if ( ! isModule ( m ) ) {
437
419
throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
438
420
}
439
421
if ( m . status === 'errored' ) {
0 commit comments