Skip to content

Commit 5736dc4

Browse files
guybedfordMylesBorins
authored andcommitted
module: fix for #17130 shared loader cjs dep
PR-URL: #17131 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Timothy Gu <[email protected]> Reviewed-By: Bradley Farias <[email protected]>
1 parent 6624ac3 commit 5736dc4

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

lib/internal/loader/ModuleRequest.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const fs = require('fs');
44
const internalCJSModule = require('internal/module');
5+
const CJSModule = require('module');
56
const internalURLModule = require('internal/url');
67
const internalFS = require('internal/fs');
78
const NativeModule = require('native_module');
@@ -35,11 +36,19 @@ loaders.set('esm', async (url) => {
3536
});
3637

3738
// Strategy for loading a node-style CommonJS module
39+
const isWindows = process.platform === 'win32';
40+
const winSepRegEx = /\//g;
3841
loaders.set('cjs', async (url) => {
42+
const pathname = internalURLModule.getPathFromURL(new URL(url));
43+
const module = CJSModule._cache[
44+
isWindows ? pathname.replace(winSepRegEx, '\\') : pathname];
45+
if (module && module.loaded) {
46+
const ctx = createDynamicModule(['default'], url, undefined);
47+
ctx.reflect.exports.default.set(module.exports);
48+
return ctx;
49+
}
3950
return createDynamicModule(['default'], url, (reflect) => {
4051
debug(`Loading CJSModule ${url}`);
41-
const CJSModule = require('module');
42-
const pathname = internalURLModule.getPathFromURL(new URL(url));
4352
CJSModule._load(pathname);
4453
});
4554
});

lib/module.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ const experimentalModules = !!process.binding('config').experimentalModules;
3939

4040
const errors = require('internal/errors');
4141

42+
module.exports = Module;
43+
44+
// these are below module.exports for the circular reference
4245
const Loader = require('internal/loader/Loader');
4346
const ModuleJob = require('internal/loader/ModuleJob');
4447
const { createDynamicModule } = require('internal/loader/ModuleWrap');
@@ -72,7 +75,6 @@ function Module(id, parent) {
7275
this.loaded = false;
7376
this.children = [];
7477
}
75-
module.exports = Module;
7678

7779
const builtinModules = Object.keys(NativeModule._source)
7880
.filter(NativeModule.nonInternalExists);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Flags: --experimental-modules --loader ./test/fixtures/es-module-loaders/loader-shared-dep.mjs
2+
/* eslint-disable required-modules */
3+
import assert from 'assert';
4+
import './test-esm-ok.mjs';
5+
import dep from '../fixtures/es-module-loaders/loader-dep.js';
6+
7+
assert.strictEqual(dep.format, 'esm');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import dep from './loader-dep.js';
2+
import assert from 'assert';
3+
4+
export function resolve(specifier, base, defaultResolve) {
5+
assert.equal(dep.format, 'esm');
6+
return defaultResolve(specifier, base);
7+
}

0 commit comments

Comments
 (0)