Skip to content

Vite+pnpm Cannot find @electron-toolkit/utils #3880

Closed
@paulm17

Description

@paulm17

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.

Forge version

7.7.0

Electron version

35.0.1

Operating system

mac 15.2

Last known working Forge version

No response

Expected behavior

Image

forge.config.ts

import type { ForgeConfig } from '@electron-forge/shared-types';
import { MakerSquirrel } from '@electron-forge/maker-squirrel';
import { MakerZIP } from '@electron-forge/maker-zip';
import { MakerDeb } from '@electron-forge/maker-deb';
import { MakerRpm } from '@electron-forge/maker-rpm';
import { VitePlugin } from '@electron-forge/plugin-vite';
import { FusesPlugin } from '@electron-forge/plugin-fuses';
import { FuseV1Options, FuseVersion } from '@electron/fuses';

const config: ForgeConfig = {
  packagerConfig: {
    asar: true,
  },
  rebuildConfig: {},
  makers: [new MakerSquirrel({}), new MakerZIP({}, ['darwin']), new MakerRpm({}), new MakerDeb({})],
  plugins: [
    new VitePlugin({
      // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc.
      // If you are familiar with Vite configuration, it will look really familiar.
      build: [
        {
          // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`.
          entry: './out/main/index.js',
          config: 'vite.main.config.ts',
          target: 'main',
        },
        {
          entry: './out/preload/index.js',
          config: 'vite.preload.config.ts',
          target: 'preload',
        },
      ],
      renderer: [
        {
          name: 'main_window',
          config: 'vite.renderer.config.ts',
        },
      ],
    }),
    // Fuses are used to enable/disable various Electron functionality
    // at package time, before code signing the application
    new FusesPlugin({
      version: FuseVersion.V1,
      [FuseV1Options.RunAsNode]: false,
      [FuseV1Options.EnableCookieEncryption]: true,
      [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
      [FuseV1Options.EnableNodeCliInspectArguments]: false,
      [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
      [FuseV1Options.OnlyLoadAppFromAsar]: true,
    }),
  ],
};

export default config;

vite.renderer.config.ts

import { join, resolve } from "path";
import { extendTheme, pigment } from "@stylefusion/vite-plugin";
import { TanStackRouterVite } from "@tanstack/router-plugin/vite";
import react from "@vitejs/plugin-react";
import { config } from "dotenv";
// import { defineConfig, externalizeDepsPlugin } from "electron-vite";
import { NgmiPolyfill } from "vite-plugin-ngmi-polyfill";
import svgr from "vite-plugin-svgr";
import { getPigmentCSSTheme } from "@raikou/system";

// Load environment variables
config({ path: "../../.env" });

const { cssTheme, rawTheme } = getPigmentCSSTheme();

const theme = extendTheme({
  cssVarPrefix: "raikou",
  getSelector: (colorScheme) =>
    colorScheme ? `[data-raikou-color-scheme="${colorScheme}"]` : ":root",
  ...cssTheme,
});

import { defineConfig } from 'vite';
import path from 'path';

// https://vitejs.dev/config
export default defineConfig({  
  build: {
    rollupOptions: {
      input: join(__dirname, "src/renderer/index.html")
    },
    sourcemap: false,
  },
  define: {
    "process.env": process.env,
  },
  optimizeDeps: {
    include: [
      "prop-types", 
      "react-is", 
      "hoist-non-react-statics", 
      "html-react-parser",
    ],
  },
  plugins: [
    NgmiPolyfill({
      nodeGlobalsOptions: {
        process: true,
      },
    }),
    pigment({
      atomic: false,
      theme,
      rawTheme,
      transformLibraries: [
        "@raikou/core",
        "@raikou/system",
        "@raikou/emotion",
        "@raikou/dates",
        "@raikou/dropzone",  
        "@acme/form"        
      ],
    }),
    react(),
    svgr({
      include: "**/*.svg",
    }),
    TanStackRouterVite({
      routesDirectory: join(__dirname, "./src/renderer/src/routes"),
      generatedRouteTree: join(__dirname, "./src/renderer/src/routeTree.gen.ts"),
    }),
  ],
  publicDir: join(__dirname, "src/renderer/src/public"),
  resolve: {
    alias: {
      "@renderer": resolve("src/renderer/src"),
    },
  },
});

package.json

{
  "name": "electron-app",
  "version": "1.0.0",
  "description": "An Electron application with React and TypeScript",
  "_main": "./out/main/index.js",
  "main": "./.vite/build/index.js",
  "author": "example.com",
  "homepage": "https://electron-vite.org",
  "scripts": {
    "format": "prettier --write .",
    "lint": "eslint --cache .",
    "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
    "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
    "typecheck": "npm run typecheck:node && npm run typecheck:web",
    "start": "electron-forge start",
    "_dev": "electron-vite dev",
    "dev": "rimraf node_modules/.vite; npx electron-vite dev",
    "build": "rimraf node_modules/.vite; npm run typecheck && electron-vite build",
    "postinstall": "electron-builder install-app-deps",
    "build:unpack": "npm run build && electron-builder --dir",
    "build:win": "npm run build && electron-builder --win",
    "build:mac2": "electron-builder --config electron-builder.js --mac",
    "build:mac": "electron-vite build && electron-builder --mac",
    "build:linux": "electron-vite build && electron-builder --linux",
    "package": "electron-forge package",
    "make": "NODE_ENV=production DEBUG=electron-packager electron-forge make"
  },
  "dependencies": {
    "@acme/auth": "workspace:*",
    "@acme/fontawesomeicon": "workspace:*",
    "@acme/form": "workspace:*",
    "@acme/pm2": "workspace:*",
    "@electron-toolkit/preload": "^3.0.1",
    "@electron-toolkit/utils": "^4.0.0",
    "electron-squirrel-startup": "^1.0.1",
    "@raikou/core": "^0.0.27",
    "@raikou/emotion": "^0.0.27",
    "@raikou/hooks": "^0.0.27",
    "@raikou/ripple": "^0.0.27",
    "@raikou/system": "^0.0.27",
    "@tanstack/react-query": "^5.67.3",
    "@tanstack/react-router": "^1.114.15"
  },
  "devDependencies": {
    "@electron-forge/cli": "^7.7.0",
    "@electron-forge/maker-deb": "^7.7.0",
    "@electron-forge/maker-rpm": "^7.7.0",
    "@electron-forge/maker-squirrel": "^7.7.0",
    "@electron-forge/maker-zip": "^7.7.0",
    "@electron-forge/plugin-auto-unpack-natives": "^7.7.0",
    "@electron-forge/plugin-fuses": "^7.7.0",
    "@electron-forge/plugin-vite": "^7.7.0",
    "@electron/fuses": "^1.8.0",
    "@electron-toolkit/eslint-config-prettier": "^3.0.0",
    "@electron-toolkit/eslint-config-ts": "^3.0.0",
    "@electron-toolkit/tsconfig": "^1.0.1",
    "@stylefusion/vite-plugin": "^0.0.28",
    "@tanstack/router-devtools": "^1.114.15",
    "@tanstack/router-plugin": "^1.114.15",
    "@types/node": "^22.13.4",
    "@types/react": "^18.3.18",
    "@types/react-dom": "^18.3.5",
    "@vitejs/plugin-react": "^4.3.4",
    "electron": "35.0.1",
    "electron-builder": "^25.1.8",
    "electron-vite": "^3.0.0",
    "eslint": "^9.20.1",
    "eslint-plugin-react": "^7.37.4",
    "eslint-plugin-react-hooks": "^5.1.0",
    "eslint-plugin-react-refresh": "^0.4.19",
    "prettier": "^3.5.1",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "typescript": "^5.7.3",
    "vite": "^6.1.0",
    "vite-plugin-ngmi-polyfill": "^0.0.2",
    "vite-plugin-svgr": "^4.3.0"
  }
}

Actual behavior

The app should work!

Steps to reproduce

pnpm + vite repo.

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions