From ad9a842b891b4c4e7fbfbedc0ee91ee157d7108a Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Thu, 28 Mar 2024 15:42:25 -0700 Subject: [PATCH] fix: ensure the hooked module exports has @@toStringTag property 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: #57 --- hook.js | 3 ++- test/hook/module-toStringTag.mjs | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/hook/module-toStringTag.mjs diff --git a/hook.js b/hook.js index aa22356..79a2e5b 100644 --- a/hook.js +++ b/hook.js @@ -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() diff --git a/test/hook/module-toStringTag.mjs b/test/hook/module-toStringTag.mjs new file mode 100644 index 0000000..639835b --- /dev/null +++ b/test/hook/module-toStringTag.mjs @@ -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 +})