Skip to content

Commit 3269423

Browse files
aduh95juanarbol
authored andcommitted
test,esm: validate more edge cases for dynamic imports
PR-URL: #46059 Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Jacob Smith <jacob@frende.me> Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Minwoo Jung <nodecorelab@gmail.com>
1 parent 2ab35cf commit 3269423

File tree

8 files changed

+139
-1
lines changed

8 files changed

+139
-1
lines changed

test/es-module/test-esm-loader-hooks.mjs

+91-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import assert from 'node:assert';
44
import { execPath } from 'node:process';
55
import { describe, it } from 'node:test';
66

7-
describe('Loader hooks', () => {
7+
describe('Loader hooks', { concurrency: true }, () => {
88
it('are called with all expected arguments', async () => {
99
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
1010
'--no-warnings',
@@ -23,4 +23,94 @@ describe('Loader hooks', () => {
2323
assert.match(lines[2], /{"url":"file:\/\/\/.*\/experimental\.json","format":"test","shortCircuit":true}/);
2424
assert.match(lines[3], /{"source":{"type":"Buffer","data":\[.*\]},"format":"json","shortCircuit":true}/);
2525
});
26+
27+
describe('should handle never-settling hooks in ESM files', { concurrency: true }, () => {
28+
it('top-level await of a never-settling resolve', async () => {
29+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
30+
'--no-warnings',
31+
'--experimental-loader',
32+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
33+
fixtures.path('es-module-loaders/never-settling-resolve-step/never-resolve.mjs'),
34+
]);
35+
36+
assert.strictEqual(stderr, '');
37+
assert.match(stdout, /^should be output\r?\n$/);
38+
assert.strictEqual(code, 13);
39+
assert.strictEqual(signal, null);
40+
});
41+
42+
it('top-level await of a never-settling load', async () => {
43+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
44+
'--no-warnings',
45+
'--experimental-loader',
46+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
47+
fixtures.path('es-module-loaders/never-settling-resolve-step/never-load.mjs'),
48+
]);
49+
50+
assert.strictEqual(stderr, '');
51+
assert.match(stdout, /^should be output\r?\n$/);
52+
assert.strictEqual(code, 13);
53+
assert.strictEqual(signal, null);
54+
});
55+
56+
57+
it('top-level await of a race of never-settling hooks', async () => {
58+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
59+
'--no-warnings',
60+
'--experimental-loader',
61+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
62+
fixtures.path('es-module-loaders/never-settling-resolve-step/race.mjs'),
63+
]);
64+
65+
assert.strictEqual(stderr, '');
66+
assert.match(stdout, /^true\r?\n$/);
67+
assert.strictEqual(code, 0);
68+
assert.strictEqual(signal, null);
69+
});
70+
});
71+
72+
describe('should handle never-settling hooks in CJS files', { concurrency: true }, () => {
73+
it('never-settling resolve', async () => {
74+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
75+
'--no-warnings',
76+
'--experimental-loader',
77+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
78+
fixtures.path('es-module-loaders/never-settling-resolve-step/never-resolve.cjs'),
79+
]);
80+
81+
assert.strictEqual(stderr, '');
82+
assert.match(stdout, /^should be output\r?\n$/);
83+
assert.strictEqual(code, 0);
84+
assert.strictEqual(signal, null);
85+
});
86+
87+
88+
it('never-settling load', async () => {
89+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
90+
'--no-warnings',
91+
'--experimental-loader',
92+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
93+
fixtures.path('es-module-loaders/never-settling-resolve-step/never-load.cjs'),
94+
]);
95+
96+
assert.strictEqual(stderr, '');
97+
assert.match(stdout, /^should be output\r?\n$/);
98+
assert.strictEqual(code, 0);
99+
assert.strictEqual(signal, null);
100+
});
101+
102+
it('race of never-settling hooks', async () => {
103+
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
104+
'--no-warnings',
105+
'--experimental-loader',
106+
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
107+
fixtures.path('es-module-loaders/never-settling-resolve-step/race.cjs'),
108+
]);
109+
110+
assert.strictEqual(stderr, '');
111+
assert.match(stdout, /^true\r?\n$/);
112+
assert.strictEqual(code, 0);
113+
assert.strictEqual(signal, null);
114+
});
115+
});
26116
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export function resolve(specifier, context, next) {
2+
if (specifier === 'never-settle-resolve') return new Promise(() => {});
3+
if (specifier === 'never-settle-load') return { __proto__: null, shortCircuit: true, url: 'never-settle:///' };
4+
return next(specifier, context);
5+
}
6+
7+
export function load(url, context, next) {
8+
if (url === 'never-settle:///') return new Promise(() => {});
9+
return next(url, context);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
const neverSettlingDynamicImport = import('never-settle-load');
4+
5+
console.log('should be output');
6+
7+
neverSettlingDynamicImport.then(() => process.exit(1));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const neverSettlingDynamicImport = import('never-settle-load');
2+
3+
console.log('should be output');
4+
5+
await neverSettlingDynamicImport;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
const neverSettlingDynamicImport = import('never-settle-resolve');
4+
5+
console.log('should be output');
6+
7+
neverSettlingDynamicImport.then(() => process.exit(1));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const neverSettlingDynamicImport = import('never-settle-resolve');
2+
3+
console.log('should be output');
4+
5+
await neverSettlingDynamicImport;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
Promise.race([
4+
import('never-settle-resolve'),
5+
import('never-settle-load'),
6+
import('node:process'),
7+
]).then(result => console.log(result.default === process));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const result = await Promise.race([
2+
import('never-settle-resolve'),
3+
import('never-settle-load'),
4+
import('node:process'),
5+
]);
6+
7+
console.log(result.default === process);

0 commit comments

Comments
 (0)