Skip to content

Commit

Permalink
fix: ensure the hooked module exports has @@toStringTag property
Browse files Browse the repository at this point in the history
The README example says the Hook callback `exported` arg is
"effectively `import * as exported from ${url}`".
https://tc39.es/ecma262/#sec-module-namespace-objects specs that
a Module Namespace Object has a @@toStringTag property with value
"Module" and no constructor.

Fixes: nodejs#57
  • Loading branch information
trentm committed Mar 28, 2024
1 parent c3c2c52 commit ad9a842
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
3 changes: 2 additions & 1 deletion hook.js
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,8 @@ import { register } from '${iitmURL}'
${imports.join('\n')}
const namespaces = [${namespaces.join(', ')}]
const _ = {}
// Mimic a Module object (https://tc39.es/ecma262/#sec-module-namespace-objects).
const _ = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } })
const set = {}
const primary = namespaces.shift()
Expand Down
25 changes: 25 additions & 0 deletions test/hook/module-toStringTag.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2.0 License.
//
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2021 Datadog, Inc.

import Hook from '../../index.js'
import { foo as fooMjs } from '../fixtures/something.mjs'
import { foo as fooJs } from '../fixtures/something.js'
import { strictEqual, deepStrictEqual } from 'assert'

let hookedExports

Hook((exports, name) => {
hookedExports = exports;
})

fooMjs
fooJs

strictEqual(hookedExports[Symbol.toStringTag], 'Module')
deepStrictEqual(Object.getOwnPropertyDescriptor(hookedExports, Symbol.toStringTag), {
value: 'Module',
enumerable: false,
writable: false,
configurable: false
})

0 comments on commit ad9a842

Please sign in to comment.