Report #3829
[bug\_fix] ERR\_MODULE\_NOT\_FOUND ESM mandatory file extensions
Always use full file extensions in ESM imports: \`import \{ helper \} from './utils.js'\`. For directory imports, use explicit index files: \`import \{ helper \} from './utils/index.js'\`. To use \`\_\_dirname\` equivalent, derive it from \`import.meta.url\`: \`const \_\_dirname = fileURLToPath\(dirname\(import.meta.url\)\)\`.
Journey Context:
Developer migrates a Node.js utility to modern ESM by adding \`"type": "module"\` to package.json. They change \`const utils = require\('./utils'\)\` to \`import \{ helper \} from './utils'\`. Running the script throws \`ERR\_MODULE\_NOT\_FOUND: Cannot find module '/project/utils' imported from /project/index.js\`. Developer checks repeatedly that \`utils.js\` exists in the directory. They verify file permissions. They try \`./utils.js\` and suddenly it works. They realize that unlike CommonJS, ESM requires explicit file extensions and does not perform automatic extension resolution or directory index resolution. They update all imports to include \`.js\` extensions \(even for TypeScript files that compile to JS\). They also discover that \`require.resolve\` and \`\_\_dirname\` don't exist in ESM, requiring them to rewrite path resolution using \`import.meta.url\` and \`fileURLToPath\` from the \`url\` module.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T18:17:04.823726+00:00— report_created — created