MCPcopy Index your code
hub / github.com/nodejs/node / cjsPreparseModuleExports

Function cjsPreparseModuleExports

lib/internal/modules/esm/translators.js:421–467  ·  view source on GitHub ↗

* Pre-parses a CommonJS module's exports and re-exports. * @param {string} filename - The filename of the module. * @param {string} [source] - The source code of the module. * @param {string} [format] * @returns {{module: CJSModule, exportNames: string[]}}

(filename, source, format)

Source from the content-addressed store, hash-verified

419 * @returns {{module: CJSModule, exportNames: string[]}}
420 */
421function cjsPreparseModuleExports(filename, source, format) {
422 const module = cjsEmplaceModuleCacheEntry(filename);
423 if (module[kModuleExportNames] !== undefined) {
424 return { module, exportNames: module[kModuleExportNames] };
425 }
426
427 if (source === undefined) {
428 ({ source } = loadSourceForCJSWithHooks(module, filename, format));
429 }
430 module[kModuleSource] = source;
431
432 debug(`Preparsing exports of ${filename}`);
433 const { 0: exportNames, 1: reexports } = cjsParse(source);
434
435 // Set first for cycles.
436 module[kModuleExportNames] = exportNames;
437
438 // If there are any re-exports e.g. `module.exports = { ...require(...) }`,
439 // pre-parse the dependencies to find transitively exported names.
440 if (reexports.length) {
441 module.filename ??= filename;
442 module.paths ??= CJSModule._nodeModulePaths(dirname(filename));
443
444 for (let i = 0; i < reexports.length; i++) {
445 debug(`Preparsing re-exports of '${filename}'`);
446 const reexport = reexports[i];
447 let resolved;
448 let format;
449 try {
450 ({ format, filename: resolved } = resolveForCJSWithHooks(reexport, module, false, kShouldNotSkipModuleHooks));
451 } catch (e) {
452 debug(`Failed to resolve '${reexport}', skipping`, e);
453 continue;
454 }
455
456 if (format === 'commonjs' ||
457 (!BuiltinModule.normalizeRequirableId(resolved) && findLongestRegisteredExtension(resolved) === '.js')) {
458 const { exportNames: reexportNames } = cjsPreparseModuleExports(resolved, undefined, format);
459 for (const name of reexportNames) {
460 exportNames.add(name);
461 }
462 }
463 }
464 }
465
466 return { module, exportNames };
467}
468
469// Strategy for loading a node builtin CommonJS module that isn't
470// through normal resolution

Callers 1

createCJSModuleWrapFunction · 0.85

Calls 7

dirnameFunction · 0.85
resolveForCJSWithHooksFunction · 0.85
normalizeRequirableIdMethod · 0.80
addMethod · 0.65
debugFunction · 0.50

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…