Skip to content

node:module registerHooks resolve context.conditions is Array or Set #59003

@richterdennis

Description

@richterdennis

Version

v22.17.0

Platform

Microsoft Windows NT 10.0.26100.0 x64 

Subsystem

module

What steps will reproduce the bug?

Create these files:

// ModuleA.cjs const os = require('node:os'); module.exports = { hello() { console.log('Hello Folks from', os.platform()); } };
// ModuleB.cjs const ModuleA = require('./ModuleA.cjs'); module.exports = { hello() { ModuleA.hello(); } };
// ModuleC.mjs import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); const ModuleB = require('./ModuleB.cjs'); export default { hello() { ModuleB.hello(); } };
// index.mjs import module from 'node:module'; import { pathToFileURL } from 'node:url'; const basePath = pathToFileURL(process.cwd()).toString(); module.registerHooks({ resolve(specifier, context, nextResolve) { console.log( 'context.conditions is', Object.prototype.toString.call(context.conditions), '-', context.parentURL.replace(basePath, '.'), context.conditions?.has?.('require') && 'required' || context.conditions?.includes?.('import') && 'imported', specifier, ); return nextResolve(specifier, context); }, }); const { default: ModuleC } = await import('./ModuleC.mjs'); ModuleC.hello();

Then do:

node index.mjs 

Result:

context.conditions is [object Array] - ./index.mjs imported ./ModuleC.mjs context.conditions is [object Array] - ./ModuleC.mjs imported node:module context.conditions is [object Set] - ./ModuleC.mjs required ./ModuleB.cjs context.conditions is [object Set] - ./ModuleB.cjs required ./ModuleA.cjs context.conditions is [object Set] - ./ModuleA.cjs required node:os Hello Folks from win32 

How often does it reproduce? Is there a required condition?

Consistent every time

What is the expected behavior? Why is that the expected behavior?

context.conditions should be always a Set or an Array

What do you see instead?

context.conditions is a Set if it comes from a require call and it is an Array if it comes from an import statement

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugIssues with confirmed bugs.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions