diff --git a/filtered-hook.mjs b/filtered-hook.mjs new file mode 100644 index 0000000..de9f72e --- /dev/null +++ b/filtered-hook.mjs @@ -0,0 +1,6 @@ +import { createHook } from './hook.js' +import path from 'path' + +const { load, resolve, getFormat, getSource } = createHook(import.meta, new Set([path.join(import.meta.url, '../test/fixtures/export-types/default-expression-array.mjs').replace(':/', ':///')])) + +export { load, resolve, getFormat, getSource } diff --git a/hook.js b/hook.js index 38a0b83..59102aa 100644 --- a/hook.js +++ b/hook.js @@ -229,7 +229,8 @@ function addIitm (url) { } // moduleList is an optional Set specifiying which modules need IITM patching -// if moduleList is not set, IITM patches everything +// moduleList contains full file paths +// if moduleList is empty, IITM patches everything function createHook (meta, moduleList = new Set()) { async function resolve (specifier, context, parentResolve) { const { parentURL = '' } = context @@ -243,6 +244,11 @@ function createHook (meta, moduleList = new Set()) { return { url: url.url, format: 'commonjs' } } + // early return if + if (moduleList.size && !moduleList.has(url.url) && url.url.startsWith('file:///')) { + return { url: url.url, format: url.format } + } + if (isIitm(parentURL, meta) || hasIitm(parentURL)) { return url } @@ -265,7 +271,6 @@ function createHook (meta, moduleList = new Set()) { const iitmURL = new URL('lib/register.js', meta.url).toString() async function getSource (url, context, parentGetSource) { - if (moduleList.size && !moduleList.has(url)) return parentGetSource(url, context, parentGetSource) if (hasIitm(url)) { const realUrl = deleteIitm(url) const { imports, namespaces, setters: mapSetters } = await processModule({ diff --git a/test/generic-loader.mjs b/test/generic-loader.mjs index 8d02761..2893a3c 100644 --- a/test/generic-loader.mjs +++ b/test/generic-loader.mjs @@ -4,6 +4,7 @@ import * as tsLoader from './typescript/iitm-ts-node-loader.mjs' import * as regularLoader from '../hook.mjs' +import * as filteredLoader from '../filtered-hook.mjs' import path from 'path' const filename = process.env.IITM_TEST_FILE @@ -11,4 +12,5 @@ const filename = process.env.IITM_TEST_FILE export const { load, resolve, getFormat, getSource } = filename.includes('disabled') ? {} - : (path.extname(filename).slice(-2) === 'ts' ? tsLoader : regularLoader) + : (path.extname(filename).slice(-2) === 'ts' ? tsLoader : + filename.endsWith('filtered-export.mjs') ? filteredLoader: regularLoader) diff --git a/test/hook/filtered-export.mjs b/test/hook/filtered-export.mjs new file mode 100644 index 0000000..a286cd2 --- /dev/null +++ b/test/hook/filtered-export.mjs @@ -0,0 +1,19 @@ +// 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 a from '../fixtures/export-types/default-expression-array.mjs' +import n from '../fixtures/export-types/default-expression-num.mjs' +import { strictEqual } from 'assert' + +Hook((exports, name) => { + if (name.match(/default-expression-array\.m?js/)) { + exports.default[0] += 1 + } else if (name.match(/default-expression-num\.m?js/)) { + exports.default += 1 + } +}) + +strictEqual(a[0], 2) +strictEqual(n, 1)