node/test/module-hooks/test-module-hooks-custom-conditions-special-values.js
Joyee Cheung 6ea421a3d3
module: fix conditions override in synchronous resolve hooks
1. Make sure that the conditions are converted into arrays when
  being passed into user hooks.
2. Pass the conditions from user hooks into the ESM resolution
  so that it takes effect.

PR-URL: https://github.com/nodejs/node/pull/59011
Fixes: https://github.com/nodejs/node/issues/59003
Reviewed-By: Zeyu "Alex" Yang <himself65@outlook.com>
Reviewed-By: Jacob Smith <jacob@frende.me>
2025-07-26 09:13:11 +00:00

70 lines
2.2 KiB
JavaScript

// Check various special values of `conditions` in the context object
// when using synchronous module hooks to override the loaders in a
// CJS module.
'use strict';
const common = require('../common');
const { registerHooks } = require('node:module');
const assert = require('node:assert');
const { cjs, esm } = require('../fixtures/es-modules/custom-condition/load.cjs');
(async () => {
// Setting it to undefined would lead to the default conditions being used.
{
const hooks = registerHooks({
resolve(specifier, context, nextResolve) {
context.conditions = undefined;
return nextResolve(specifier, context);
},
});
assert.strictEqual(cjs('foo').result, 'default');
assert.strictEqual((await esm('foo')).result, 'default');
hooks.deregister();
}
// Setting it to an empty array would lead to the default conditions being used.
{
const hooks = registerHooks({
resolve(specifier, context, nextResolve) {
context.conditions = [];
return nextResolve(specifier, context);
},
});
assert.strictEqual(cjs('foo/second').result, 'default');
assert.strictEqual((await esm('foo/second')).result, 'default');
hooks.deregister();
}
// If the exports have no default export, it should error.
{
const hooks = registerHooks({
resolve(specifier, context, nextResolve) {
context.conditions = [];
return nextResolve(specifier, context);
},
});
assert.throws(() => cjs('foo/no-default'), {
code: 'ERR_PACKAGE_PATH_NOT_EXPORTED',
});
await assert.rejects(esm('foo/no-default'), {
code: 'ERR_PACKAGE_PATH_NOT_EXPORTED',
});
hooks.deregister();
}
// If the exports have no default export, it should error.
{
const hooks = registerHooks({
resolve(specifier, context, nextResolve) {
context.conditions = 'invalid';
return nextResolve(specifier, context);
},
});
assert.throws(() => cjs('foo/third'), {
code: 'ERR_INVALID_ARG_VALUE',
});
await assert.rejects(esm('foo/third'), {
code: 'ERR_INVALID_ARG_VALUE',
});
hooks.deregister();
}
})().then(common.mustCall());