Skip to content

Typescript ESM forge.config.ts error #3671

@codec-xyz

Description

@codec-xyz

Pre-flight checklist

  • I have read the contribution documentation for this project.
  • I agree to follow the code of conduct that this project uses.
  • I have searched the issue tracker for a bug that matches the one I want to file, without success.

Electron Forge version

7.4.0

Electron version

v31.3.1

Operating system

Windows 11

Last known working Electron Forge version

No response

Expected behavior

To not get an error when using a Typescript ESM forge.config.ts.

Actual behavior

Error are listed under the steps to reproduce section.

Steps to reproduce

Run npm init electron-app@7.4.0 my-new-app -- --template=vite-typescript

Add "type": "module", to package.json

Note

To make other parts of the template work with "type": "module"

In vite.main.config change formats: ['cjs'], to formats: ['es'],

In vite.preload.config change format: 'cjs', to format: 'es',

In src/main.ts change

if (require('electron-squirrel-startup')) {
  app.quit();
}

			↓↓↓

import electronSquirrelStartup from 'electron-squirrel-startup';
if(electronSquirrelStartup) app.quit();

and replace __dirname with import.meta.dirname

You can also npm install --save-dev @types/electron-squirrel-startup and in tsconfig.json change "module": "commonjs","module": "ESNext", to make typescript happy.

Run npm run start

This result in this error...

› Must use import to load ES Module: C:\path\my-new-app\forge.config.ts
  require() of ES modules is not supported.
  require() of C:\path\my-new-app\forge.config.ts from C:\path\my-new-app\node_modules\@electron-forge\core\dist\util\forge-config.js is an ES
  module file as it is a .ts file whose nearest parent package.json contains "type": "module" which defines all .ts
  files in that package scope as ES modules.
  Instead change the requiring code to use import(), or remove "type": "module" from
  C:\path\my-new-app\package.json.

An unhandled rejection has occurred inside Forge:
Error: Must use import to load ES Module: C:\path\my-new-app\forge.config.ts
require() of ES modules is not supported.
require() of C:\path\my-new-app\forge.config.ts from C:\path\my-new-app\node_modules\@electron-forge\core\dist\util\forge-config.js is an ES module file as it is a .ts file whose nearest parent package.json contains "type": "module" which defines all .ts files in that package scope as ES modules.
Instead change the requiring code to use import(), or remove "type": "module" from C:\path\my-new-app\package.json.

However changing forge.config.ts to forge.config.js (and removing the type definitions) makes the error go away. So seemingly JS ES modules work but TS ES modules do not work.

Another option is changing the forge.config.ts to a forge.config.cts but it does not work with "module": "ESNext" (or other ES module options) in the tsconfig.json which gives the error...

  › Cannot use import statement outside a module

Failed to load: C:\path\my-new-app\forge.config.cts

An unhandled rejection has occurred inside Forge:
SyntaxError: Cannot use import statement outside a module

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions