Skip to content

Commit

Permalink
module: load source maps in commonjs translator
Browse files Browse the repository at this point in the history
PR-URL: #51033
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
privatenumber authored and richardlau committed Mar 25, 2024
1 parent b88170d commit 5fc10ca
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/internal/modules/esm/translators.js
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) {
// In case the source was not provided by the `load` step, we need fetch it now.
source = stringify(source ?? getSource(new URL(url)).source);

maybeCacheSourceMap(url, source);

const { exportNames, module } = cjsPreparseModuleExports(filename, source);
cjsCache.set(url, module);
const namesWithDefault = exportNames.has('default') ?
Expand Down
33 changes: 33 additions & 0 deletions test/es-module/test-esm-loader-hooks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,39 @@ describe('Loader hooks', { concurrency: true }, () => {
assert.strictEqual(signal, null);
});

it('should support source maps in commonjs translator', async () => {
const readFile = async () => {};
const hook = `
import { readFile } from 'node:fs/promises';
export ${
async function load(url, context, nextLoad) {
const resolved = await nextLoad(url, context);
if (context.format === 'commonjs') {
resolved.source = await readFile(new URL(url));
}
return resolved;
}
}`;

const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
'--enable-source-maps',
'--import',
`data:text/javascript,${encodeURIComponent(`
import{ register } from "node:module";
register(${
JSON.stringify('data:text/javascript,' + encodeURIComponent(hook))
});
`)}`,
fixtures.path('source-map/throw-on-require.js'),
]);

assert.strictEqual(stdout, '');
assert.match(stderr, /throw-on-require\.ts:9:9/);
assert.strictEqual(code, 1);
assert.strictEqual(signal, null);
});

it('should handle mixed of opt-in modules and non-opt-in ones', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings',
Expand Down

0 comments on commit 5fc10ca

Please sign in to comment.