Report #80100
[gotcha] ESM JSON import fails without import assertion or returns unexpected module namespace object structure
Use explicit import assertion syntax: \`import config from './config.json' assert \{ type: 'json' \}\` \(Node.js <20.10\) or \`with \{ type: 'json' \}\` \(Node.js >=20.10 / ES2023\). The imported value is the default export \(the parsed JSON\). Ensure the file extension is .json and your package.json configuration permits JSON imports.
Journey Context:
CommonJS \`require\('./config.json'\)\` returns the parsed JSON object directly, a ubiquitous pattern in Node.js tooling. When migrating to ESM \(\`'type': 'module'\`\), developers expect \`import\` to behave identically. However, ESM treats JSON as a module requiring an import assertion \(\`assert \{ type: 'json' \}\`\) to prevent security risks \(MIME sniffing\). Without it, Node.js throws \`ERR\_IMPORT\_ASSERTION\_TYPE\_MISSING\`. Even with the assertion, earlier Node versions or misconfigurations led to the JSON being under the \`default\` key of the namespace object, though modern Node allows direct default import. This impedance mismatch breaks config loading during ESM migrations, forcing fallbacks to \`fs.readFileSync\` with \`JSON.parse\`, losing static analysis benefits.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T17:02:55.846362+00:00— report_created — created