1// Flags: --experimental-loader ./test/fixtures/es-module-loaders/hooks-custom.mjs 2import '../common/index.mjs'; 3import assert from 'assert'; 4 5 6await assert.rejects( 7 import('nonexistent/file.mjs'), 8 { code: 'ERR_MODULE_NOT_FOUND' }, 9); 10 11await assert.rejects( 12 import('../fixtures/es-modules/file.unknown'), 13 { code: 'ERR_UNKNOWN_FILE_EXTENSION' }, 14); 15 16await assert.rejects( 17 import('esmHook/badReturnVal.mjs'), 18 { code: 'ERR_INVALID_RETURN_VALUE' }, 19); 20 21// Nullish values are allowed; booleans are not 22await assert.rejects( 23 import('esmHook/format.false'), 24 { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, 25); 26await assert.rejects( 27 import('esmHook/format.true'), 28 { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, 29); 30 31await assert.rejects( 32 import('esmHook/badReturnFormatVal.mjs'), 33 { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, 34); 35 36await assert.rejects( 37 import('esmHook/unsupportedReturnFormatVal.mjs'), 38 { code: 'ERR_UNKNOWN_MODULE_FORMAT' }, 39); 40 41await assert.rejects( 42 import('esmHook/badReturnSourceVal.mjs'), 43 { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, 44); 45 46await import('../fixtures/es-module-loaders/js-as-esm.js') 47.then((parsedModule) => { 48 assert.strictEqual(typeof parsedModule, 'object'); 49 assert.strictEqual(parsedModule.namedExport, 'named-export'); 50}); 51 52// The custom loader tells node .ext files are MJS 53await import('../fixtures/es-modules/file.ext') 54.then((parsedModule) => { 55 assert.strictEqual(typeof parsedModule, 'object'); 56 const { default: defaultExport } = parsedModule; 57 assert.strictEqual(typeof defaultExport, 'function'); 58 assert.strictEqual(defaultExport.name, 'iAmReal'); 59 assert.strictEqual(defaultExport(), true); 60}); 61 62// The custom loader's resolve hook predetermines the format 63await import('esmHook/preknownFormat.pre') 64.then((parsedModule) => { 65 assert.strictEqual(typeof parsedModule, 'object'); 66 assert.strictEqual(parsedModule.default, 'hello world'); 67}); 68 69// The custom loader provides source even though file does not actually exist 70await import('esmHook/virtual.mjs') 71.then((parsedModule) => { 72 assert.strictEqual(typeof parsedModule, 'object'); 73 assert.strictEqual(typeof parsedModule.default, 'undefined'); 74 assert.strictEqual(parsedModule.message, 'WOOHOO!'); 75}); 76 77// Ensure custom loaders have separate context from userland 78// hooks-custom.mjs also increments count (which starts at 0) 79// if both share context, count here would be 2 80await import('../fixtures/es-modules/stateful.mjs') 81.then(({ default: count }) => { 82 assert.strictEqual(count(), 1); 83}); 84