module: fix for #17130 shared loader cjs dep
PR-URL: https://github.com/nodejs/node/pull/17131 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Bradley Farias <bradley.meck@gmail.com>
This commit is contained in:
parent
c2d738db80
commit
1f5ee33dcb
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const internalCJSModule = require('internal/module');
|
const internalCJSModule = require('internal/module');
|
||||||
|
const CJSModule = require('module');
|
||||||
const internalURLModule = require('internal/url');
|
const internalURLModule = require('internal/url');
|
||||||
const internalFS = require('internal/fs');
|
const internalFS = require('internal/fs');
|
||||||
const NativeModule = require('native_module');
|
const NativeModule = require('native_module');
|
||||||
@ -35,11 +36,19 @@ loaders.set('esm', async (url) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Strategy for loading a node-style CommonJS module
|
// Strategy for loading a node-style CommonJS module
|
||||||
|
const isWindows = process.platform === 'win32';
|
||||||
|
const winSepRegEx = /\//g;
|
||||||
loaders.set('cjs', async (url) => {
|
loaders.set('cjs', async (url) => {
|
||||||
|
const pathname = internalURLModule.getPathFromURL(new URL(url));
|
||||||
|
const module = CJSModule._cache[
|
||||||
|
isWindows ? pathname.replace(winSepRegEx, '\\') : pathname];
|
||||||
|
if (module && module.loaded) {
|
||||||
|
const ctx = createDynamicModule(['default'], url, undefined);
|
||||||
|
ctx.reflect.exports.default.set(module.exports);
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
return createDynamicModule(['default'], url, (reflect) => {
|
return createDynamicModule(['default'], url, (reflect) => {
|
||||||
debug(`Loading CJSModule ${url}`);
|
debug(`Loading CJSModule ${url}`);
|
||||||
const CJSModule = require('module');
|
|
||||||
const pathname = internalURLModule.getPathFromURL(new URL(url));
|
|
||||||
CJSModule._load(pathname);
|
CJSModule._load(pathname);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -39,6 +39,9 @@ const experimentalModules = !!process.binding('config').experimentalModules;
|
|||||||
|
|
||||||
const errors = require('internal/errors');
|
const errors = require('internal/errors');
|
||||||
|
|
||||||
|
module.exports = Module;
|
||||||
|
|
||||||
|
// these are below module.exports for the circular reference
|
||||||
const Loader = require('internal/loader/Loader');
|
const Loader = require('internal/loader/Loader');
|
||||||
const ModuleJob = require('internal/loader/ModuleJob');
|
const ModuleJob = require('internal/loader/ModuleJob');
|
||||||
const { createDynamicModule } = require('internal/loader/ModuleWrap');
|
const { createDynamicModule } = require('internal/loader/ModuleWrap');
|
||||||
@ -72,7 +75,6 @@ function Module(id, parent) {
|
|||||||
this.loaded = false;
|
this.loaded = false;
|
||||||
this.children = [];
|
this.children = [];
|
||||||
}
|
}
|
||||||
module.exports = Module;
|
|
||||||
|
|
||||||
const builtinModules = Object.keys(NativeModule._source)
|
const builtinModules = Object.keys(NativeModule._source)
|
||||||
.filter(NativeModule.nonInternalExists);
|
.filter(NativeModule.nonInternalExists);
|
||||||
|
7
test/es-module/test-esm-shared-loader-dep.mjs
Normal file
7
test/es-module/test-esm-shared-loader-dep.mjs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// Flags: --experimental-modules --loader ./test/fixtures/es-module-loaders/loader-shared-dep.mjs
|
||||||
|
/* eslint-disable required-modules */
|
||||||
|
import assert from 'assert';
|
||||||
|
import './test-esm-ok.mjs';
|
||||||
|
import dep from '../fixtures/es-module-loaders/loader-dep.js';
|
||||||
|
|
||||||
|
assert.strictEqual(dep.format, 'esm');
|
7
test/fixtures/es-module-loaders/loader-shared-dep.mjs
vendored
Normal file
7
test/fixtures/es-module-loaders/loader-shared-dep.mjs
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import dep from './loader-dep.js';
|
||||||
|
import assert from 'assert';
|
||||||
|
|
||||||
|
export function resolve(specifier, base, defaultResolve) {
|
||||||
|
assert.equal(dep.format, 'esm');
|
||||||
|
return defaultResolve(specifier, base);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user