Skip to content

Commit d1331fc

Browse files
joyeecheungmarco-ippolito
authored andcommitted
module: do not warn for typeless package.json when there isn't one
It was intended that warnings should only be emitted for an existing package.json without a type. This fixes a confusing warning telling users to update /package.json when there are no package.json on the lookup path at all, like this: [MODULE_TYPELESS_PACKAGE_JSON] Warning: ... parsed as an ES module because module syntax was detected; to avoid the performance penalty of syntax detection, add "type": "module" to /package.json Drive-by: update the warning message to be clear about reparsing and make it clear what's actionable. PR-URL: #54045 Backport-PR-URL: #56927 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Refs: #52697
1 parent 9916458 commit d1331fc

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

lib/internal/modules/esm/get_format.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ function underNodeModules(url) {
9595
}
9696

9797
let typelessPackageJsonFilesWarnedAbout;
98+
function warnTypelessPackageJsonFile(pjsonPath, url) {
99+
typelessPackageJsonFilesWarnedAbout ??= new SafeSet();
100+
if (!typelessPackageJsonFilesWarnedAbout.has(pjsonPath)) {
101+
const warning = `Module type of ${url} is not specified and it doesn't parse as CommonJS.\n` +
102+
'Reparsing as ES module because module syntax was detected. This incurs a performance overhead.\n' +
103+
`To eliminate this warning, add "type": "module" to ${pjsonPath}.`;
104+
process.emitWarning(warning, {
105+
code: 'MODULE_TYPELESS_PACKAGE_JSON',
106+
});
107+
typelessPackageJsonFilesWarnedAbout.add(pjsonPath);
108+
}
109+
}
110+
98111
/**
99112
* @param {URL} url
100113
* @param {{parentURL: string; source?: Buffer}} context
@@ -106,7 +119,7 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE
106119
const ext = extname(url);
107120

108121
if (ext === '.js') {
109-
const { type: packageType, pjsonPath } = getPackageScopeConfig(url);
122+
const { type: packageType, pjsonPath, exists: foundPackageJson } = getPackageScopeConfig(url);
110123
if (packageType !== 'none') {
111124
return packageType;
112125
}
@@ -127,18 +140,10 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE
127140
// For ambiguous files (no type field, .js extension) we return
128141
// undefined from `resolve` and re-run the check in `load`.
129142
const format = detectModuleFormat(source, url);
130-
if (format === 'module') {
143+
if (format === 'module' && foundPackageJson) {
131144
// This module has a .js extension, a package.json with no `type` field, and ESM syntax.
132145
// Warn about the missing `type` field so that the user can avoid the performance penalty of detection.
133-
typelessPackageJsonFilesWarnedAbout ??= new SafeSet();
134-
if (!typelessPackageJsonFilesWarnedAbout.has(pjsonPath)) {
135-
const warning = `${url} parsed as an ES module because module syntax was detected;` +
136-
` to avoid the performance penalty of syntax detection, add "type": "module" to ${pjsonPath}`;
137-
process.emitWarning(warning, {
138-
code: 'MODULE_TYPELESS_PACKAGE_JSON',
139-
});
140-
typelessPackageJsonFilesWarnedAbout.add(pjsonPath);
141-
}
146+
warnTypelessPackageJsonFile(pjsonPath, url);
142147
}
143148
return format;
144149
}

test/es-module/test-esm-detect-ambiguous.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,18 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL },
352352
});
353353
}
354354

355+
it('does not warn when there are no package.json', async () => {
356+
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
357+
fixtures.path('es-modules/loose.js'),
358+
]);
359+
360+
strictEqual(stderr, '');
361+
strictEqual(stdout, 'executed\n');
362+
strictEqual(code, 0);
363+
strictEqual(signal, null);
364+
});
365+
366+
355367
it('warns only once for a package.json that affects multiple files', async () => {
356368
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
357369
fixtures.path('es-modules/package-without-type/detected-as-esm.js'),

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy