From 82309e2fd570dd04230adeb8988c0d9668457c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Fri, 3 Mar 2023 20:40:29 +0800 Subject: [PATCH 01/23] feat(template): add vite-typescript template --- .../template/vite-typescript/.eslintignore | 1 + .../template/vite-typescript/package.json | 31 +++++++++ .../src/ViteTypeScriptTemplate.ts | 67 +++++++++++++++++++ .../vite-typescript/tmpl/.eslintrc.json | 16 +++++ .../vite-typescript/tmpl/forge.config.ts | 37 ++++++++++ .../template/vite-typescript/tmpl/main.ts | 58 ++++++++++++++++ .../vite-typescript/tmpl/package.json | 7 ++ .../template/vite-typescript/tmpl/preload.ts | 2 + .../template/vite-typescript/tmpl/renderer.ts | 31 +++++++++ .../vite-typescript/tmpl/tsconfig.json | 19 ++++++ .../vite-typescript/tmpl/vite.main.config.ts | 4 ++ .../tmpl/vite.preload.config.ts | 4 ++ .../tmpl/vite.renderer.config.ts | 4 ++ 13 files changed, 281 insertions(+) create mode 100644 packages/template/vite-typescript/.eslintignore create mode 100644 packages/template/vite-typescript/package.json create mode 100644 packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts create mode 100644 packages/template/vite-typescript/tmpl/.eslintrc.json create mode 100644 packages/template/vite-typescript/tmpl/forge.config.ts create mode 100644 packages/template/vite-typescript/tmpl/main.ts create mode 100644 packages/template/vite-typescript/tmpl/package.json create mode 100644 packages/template/vite-typescript/tmpl/preload.ts create mode 100644 packages/template/vite-typescript/tmpl/renderer.ts create mode 100644 packages/template/vite-typescript/tmpl/tsconfig.json create mode 100644 packages/template/vite-typescript/tmpl/vite.main.config.ts create mode 100644 packages/template/vite-typescript/tmpl/vite.preload.config.ts create mode 100644 packages/template/vite-typescript/tmpl/vite.renderer.config.ts diff --git a/packages/template/vite-typescript/.eslintignore b/packages/template/vite-typescript/.eslintignore new file mode 100644 index 0000000000..14e485a5bc --- /dev/null +++ b/packages/template/vite-typescript/.eslintignore @@ -0,0 +1 @@ +tmpl diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json new file mode 100644 index 0000000000..a9a2041430 --- /dev/null +++ b/packages/template/vite-typescript/package.json @@ -0,0 +1,31 @@ +{ + "name": "@electron-forge/template-vite-typescript", + "version": "6.1.0", + "description": "Vite-TypeScript template for Electron Forge, gets you started with Vite really quickly", + "repository": { + "type": "git", + "url": "https://github.com/electron/forge", + "directory": "packages/template/vite-typescript" + }, + "author": "caoxiemeihao", + "license": "MIT", + "main": "dist/ViteTypeScriptTemplate.js", + "typings": "dist/ViteTypeScriptTemplate.d.ts", + "scripts": { + "test": "mocha --config ../../../.mocharc.js test/**/*_spec_slow.ts" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "dependencies": { + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/template-base": "6.0.5", + "fs-extra": "^10.0.0" + }, + "devDependencies": { + "@electron-forge/core-utils": "6.0.5", + "@electron-forge/test-utils": "6.0.5", + "chai": "^4.3.3", + "fast-glob": "^3.2.7" + } +} diff --git a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts new file mode 100644 index 0000000000..09870da2b5 --- /dev/null +++ b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts @@ -0,0 +1,67 @@ +import path from 'path'; + +import { ForgeListrTaskDefinition, InitTemplateOptions } from '@electron-forge/shared-types'; +import { BaseTemplate } from '@electron-forge/template-base'; +import fs from 'fs-extra'; + +class ViteTypeScriptTemplate extends BaseTemplate { + public templateDir = path.resolve(__dirname, '..', 'tmpl'); + + public async initializeTemplate(directory: string, options: InitTemplateOptions): Promise { + const superTasks = await super.initializeTemplate(directory, options); + return [ + ...superTasks, + { + title: 'Setting up Forge configuration', + task: async () => { + await this.copyTemplateFile(directory, 'forge.config.ts'); + await fs.remove(path.resolve(directory, 'forge.config.js')); + }, + }, + { + title: 'Setting up Vite configuration', + task: async () => { + // Copy Vite files + await this.copyTemplateFile(directory, 'vite.main.config.ts'); + await this.copyTemplateFile(directory, 'vite.renderer.config.ts'); + await this.copyTemplateFile(directory, 'vite.preload.config.ts'); + + // Copy tsconfig with a small set of presets + await this.copyTemplateFile(directory, 'tsconfig.json'); + + // Copy eslint config with recommended settings + await this.copyTemplateFile(directory, '.eslintrc.json'); + + // Remove index.js and replace with index.ts + await fs.remove(path.join(directory, 'src', 'index.js')); + await this.copyTemplateFile(path.join(directory, 'src'), 'main.ts'); + + await this.copyTemplateFile(path.join(directory, 'src'), 'renderer.ts'); + + // Remove preload.js and replace with preload.ts + await fs.remove(path.join(directory, 'src', 'preload.js')); + await this.copyTemplateFile(path.join(directory, 'src'), 'preload.ts'); + + // TODO: Compatible with any path entry. + // Vite uses index.html under the root path as the entry point. + fs.moveSync(path.join(directory, 'src', 'index.html'), path.join(directory, 'index.html')); + await this.updateFileByLine(path.join(directory, 'index.html'), (line) => { + if (line.includes('link rel="stylesheet"')) return ''; + if (line.includes('')) return ' \n '; + return line; + }); + + // update package.json entry point + const pjPath = path.resolve(directory, 'package.json'); + const currentPJ = await fs.readJson(pjPath); + currentPJ.main = '.vite/build/main.js'; + await fs.writeJson(pjPath, currentPJ, { + spaces: 2, + }); + }, + }, + ]; + } +} + +export default new ViteTypeScriptTemplate(); diff --git a/packages/template/vite-typescript/tmpl/.eslintrc.json b/packages/template/vite-typescript/tmpl/.eslintrc.json new file mode 100644 index 0000000000..2d7aa60744 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/electron", + "plugin:import/typescript" + ], + "parser": "@typescript-eslint/parser" +} diff --git a/packages/template/vite-typescript/tmpl/forge.config.ts b/packages/template/vite-typescript/tmpl/forge.config.ts new file mode 100644 index 0000000000..ec2b06b858 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/forge.config.ts @@ -0,0 +1,37 @@ +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'; + +const config: ForgeConfig = { + packagerConfig: {}, + 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: 'src/main.ts', + config: 'vite.main.config.ts', + }, + { + entry: 'src/preload.ts', + config: 'vite.preload.config.ts', + }, + ], + renderer: [ + { + name: 'main_window', + config: 'vite.renderer.config.ts', + }, + ], + }), + ], +}; + +export default config; diff --git a/packages/template/vite-typescript/tmpl/main.ts b/packages/template/vite-typescript/tmpl/main.ts new file mode 100644 index 0000000000..2110ba0ff8 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/main.ts @@ -0,0 +1,58 @@ +import { app, BrowserWindow } from 'electron'; +import path from 'path'; +// This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Vite +// plugin that tells the Electron app where to look for the Vite-bundled app code (depending on +// whether you're running in development or production). +declare const MAIN_WINDOW_VITE_DEV_SERVER_URL: string; +declare const MAIN_WINDOW_VITE_NAME: string; + +// Handle creating/removing shortcuts on Windows when installing/uninstalling. +if (require('electron-squirrel-startup')) { + app.quit(); +} + +const createWindow = () => { + // Create the browser window. + const mainWindow = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + }, + }); + + // and load the index.html of the app. + if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { + mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL); + } else { + mainWindow.loadFile(path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`)); + } + + // Open the DevTools. + mainWindow.webContents.openDevTools(); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and import them here. diff --git a/packages/template/vite-typescript/tmpl/package.json b/packages/template/vite-typescript/tmpl/package.json new file mode 100644 index 0000000000..a3723d7136 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/package.json @@ -0,0 +1,7 @@ +{ + "devDependencies": { + "@electron-forge/plugin-vite": "ELECTRON_FORGE/VERSION", + "ts-node": "^10.0.0", + "typescript": "~4.5.4" + } +} diff --git a/packages/template/vite-typescript/tmpl/preload.ts b/packages/template/vite-typescript/tmpl/preload.ts new file mode 100644 index 0000000000..5e9d369cc9 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/preload.ts @@ -0,0 +1,2 @@ +// See the Electron documentation for details on how to use preload scripts: +// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/packages/template/vite-typescript/tmpl/renderer.ts b/packages/template/vite-typescript/tmpl/renderer.ts new file mode 100644 index 0000000000..d75993cde8 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/renderer.ts @@ -0,0 +1,31 @@ +/** + * This file will automatically be loaded by vite and run in the "renderer" context. + * To learn more about the differences between the "main" and the "renderer" context in + * Electron, visit: + * + * https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes + * + * By default, Node.js integration in this file is disabled. When enabling Node.js integration + * in a renderer process, please be aware of potential security implications. You can read + * more about security risks here: + * + * https://electronjs.org/docs/tutorial/security + * + * To enable Node.js integration in this file, open up `main.ts` and enable the `nodeIntegration` + * flag: + * + * ``` + * // Create the browser window. + * mainWindow = new BrowserWindow({ + * width: 800, + * height: 600, + * webPreferences: { + * nodeIntegration: true + * } + * }); + * ``` + */ + +import './index.css'; + +console.log('👋 This message is being logged by "renderer.ts", included via Vite'); diff --git a/packages/template/vite-typescript/tmpl/tsconfig.json b/packages/template/vite-typescript/tmpl/tsconfig.json new file mode 100644 index 0000000000..92db0d6da1 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES6", + "allowJs": true, + "module": "commonjs", + "skipLibCheck": true, + "esModuleInterop": true, + "noImplicitAny": true, + "sourceMap": true, + "baseUrl": ".", + "outDir": "dist", + "moduleResolution": "node", + "resolveJsonModule": true, + "paths": { + "*": ["node_modules/*"] + } + }, + "include": ["src/**/*"] +} diff --git a/packages/template/vite-typescript/tmpl/vite.main.config.ts b/packages/template/vite-typescript/tmpl/vite.main.config.ts new file mode 100644 index 0000000000..690be5b1a9 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/vite.main.config.ts @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config +export default defineConfig({}); diff --git a/packages/template/vite-typescript/tmpl/vite.preload.config.ts b/packages/template/vite-typescript/tmpl/vite.preload.config.ts new file mode 100644 index 0000000000..690be5b1a9 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/vite.preload.config.ts @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config +export default defineConfig({}); diff --git a/packages/template/vite-typescript/tmpl/vite.renderer.config.ts b/packages/template/vite-typescript/tmpl/vite.renderer.config.ts new file mode 100644 index 0000000000..690be5b1a9 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/vite.renderer.config.ts @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config +export default defineConfig({}); From e9cfca294847ff5f09a48dcc92533fcd75e00876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sat, 4 Mar 2023 16:45:41 +0800 Subject: [PATCH 02/23] faet: add test for vite-typescript template --- .../test/ViteTypeScriptTemplate_spec_slow.ts | 93 +++++++++++++++++++ .../vite-typescript/tmpl/forge.config.ts | 2 +- .../vite-typescript/tmpl/package.json | 6 +- 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts new file mode 100644 index 0000000000..c3b4e5e170 --- /dev/null +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -0,0 +1,93 @@ +import path from 'path'; + +import { yarnOrNpmSpawn } from '@electron-forge/core-utils'; +import * as testUtils from '@electron-forge/test-utils'; +import { expect } from 'chai'; +import glob from 'fast-glob'; +import fs from 'fs-extra'; + +import { api } from '../../../api/core'; + +describe('ViteTypeScriptTemplate', () => { + let dir: string; + + before(async () => { + dir = await testUtils.ensureTestDirIsNonexistent(); + }); + + it('should succeed in initializing the typescript template', async () => { + await api.init({ + dir, + template: path.resolve(__dirname, '..', 'src', 'ViteTypeScriptTemplate'), + interactive: false, + }); + }); + + context('template files are copied to project', () => { + const expectedFiles = [ + 'tsconfig.json', + '.eslintrc.json', + 'forge.config.ts', + 'vite.main.config.ts', + 'vite.renderer.config.ts', + 'vite.preload.config.ts', + path.join('src', 'main.ts'), + path.join('src', 'renderer.ts'), + path.join('src', 'preload.ts'), + ]; + for (const filename of expectedFiles) { + it(`${filename} should exist`, async () => { + await testUtils.expectProjectPathExists(dir, filename, 'file'); + }); + } + }); + + it('should ensure js source files from base template are removed', async () => { + const jsFiles = await glob(path.join(dir, 'src', '**', '*.js')); + expect(jsFiles.length).to.equal(0, `The following unexpected js files were found in the src/ folder: ${JSON.stringify(jsFiles)}`); + }); + + describe('lint', () => { + it('should initially pass the linting process', async () => { + delete process.env.TS_NODE_PROJECT; + await testUtils.expectLintToPass(dir); + }); + }); + + describe('package', () => { + let cwd: string; + + before(async () => { + delete process.env.TS_NODE_PROJECT; + // Vite resolves plugins via cwd + cwd = process.cwd(); + process.chdir(dir); + // We need the version of vite to match exactly during development due to a quirk in + // typescript type-resolution. In prod no one has to worry about things like this + const pj = await fs.readJson(path.resolve(dir, 'package.json')); + pj.resolutions = { + // eslint-disable-next-line @typescript-eslint/no-var-requires + vite: `${require('../../../../node_modules/vite/package.json').version}`, + }; + await fs.writeJson(path.resolve(dir, 'package.json'), pj); + await yarnOrNpmSpawn(['install'], { + cwd: dir, + }); + }); + + after(() => { + process.chdir(cwd); + }); + + it('should pass', async () => { + await api.package({ + dir, + interactive: false, + }); + }); + }); + + after(async () => { + await fs.remove(dir); + }); +}); diff --git a/packages/template/vite-typescript/tmpl/forge.config.ts b/packages/template/vite-typescript/tmpl/forge.config.ts index ec2b06b858..e46117a743 100644 --- a/packages/template/vite-typescript/tmpl/forge.config.ts +++ b/packages/template/vite-typescript/tmpl/forge.config.ts @@ -3,7 +3,7 @@ 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 { VitePlugin } from 'electron-forge-plugin-vite'; const config: ForgeConfig = { packagerConfig: {}, diff --git a/packages/template/vite-typescript/tmpl/package.json b/packages/template/vite-typescript/tmpl/package.json index a3723d7136..f7b28b3be5 100644 --- a/packages/template/vite-typescript/tmpl/package.json +++ b/packages/template/vite-typescript/tmpl/package.json @@ -1,6 +1,10 @@ { "devDependencies": { - "@electron-forge/plugin-vite": "ELECTRON_FORGE/VERSION", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "electron-forge-plugin-vite": "latest", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.0", "ts-node": "^10.0.0", "typescript": "~4.5.4" } From 48dfa56d0493ba3214450b8bd7576ac4fa13a821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sat, 1 Apr 2023 15:47:20 +0800 Subject: [PATCH 03/23] refactor(template-vite-typescript): `@electron-forge/plugin-vite` instead `electron-forge-plugin-vite` --- packages/template/vite-typescript/package.json | 8 ++++---- packages/template/vite-typescript/tmpl/forge.config.ts | 2 +- packages/template/vite-typescript/tmpl/package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json index a9a2041430..0d51381b8b 100644 --- a/packages/template/vite-typescript/package.json +++ b/packages/template/vite-typescript/package.json @@ -18,13 +18,13 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", + "@electron-forge/shared-types": "6.1.0", + "@electron-forge/template-base": "6.1.0", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/core-utils": "6.0.5", - "@electron-forge/test-utils": "6.0.5", + "@electron-forge/core-utils": "6.1.0", + "@electron-forge/test-utils": "6.1.0", "chai": "^4.3.3", "fast-glob": "^3.2.7" } diff --git a/packages/template/vite-typescript/tmpl/forge.config.ts b/packages/template/vite-typescript/tmpl/forge.config.ts index e46117a743..ec2b06b858 100644 --- a/packages/template/vite-typescript/tmpl/forge.config.ts +++ b/packages/template/vite-typescript/tmpl/forge.config.ts @@ -3,7 +3,7 @@ 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 { VitePlugin } from '@electron-forge/plugin-vite'; const config: ForgeConfig = { packagerConfig: {}, diff --git a/packages/template/vite-typescript/tmpl/package.json b/packages/template/vite-typescript/tmpl/package.json index f7b28b3be5..4e477a9ce6 100644 --- a/packages/template/vite-typescript/tmpl/package.json +++ b/packages/template/vite-typescript/tmpl/package.json @@ -1,8 +1,8 @@ { "devDependencies": { + "@electron-forge/plugin-vite": "ELECTRON_FORGE/VERSION", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", - "electron-forge-plugin-vite": "latest", "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.0", "ts-node": "^10.0.0", From 71668876a1f8b3ebf2e1cb3d295cbd15e98c3cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 12 Apr 2023 10:07:35 +0800 Subject: [PATCH 04/23] feat(template-vite-typescript): move declare to .d.ts --- .../template/vite-typescript/src/ViteTypeScriptTemplate.ts | 1 + .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 1 + packages/template/vite-typescript/tmpl/main.ts | 5 ----- packages/template/vite-typescript/tmpl/types.d.ts | 5 +++++ 4 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 packages/template/vite-typescript/tmpl/types.d.ts diff --git a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts index 09870da2b5..f43bb46482 100644 --- a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts +++ b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts @@ -37,6 +37,7 @@ class ViteTypeScriptTemplate extends BaseTemplate { await this.copyTemplateFile(path.join(directory, 'src'), 'main.ts'); await this.copyTemplateFile(path.join(directory, 'src'), 'renderer.ts'); + await this.copyTemplateFile(path.join(directory, 'src'), 'types.d.ts'); // Remove preload.js and replace with preload.ts await fs.remove(path.join(directory, 'src', 'preload.js')); diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index c3b4e5e170..f994db14dc 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -34,6 +34,7 @@ describe('ViteTypeScriptTemplate', () => { path.join('src', 'main.ts'), path.join('src', 'renderer.ts'), path.join('src', 'preload.ts'), + path.join('src', 'types.d.ts'), ]; for (const filename of expectedFiles) { it(`${filename} should exist`, async () => { diff --git a/packages/template/vite-typescript/tmpl/main.ts b/packages/template/vite-typescript/tmpl/main.ts index 2110ba0ff8..cbd9c22b0d 100644 --- a/packages/template/vite-typescript/tmpl/main.ts +++ b/packages/template/vite-typescript/tmpl/main.ts @@ -1,10 +1,5 @@ import { app, BrowserWindow } from 'electron'; import path from 'path'; -// This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Vite -// plugin that tells the Electron app where to look for the Vite-bundled app code (depending on -// whether you're running in development or production). -declare const MAIN_WINDOW_VITE_DEV_SERVER_URL: string; -declare const MAIN_WINDOW_VITE_NAME: string; // Handle creating/removing shortcuts on Windows when installing/uninstalling. if (require('electron-squirrel-startup')) { diff --git a/packages/template/vite-typescript/tmpl/types.d.ts b/packages/template/vite-typescript/tmpl/types.d.ts new file mode 100644 index 0000000000..eae3393f14 --- /dev/null +++ b/packages/template/vite-typescript/tmpl/types.d.ts @@ -0,0 +1,5 @@ +// This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Vite +// plugin that tells the Electron app where to look for the Vite-bundled app code (depending on +// whether you're running in development or production). +declare const MAIN_WINDOW_VITE_DEV_SERVER_URL: string; +declare const MAIN_WINDOW_VITE_NAME: string; From f4b23b916aca3b3af4423d1f6b59e4552e2d7d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 12 Apr 2023 10:08:38 +0800 Subject: [PATCH 05/23] chore(template-vite-typescript): update tsconfig --- packages/template/vite-typescript/tmpl/tsconfig.json | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/template/vite-typescript/tmpl/tsconfig.json b/packages/template/vite-typescript/tmpl/tsconfig.json index 92db0d6da1..1532c754ac 100644 --- a/packages/template/vite-typescript/tmpl/tsconfig.json +++ b/packages/template/vite-typescript/tmpl/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES6", + "target": "ESNext", + "module": "ESNext", "allowJs": true, - "module": "commonjs", "skipLibCheck": true, "esModuleInterop": true, "noImplicitAny": true, @@ -10,10 +10,7 @@ "baseUrl": ".", "outDir": "dist", "moduleResolution": "node", - "resolveJsonModule": true, - "paths": { - "*": ["node_modules/*"] - } + "resolveJsonModule": true }, - "include": ["src/**/*"] + "include": ["src"] } From 488aa0a5f0ef0bd538151fab4d428c21a039ea40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 12 Apr 2023 10:19:41 +0800 Subject: [PATCH 06/23] chore(template-vite-typescript): bump `@electron-forge/*` to 6.1.1 --- packages/template/vite-typescript/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json index 0d51381b8b..3a59e16bf0 100644 --- a/packages/template/vite-typescript/package.json +++ b/packages/template/vite-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-vite-typescript", - "version": "6.1.0", + "version": "6.1.1", "description": "Vite-TypeScript template for Electron Forge, gets you started with Vite really quickly", "repository": { "type": "git", @@ -18,13 +18,13 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/shared-types": "6.1.0", - "@electron-forge/template-base": "6.1.0", + "@electron-forge/shared-types": "6.1.1", + "@electron-forge/template-base": "6.1.1", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/core-utils": "6.1.0", - "@electron-forge/test-utils": "6.1.0", + "@electron-forge/core-utils": "6.1.1", + "@electron-forge/test-utils": "6.1.1", "chai": "^4.3.3", "fast-glob": "^3.2.7" } From a7198dd9e39de84b78d59ed384d6972e027377d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 23 Apr 2023 11:07:41 +0800 Subject: [PATCH 07/23] fix(template-vite-typescript): CI test --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 262ee23eab..79b6d82d06 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "lint:fix": "prettier --write .", "link:prepare": "lerna exec -- node ../../../tools/silent.js yarn link --silent --no-bin-links --link-folder ../../../.links", "link:remove": "lerna exec -- node ../../../tools/silent.js yarn unlink --silent --no-bin-links --link-folder ../../../.links", - "test": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TS_NODE_FILES=1 mocha './tools/test-globber.ts'", - "test:fast": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_FAST_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", - "test:slow": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_SLOW_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", + "test": "xvfb-maybe cross-env NODE_ENV=test LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TS_NODE_FILES=1 mocha './tools/test-globber.ts'", + "test:fast": "xvfb-maybe cross-env NODE_ENV=test LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_FAST_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", + "test:slow": "xvfb-maybe cross-env NODE_ENV=test LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_SLOW_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", "postinstall": "rimraf node_modules/.bin/*.ps1 && ts-node ./tools/gen-tsconfigs.ts && ts-node ./tools/gen-ts-glue.ts", "prepare": "husky install", "preversion": "yarn build" From e2e74a6b7379ab2b03af33f00f4b92130a64b512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 23 Apr 2023 11:43:12 +0800 Subject: [PATCH 08/23] fix(template-vite-typescript): correct resolve lib as Node.js env --- .../template/vite-typescript/tmpl/vite.main.config.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/tmpl/vite.main.config.ts b/packages/template/vite-typescript/tmpl/vite.main.config.ts index 690be5b1a9..c93ad03824 100644 --- a/packages/template/vite-typescript/tmpl/vite.main.config.ts +++ b/packages/template/vite-typescript/tmpl/vite.main.config.ts @@ -1,4 +1,10 @@ import { defineConfig } from 'vite'; // https://vitejs.dev/config -export default defineConfig({}); +export default defineConfig({ + resolve: { + // Some libs that can run in both Web and Node.js, such as `axios`, we need to tell Vite to build them in Node.js. + browserField: false, + mainFields: ['module', 'jsnext:main', 'jsnext'], + }, +}); From 539518a644edee2109d610b7ac0f06b3610e4919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 23 Apr 2023 14:01:52 +0800 Subject: [PATCH 09/23] fix(template-vite-typescript): update `scripts.lint` --- .../src/ViteTypeScriptTemplate.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts index f43bb46482..d0df2e651b 100644 --- a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts +++ b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts @@ -19,8 +19,10 @@ class ViteTypeScriptTemplate extends BaseTemplate { }, }, { - title: 'Setting up Vite configuration', + title: 'Preparing TypeScript files and configuration', task: async () => { + const filePath = (fileName: string) => path.join(directory, 'src', fileName); + // Copy Vite files await this.copyTemplateFile(directory, 'vite.main.config.ts'); await this.copyTemplateFile(directory, 'vite.renderer.config.ts'); @@ -32,31 +34,33 @@ class ViteTypeScriptTemplate extends BaseTemplate { // Copy eslint config with recommended settings await this.copyTemplateFile(directory, '.eslintrc.json'); - // Remove index.js and replace with index.ts - await fs.remove(path.join(directory, 'src', 'index.js')); + // Remove index.js and replace with main.ts + await fs.remove(filePath('index.js')); await this.copyTemplateFile(path.join(directory, 'src'), 'main.ts'); await this.copyTemplateFile(path.join(directory, 'src'), 'renderer.ts'); await this.copyTemplateFile(path.join(directory, 'src'), 'types.d.ts'); // Remove preload.js and replace with preload.ts - await fs.remove(path.join(directory, 'src', 'preload.js')); + await fs.remove(filePath('preload.js')); await this.copyTemplateFile(path.join(directory, 'src'), 'preload.ts'); // TODO: Compatible with any path entry. // Vite uses index.html under the root path as the entry point. - fs.moveSync(path.join(directory, 'src', 'index.html'), path.join(directory, 'index.html')); + fs.moveSync(filePath('index.html'), path.join(directory, 'index.html')); await this.updateFileByLine(path.join(directory, 'index.html'), (line) => { if (line.includes('link rel="stylesheet"')) return ''; if (line.includes('')) return ' \n '; return line; }); - // update package.json entry point - const pjPath = path.resolve(directory, 'package.json'); - const currentPJ = await fs.readJson(pjPath); - currentPJ.main = '.vite/build/main.js'; - await fs.writeJson(pjPath, currentPJ, { + // update package.json + const packageJSONPath = path.resolve(directory, 'package.json'); + const packageJSON = await fs.readJson(packageJSONPath); + packageJSON.main = '.vite/build/main.js'; + // Configure scripts for TS template + packageJSON.scripts.lint = 'eslint --ext .ts,.tsx .'; + await fs.writeJson(packageJSONPath, packageJSON, { spaces: 2, }); }, From 4f1b7fdcfc84585640ccfee5e7fe77596710d490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Tue, 25 Apr 2023 19:11:47 +0800 Subject: [PATCH 10/23] fix(template-vite-typescript): CI Windows --- .../test/ViteTypeScriptTemplate_spec_slow.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index f994db14dc..8ad41dd1fb 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -7,11 +7,13 @@ import glob from 'fast-glob'; import fs from 'fs-extra'; import { api } from '../../../api/core'; +import { initLink } from '../../../api/core/src/api/init-scripts/init-link'; describe('ViteTypeScriptTemplate', () => { let dir: string; before(async () => { + await yarnOrNpmSpawn(['link:prepare']); dir = await testUtils.ensureTestDirIsNonexistent(); }); @@ -74,6 +76,11 @@ describe('ViteTypeScriptTemplate', () => { await yarnOrNpmSpawn(['install'], { cwd: dir, }); + + // Installing deps removes symlinks that were added at the start of this + // spec via `api.init`. So we should re-link local forge dependencies + // again. + await initLink(dir); }); after(() => { @@ -89,6 +96,9 @@ describe('ViteTypeScriptTemplate', () => { }); after(async () => { - await fs.remove(dir); + await yarnOrNpmSpawn(['link:remove']); + // TODO: use `await fs.remove(dir);` + // Error: EBUSY: resource busy or locked, rmdir 'C:\Users\RUNNER~1\AppData\Local\Temp\electron-forge-test-1682230899228' + fs.rmSync(dir, { recursive: true }); // fix CI with sync-api, Windows like it? 🤔 }); }); From 06957e9d3d3ca26c78ca6d5fc366da8f2b82da8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Tue, 4 Jul 2023 12:58:36 +0800 Subject: [PATCH 11/23] chore(template-vite-typescript): bump electron relatived deps to 6.2.1 --- packages/template/vite-typescript/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json index 3a59e16bf0..385ae596e2 100644 --- a/packages/template/vite-typescript/package.json +++ b/packages/template/vite-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-vite-typescript", - "version": "6.1.1", + "version": "6.2.1", "description": "Vite-TypeScript template for Electron Forge, gets you started with Vite really quickly", "repository": { "type": "git", @@ -18,13 +18,13 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/shared-types": "6.1.1", - "@electron-forge/template-base": "6.1.1", + "@electron-forge/shared-types": "6.2.1", + "@electron-forge/template-base": "6.2.1", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/core-utils": "6.1.1", - "@electron-forge/test-utils": "6.1.1", + "@electron-forge/core-utils": "6.2.1", + "@electron-forge/test-utils": "6.2.1", "chai": "^4.3.3", "fast-glob": "^3.2.7" } From 0f4ec09f08acad979c2af570a1918ab91536131a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Tue, 4 Jul 2023 12:59:07 +0800 Subject: [PATCH 12/23] fix(template-vite-typescript): commonjs instead ESNext --- packages/template/vite-typescript/tmpl/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/tmpl/tsconfig.json b/packages/template/vite-typescript/tmpl/tsconfig.json index 1532c754ac..01a588b529 100644 --- a/packages/template/vite-typescript/tmpl/tsconfig.json +++ b/packages/template/vite-typescript/tmpl/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ESNext", - "module": "ESNext", + "module": "commonjs", "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, From d94fc8bb0e68cee879835f96d8fa94b5b392baf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 13 Aug 2023 17:49:16 +0800 Subject: [PATCH 13/23] cleanup: code style --- packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts index d0df2e651b..34c94311ff 100644 --- a/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts +++ b/packages/template/vite-typescript/src/ViteTypeScriptTemplate.ts @@ -47,7 +47,7 @@ class ViteTypeScriptTemplate extends BaseTemplate { // TODO: Compatible with any path entry. // Vite uses index.html under the root path as the entry point. - fs.moveSync(filePath('index.html'), path.join(directory, 'index.html')); + await fs.move(filePath('index.html'), path.join(directory, 'index.html')); await this.updateFileByLine(path.join(directory, 'index.html'), (line) => { if (line.includes('link rel="stylesheet"')) return ''; if (line.includes('')) return ' \n '; From 96e1924fe3048d7e8dca92cf5511dc1484e7e2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 13 Aug 2023 17:52:13 +0800 Subject: [PATCH 14/23] fix: use fs sync api bypass Windows test BUG --- .../test/ViteTypeScriptTemplate_spec_slow.ts | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 8ad41dd1fb..4aad4e4c8b 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -1,10 +1,10 @@ +import fs from 'fs'; import path from 'path'; import { yarnOrNpmSpawn } from '@electron-forge/core-utils'; import * as testUtils from '@electron-forge/test-utils'; import { expect } from 'chai'; import glob from 'fast-glob'; -import fs from 'fs-extra'; import { api } from '../../../api/core'; import { initLink } from '../../../api/core/src/api/init-scripts/init-link'; @@ -17,15 +17,22 @@ describe('ViteTypeScriptTemplate', () => { dir = await testUtils.ensureTestDirIsNonexistent(); }); - it('should succeed in initializing the typescript template', async () => { - await api.init({ - dir, - template: path.resolve(__dirname, '..', 'src', 'ViteTypeScriptTemplate'), - interactive: false, - }); + after(async () => { + await yarnOrNpmSpawn(['link:remove']); + // When we use Promise API of fs, will got some errors: ---- `await fs.remove(dir);` + // Error: EBUSY: resource busy or locked, rmdir '\\?\C:\Users\CIRCLE~1.PAC\AppData\Local\Temp\electron-forge-test-1691139919604' + fs.rmSync(dir, { recursive: true, force: true }); }); - context('template files are copied to project', () => { + describe('template files are copied to project', () => { + it('should succeed in initializing the typescript template', async () => { + await api.init({ + dir, + template: path.resolve(__dirname, '..', 'src', 'ViteTypeScriptTemplate'), + interactive: false, + }); + }); + const expectedFiles = [ 'tsconfig.json', '.eslintrc.json', @@ -43,11 +50,11 @@ describe('ViteTypeScriptTemplate', () => { await testUtils.expectProjectPathExists(dir, filename, 'file'); }); } - }); - it('should ensure js source files from base template are removed', async () => { - const jsFiles = await glob(path.join(dir, 'src', '**', '*.js')); - expect(jsFiles.length).to.equal(0, `The following unexpected js files were found in the src/ folder: ${JSON.stringify(jsFiles)}`); + it('should ensure js source files from base template are removed', async () => { + const jsFiles = await glob(path.join(dir, 'src', '**', '*.js')); + expect(jsFiles.length).to.equal(0, `The following unexpected js files were found in the src/ folder: ${JSON.stringify(jsFiles)}`); + }); }); describe('lint', () => { @@ -67,12 +74,12 @@ describe('ViteTypeScriptTemplate', () => { process.chdir(dir); // We need the version of vite to match exactly during development due to a quirk in // typescript type-resolution. In prod no one has to worry about things like this - const pj = await fs.readJson(path.resolve(dir, 'package.json')); + const pj = JSON.parse(fs.readFileSync(path.resolve(dir, 'package.json'), 'utf8')); pj.resolutions = { // eslint-disable-next-line @typescript-eslint/no-var-requires vite: `${require('../../../../node_modules/vite/package.json').version}`, }; - await fs.writeJson(path.resolve(dir, 'package.json'), pj); + fs.writeFileSync(path.resolve(dir, 'package.json'), JSON.stringify(pj, null, 2)); await yarnOrNpmSpawn(['install'], { cwd: dir, }); @@ -94,11 +101,4 @@ describe('ViteTypeScriptTemplate', () => { }); }); }); - - after(async () => { - await yarnOrNpmSpawn(['link:remove']); - // TODO: use `await fs.remove(dir);` - // Error: EBUSY: resource busy or locked, rmdir 'C:\Users\RUNNER~1\AppData\Local\Temp\electron-forge-test-1682230899228' - fs.rmSync(dir, { recursive: true }); // fix CI with sync-api, Windows like it? 🤔 - }); }); From a61c58833cea146439f30cf56dfb75fb06ad07ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Sun, 13 Aug 2023 22:17:12 +0800 Subject: [PATCH 15/23] fix: kill esbuild for test vite-typescript tpl --- .../test/ViteTypeScriptTemplate_spec_slow.ts | 52 ++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 4aad4e4c8b..faa8cb8e93 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -1,10 +1,11 @@ -import fs from 'fs'; +import cp from 'child_process'; import path from 'path'; import { yarnOrNpmSpawn } from '@electron-forge/core-utils'; import * as testUtils from '@electron-forge/test-utils'; import { expect } from 'chai'; import glob from 'fast-glob'; +import fs from 'fs-extra'; import { api } from '../../../api/core'; import { initLink } from '../../../api/core/src/api/init-scripts/init-link'; @@ -19,9 +20,8 @@ describe('ViteTypeScriptTemplate', () => { after(async () => { await yarnOrNpmSpawn(['link:remove']); - // When we use Promise API of fs, will got some errors: ---- `await fs.remove(dir);` - // Error: EBUSY: resource busy or locked, rmdir '\\?\C:\Users\CIRCLE~1.PAC\AppData\Local\Temp\electron-forge-test-1691139919604' - fs.rmSync(dir, { recursive: true, force: true }); + await killWindowsEsbuildExe(); + await fs.remove(dir); }); describe('template files are copied to project', () => { @@ -74,12 +74,12 @@ describe('ViteTypeScriptTemplate', () => { process.chdir(dir); // We need the version of vite to match exactly during development due to a quirk in // typescript type-resolution. In prod no one has to worry about things like this - const pj = JSON.parse(fs.readFileSync(path.resolve(dir, 'package.json'), 'utf8')); + const pj = await fs.readJson(path.resolve(dir, 'package.json')); pj.resolutions = { // eslint-disable-next-line @typescript-eslint/no-var-requires vite: `${require('../../../../node_modules/vite/package.json').version}`, }; - fs.writeFileSync(path.resolve(dir, 'package.json'), JSON.stringify(pj, null, 2)); + await fs.writeJson(path.resolve(dir, 'package.json'), pj); await yarnOrNpmSpawn(['install'], { cwd: dir, }); @@ -102,3 +102,43 @@ describe('ViteTypeScriptTemplate', () => { }); }); }); + +/** + * TODO: resolve `esbuild` can not exit normally on the Windows platform. + * @deprecated + */ +async function killWindowsEsbuildExe() { + if (process.platform !== 'win32') { + return Promise.resolve(null); + } + + return new Promise((resolve, reject) => { + cp.exec('tasklist', (error, stdout) => { + if (error) { + reject(null); + return; + } + + const esbuild = stdout + .toString() + .split('\n') + .map((line) => line.split(/\s+/)) + .find((line) => line.includes('esbuild.exe')); + + if (!esbuild) { + resolve(null); + return; + } + + // ['esbuild.exe', '4564', 'Console', '1', '14,400', 'K', ''] + const [, pid] = esbuild; + const result = process.kill(+pid, 'SIGINT'); + + if (result) { + resolve(true); + } else { + reject(null); + } + }); + }); +} From d8d8ef154efb4e2c3fdd3420193dffa27b70c305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:36:14 +0800 Subject: [PATCH 16/23] Update packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts Co-authored-by: Black-Hole --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index faa8cb8e93..158ecf66ea 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -115,7 +115,7 @@ async function killWindowsEsbuildExe() { return new Promise((resolve, reject) => { cp.exec('tasklist', (error, stdout) => { if (error) { - reject(null); + reject(error); return; } From 762d6e8546ac281506934e27dd0b391dbcafe780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:36:21 +0800 Subject: [PATCH 17/23] Update packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts Co-authored-by: Black-Hole --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 158ecf66ea..547d0804dc 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -126,7 +126,7 @@ async function killWindowsEsbuildExe() { .find((line) => line.includes('esbuild.exe')); if (!esbuild) { - resolve(null); + resolve(); return; } From 70f2245ceb62e93cf7ee70ae94d4358f2e1ba56e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:36:30 +0800 Subject: [PATCH 18/23] Update packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts Co-authored-by: Black-Hole --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 547d0804dc..2507602698 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -112,7 +112,7 @@ async function killWindowsEsbuildExe() { return Promise.resolve(null); } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { cp.exec('tasklist', (error, stdout) => { if (error) { reject(error); From a5d04fd3ca7b5e242f8de041f7b0a8ac96e04a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:36:39 +0800 Subject: [PATCH 19/23] Update packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts Co-authored-by: Black-Hole --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 2507602698..ccca6738c1 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -135,7 +135,7 @@ async function killWindowsEsbuildExe() { const result = process.kill(+pid, 'SIGINT'); if (result) { - resolve(true); + resolve(); } else { reject(null); } From 8e17895203ffe323a9cdb90290b313b37d8d510f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:36:55 +0800 Subject: [PATCH 20/23] Update packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts Co-authored-by: Black-Hole --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index ccca6738c1..9adacf6c41 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -137,7 +137,7 @@ async function killWindowsEsbuildExe() { if (result) { resolve(); } else { - reject(null); + reject(new Error("kill esbuild process failed")); } }); }); From 0b1ffd21fc840015da941833143b4e8f8d262003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 09:40:42 +0800 Subject: [PATCH 21/23] fix: eslint --- .../vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts index 9adacf6c41..565769df86 100644 --- a/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts +++ b/packages/template/vite-typescript/test/ViteTypeScriptTemplate_spec_slow.ts @@ -109,7 +109,7 @@ describe('ViteTypeScriptTemplate', () => { */ async function killWindowsEsbuildExe() { if (process.platform !== 'win32') { - return Promise.resolve(null); + return Promise.resolve(); } return new Promise((resolve, reject) => { @@ -137,7 +137,7 @@ async function killWindowsEsbuildExe() { if (result) { resolve(); } else { - reject(new Error("kill esbuild process failed")); + reject(new Error('kill esbuild process failed')); } }); }); From 4f1aa6e121f3f3591d3fcd5816d620b19e19104e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Mon, 14 Aug 2023 22:23:43 +0800 Subject: [PATCH 22/23] chore(vite-typescript): bump to 6.3.0 --- packages/template/vite-typescript/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json index 385ae596e2..4fc293d03a 100644 --- a/packages/template/vite-typescript/package.json +++ b/packages/template/vite-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-vite-typescript", - "version": "6.2.1", + "version": "6.3.0", "description": "Vite-TypeScript template for Electron Forge, gets you started with Vite really quickly", "repository": { "type": "git", @@ -18,13 +18,13 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/shared-types": "6.2.1", - "@electron-forge/template-base": "6.2.1", + "@electron-forge/shared-types": "6.3.0", + "@electron-forge/template-base": "6.3.0", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/core-utils": "6.2.1", - "@electron-forge/test-utils": "6.2.1", + "@electron-forge/core-utils": "6.3.0", + "@electron-forge/test-utils": "6.3.0", "chai": "^4.3.3", "fast-glob": "^3.2.7" } From a1c16886bdf999554150ab12a85f0408e7c33ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 16 Aug 2023 11:34:32 +0800 Subject: [PATCH 23/23] chore(vite-typescript): add files field --- packages/template/vite-typescript/package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/template/vite-typescript/package.json b/packages/template/vite-typescript/package.json index 4fc293d03a..a91d1ee4f2 100644 --- a/packages/template/vite-typescript/package.json +++ b/packages/template/vite-typescript/package.json @@ -27,5 +27,10 @@ "@electron-forge/test-utils": "6.3.0", "chai": "^4.3.3", "fast-glob": "^3.2.7" - } + }, + "files": [ + "dist", + "src", + "tmpl" + ] }