0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-25 08:19:38 +01:00

test,esm: validate more edge cases for dynamic imports

PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
Antoine du Hamel 2023-01-04 14:52:23 +01:00 committed by GitHub
parent 198d2037f1
commit 9b1ed04f2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 139 additions and 1 deletions

View File

@ -4,7 +4,7 @@ import assert from 'node:assert';
import { execPath } from 'node:process';
import { describe, it } from 'node:test';
describe('Loader hooks', () => {
describe('Loader hooks', { concurrency: true }, () => {
it('are called with all expected arguments', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
@ -23,4 +23,94 @@ describe('Loader hooks', () => {
assert.match(lines[2], /{"url":"file:\/\/\/.*\/experimental\.json","format":"test","shortCircuit":true}/);
assert.match(lines[3], /{"source":{"type":"Buffer","data":\[.*\]},"format":"json","shortCircuit":true}/);
});
describe('should handle never-settling hooks in ESM files', { concurrency: true }, () => {
it('top-level await of a never-settling resolve', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/never-resolve.mjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^should be output\r?\n$/);
assert.strictEqual(code, 13);
assert.strictEqual(signal, null);
});
it('top-level await of a never-settling load', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/never-load.mjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^should be output\r?\n$/);
assert.strictEqual(code, 13);
assert.strictEqual(signal, null);
});
it('top-level await of a race of never-settling hooks', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/race.mjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^true\r?\n$/);
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
});
});
describe('should handle never-settling hooks in CJS files', { concurrency: true }, () => {
it('never-settling resolve', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/never-resolve.cjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^should be output\r?\n$/);
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
});
it('never-settling load', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/never-load.cjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^should be output\r?\n$/);
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
});
it('race of never-settling hooks', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--experimental-loader',
fixtures.fileURL('es-module-loaders/never-settling-resolve-step/loader.mjs'),
fixtures.path('es-module-loaders/never-settling-resolve-step/race.cjs'),
]);
assert.strictEqual(stderr, '');
assert.match(stdout, /^true\r?\n$/);
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
});
});
});

View File

@ -0,0 +1,10 @@
export function resolve(specifier, context, next) {
if (specifier === 'never-settle-resolve') return new Promise(() => {});
if (specifier === 'never-settle-load') return { __proto__: null, shortCircuit: true, url: 'never-settle:///' };
return next(specifier, context);
}
export function load(url, context, next) {
if (url === 'never-settle:///') return new Promise(() => {});
return next(url, context);
}

View File

@ -0,0 +1,7 @@
'use strict';
const neverSettlingDynamicImport = import('never-settle-load');
console.log('should be output');
neverSettlingDynamicImport.then(() => process.exit(1));

View File

@ -0,0 +1,5 @@
const neverSettlingDynamicImport = import('never-settle-load');
console.log('should be output');
await neverSettlingDynamicImport;

View File

@ -0,0 +1,7 @@
'use strict';
const neverSettlingDynamicImport = import('never-settle-resolve');
console.log('should be output');
neverSettlingDynamicImport.then(() => process.exit(1));

View File

@ -0,0 +1,5 @@
const neverSettlingDynamicImport = import('never-settle-resolve');
console.log('should be output');
await neverSettlingDynamicImport;

View File

@ -0,0 +1,7 @@
'use strict';
Promise.race([
import('never-settle-resolve'),
import('never-settle-load'),
import('node:process'),
]).then(result => console.log(result.default === process));

View File

@ -0,0 +1,7 @@
const result = await Promise.race([
import('never-settle-resolve'),
import('never-settle-load'),
import('node:process'),
]);
console.log(result.default === process);