Skip to content

Commit

Permalink
test,esm: validate more edge cases for dynamic imports
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
aduh95 authored and juanarbol committed Jan 31, 2023
1 parent 2ab35cf commit 3269423
Show file tree
Hide file tree
Showing 8 changed files with 139 additions and 1 deletion.
92 changes: 91 additions & 1 deletion test/es-module/test-esm-loader-hooks.mjs
Expand Up @@ -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',
Expand All @@ -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);
});
});
});
@@ -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);
}
@@ -0,0 +1,7 @@
'use strict';

const neverSettlingDynamicImport = import('never-settle-load');

console.log('should be output');

neverSettlingDynamicImport.then(() => process.exit(1));
@@ -0,0 +1,5 @@
const neverSettlingDynamicImport = import('never-settle-load');

console.log('should be output');

await neverSettlingDynamicImport;
@@ -0,0 +1,7 @@
'use strict';

const neverSettlingDynamicImport = import('never-settle-resolve');

console.log('should be output');

neverSettlingDynamicImport.then(() => process.exit(1));
@@ -0,0 +1,5 @@
const neverSettlingDynamicImport = import('never-settle-resolve');

console.log('should be output');

await neverSettlingDynamicImport;
@@ -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));
@@ -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);

0 comments on commit 3269423

Please sign in to comment.