diff options
28 files changed, 150 insertions, 144 deletions
diff --git a/.electron-builder.config.js b/.electron-builder.config.cjs index 5238c69..5238c69 100644 --- a/.electron-builder.config.js +++ b/.electron-builder.config.cjs | |||
diff --git a/config/build-common.js b/config/build-common.js index aea2335..ff5a218 100644 --- a/config/build-common.js +++ b/config/build-common.js | |||
@@ -1,11 +1,17 @@ | |||
1 | // @ts-check | 1 | import { readFileSync } from 'fs'; |
2 | import { dirname, join } from 'path'; | ||
3 | import { fileURLToPath } from 'url'; | ||
2 | 4 | ||
3 | // `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. | 5 | const thisDir = fileURLToDirname(import.meta.url); |
4 | // @ts-ignore | 6 | |
5 | const { chrome: chromeVersion, node: nodeVersion } = require('../.electron-vendors.cache.json'); | 7 | // We import this from a vite config, where top-level await is not available (es2021), |
8 | // so we have to use the synchronous filesystem API. | ||
9 | const electronVendorsJson = readFileSync(join(thisDir, '../.electron-vendors.cache.json'), 'utf8'); | ||
10 | |||
11 | const { chrome: chromeVersion, node: nodeVersion } = JSON.parse(electronVendorsJson); | ||
6 | 12 | ||
7 | /** @type {string} */ | 13 | /** @type {string} */ |
8 | module.exports.banner = `/*! | 14 | export const banner = `/*! |
9 | * Copyright (C) 2021-2022 Sophie contributors | 15 | * Copyright (C) 2021-2022 Sophie contributors |
10 | * | 16 | * |
11 | * This file is part of Sophie. | 17 | * This file is part of Sophie. |
@@ -27,7 +33,15 @@ module.exports.banner = `/*! | |||
27 | `; | 33 | `; |
28 | 34 | ||
29 | /** @type {string} */ | 35 | /** @type {string} */ |
30 | module.exports.chrome = `chrome${chromeVersion}`; | 36 | export const chrome = `chrome${chromeVersion}`; |
31 | 37 | ||
32 | /** @type {string} */ | 38 | /** @type {string} */ |
33 | module.exports.node = `node${nodeVersion}`; | 39 | export const node = `node${nodeVersion}`; |
40 | |||
41 | /** | ||
42 | * @param {string} url | ||
43 | * @returns {string} | ||
44 | */ | ||
45 | export function fileURLToDirname(url) { | ||
46 | return dirname(fileURLToPath(url)); | ||
47 | } | ||
diff --git a/config/esbuild-config.js b/config/esbuild-config.js index 9140b89..52d1a59 100644 --- a/config/esbuild-config.js +++ b/config/esbuild-config.js | |||
@@ -1,6 +1,4 @@ | |||
1 | // @ts-check | 1 | import { banner } from './build-common.js'; |
2 | |||
3 | const { banner } = require('./build-common'); | ||
4 | 2 | ||
5 | /** @type {string} */ | 3 | /** @type {string} */ |
6 | const mode = process.env.MODE || 'development'; | 4 | const mode = process.env.MODE || 'development'; |
@@ -8,8 +6,10 @@ const mode = process.env.MODE || 'development'; | |||
8 | /** @type {boolean} */ | 6 | /** @type {boolean} */ |
9 | const isDevelopment = mode === 'development'; | 7 | const isDevelopment = mode === 'development'; |
10 | 8 | ||
9 | /** @type {string} */ | ||
11 | const modeString = JSON.stringify(mode); | 10 | const modeString = JSON.stringify(mode); |
12 | 11 | ||
12 | /** @type {Record<string, string>} */ | ||
13 | const defineEnv = { | 13 | const defineEnv = { |
14 | 'import.meta.env.DEV': JSON.stringify(isDevelopment), | 14 | 'import.meta.env.DEV': JSON.stringify(isDevelopment), |
15 | 'import.meta.env.MODE': modeString, | 15 | 'import.meta.env.MODE': modeString, |
@@ -20,13 +20,16 @@ const defineEnv = { | |||
20 | 20 | ||
21 | /** | 21 | /** |
22 | * @param {import('esbuild').BuildOptions} config | 22 | * @param {import('esbuild').BuildOptions} config |
23 | * @param {object | unknown} metaEnvVars | 23 | * @param {Record<string, string>} [metaEnvVars] |
24 | * @returns {import('esbuild').BuildOptions} | 24 | * @returns {import('esbuild').BuildOptions} |
25 | */ | 25 | */ |
26 | module.exports.getConfig = function(config, metaEnvVars) { | 26 | export function getConfig(config, metaEnvVars) { |
27 | /** @type {Record<string, string>} */ | ||
27 | const defineMeta = {}; | 28 | const defineMeta = {}; |
28 | for (const varName in metaEnvVars) { | 29 | if (metaEnvVars) { |
29 | defineMeta[`import.meta.env.${varName}`] = JSON.stringify(metaEnvVars[varName]); | 30 | for (const varName in metaEnvVars) { |
31 | defineMeta[`import.meta.env.${varName}`] = JSON.stringify(metaEnvVars[varName]); | ||
32 | } | ||
30 | } | 33 | } |
31 | return { | 34 | return { |
32 | logLevel: 'info', | 35 | logLevel: 'info', |
diff --git a/jest.config.js b/jest.config.js index eda029a..1aa0cbb 100644 --- a/jest.config.js +++ b/jest.config.js | |||
@@ -1,17 +1,21 @@ | |||
1 | // @ts-check | 1 | import { join } from 'path'; |
2 | 2 | ||
3 | const { join } = require('path'); | 3 | import { fileURLToDirname } from './config/build-common.js'; |
4 | |||
5 | const dirname = fileURLToDirname(import.meta.url); | ||
4 | 6 | ||
5 | /** @type {import('ts-jest').InitialOptionsTsJest} */ | 7 | /** @type {import('ts-jest').InitialOptionsTsJest} */ |
6 | module.exports = { | 8 | export default { |
7 | preset: 'ts-jest', | 9 | preset: 'ts-jest/presets/default-esm', |
8 | globals: { | 10 | globals: { |
9 | 'ts-jest': { | 11 | 'ts-jest': { |
10 | isolatedModules: true, | 12 | isolatedModules: true, |
13 | useESM: true, | ||
11 | }, | 14 | }, |
12 | }, | 15 | }, |
13 | moduleNameMapper: { | 16 | moduleNameMapper: { |
14 | '@sophie/(.+)': join(__dirname, 'packages/$1/src/index.ts'), | 17 | '@sophie/(.+)': join(dirname, 'packages/$1/src/index.ts'), |
18 | '^(\\.{1,2}/.*)\\.js$': '$1', | ||
15 | }, | 19 | }, |
16 | resetMocks: true, | 20 | resetMocks: true, |
17 | restoreMocks: true, | 21 | restoreMocks: true, |
diff --git a/package.json b/package.json index e30d6fd..620c9cc 100644 --- a/package.json +++ b/package.json | |||
@@ -13,6 +13,7 @@ | |||
13 | "engines": { | 13 | "engines": { |
14 | "node": ">=v16.13" | 14 | "node": ">=v16.13" |
15 | }, | 15 | }, |
16 | "type": "module", | ||
16 | "main": "packages/main/dist/index.cjs", | 17 | "main": "packages/main/dist/index.cjs", |
17 | "scripts": { | 18 | "scripts": { |
18 | "clean": "rimraf dist packages/*/dist packages/*/tsconfig.tsbuildinfo .vite", | 19 | "clean": "rimraf dist packages/*/dist packages/*/tsconfig.tsbuildinfo .vite", |
@@ -20,7 +21,7 @@ | |||
20 | "build": "node scripts/build.js", | 21 | "build": "node scripts/build.js", |
21 | "precompile": "cross-env MODE=production yarn run build", | 22 | "precompile": "cross-env MODE=production yarn run build", |
22 | "compile": "yarn precompile && yarn compile:electron-builder", | 23 | "compile": "yarn precompile && yarn compile:electron-builder", |
23 | "compile:electron-builder": "electron-builder build --config .electron-builder.config.js --dir", | 24 | "compile:electron-builder": "electron-builder build --config .electron-builder.config.cjs --dir", |
24 | "watch": "node scripts/watch.js", | 25 | "watch": "node scripts/watch.js", |
25 | "typecheck": "yarn workspaces foreach -vpt run typecheck", | 26 | "typecheck": "yarn workspaces foreach -vpt run typecheck", |
26 | "update-electron-vendors": "node scripts/update-electron-vendors.js", | 27 | "update-electron-vendors": "node scripts/update-electron-vendors.js", |
diff --git a/packages/main/esbuild.config.js b/packages/main/esbuild.config.js index 7653078..a39534d 100644 --- a/packages/main/esbuild.config.js +++ b/packages/main/esbuild.config.js | |||
@@ -1,7 +1,5 @@ | |||
1 | // @ts-check | 1 | import { node, fileURLToDirname } from '../../config/build-common.js'; |
2 | 2 | import { getConfig } from '../../config/esbuild-config.js'; | |
3 | const { node } = require('../../config/build-common'); | ||
4 | const { getConfig } = require('../../config/esbuild-config'); | ||
5 | 3 | ||
6 | const externalPackages = ['electron']; | 4 | const externalPackages = ['electron']; |
7 | 5 | ||
@@ -9,8 +7,8 @@ if (process.env.MODE !== 'development') { | |||
9 | externalPackages.push('electron-devtools-installer'); | 7 | externalPackages.push('electron-devtools-installer'); |
10 | } | 8 | } |
11 | 9 | ||
12 | module.exports = getConfig({ | 10 | export default getConfig({ |
13 | absWorkingDir: __dirname, | 11 | absWorkingDir: fileURLToDirname(import.meta.url), |
14 | entryPoints: [ | 12 | entryPoints: [ |
15 | 'src/index.ts', | 13 | 'src/index.ts', |
16 | ], | 14 | ], |
diff --git a/packages/main/package.json b/packages/main/package.json index c118d2b..99451bd 100644 --- a/packages/main/package.json +++ b/packages/main/package.json | |||
@@ -2,7 +2,7 @@ | |||
2 | "name": "@sophie/main", | 2 | "name": "@sophie/main", |
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "main": "dist/index.cjs", | 5 | "type": "module", |
6 | "types": "dist-types/index.d.ts", | 6 | "types": "dist-types/index.d.ts", |
7 | "scripts": { | 7 | "scripts": { |
8 | "typecheck": "tsc" | 8 | "typecheck": "tsc" |
diff --git a/packages/main/src/devTools.ts b/packages/main/src/devTools.ts index 6c25b3e..7c7c86a 100644 --- a/packages/main/src/devTools.ts +++ b/packages/main/src/devTools.ts | |||
@@ -27,14 +27,12 @@ import type { BrowserWindow } from 'electron'; | |||
27 | * because the mobx-state-tree devtools are currently unmaintained. | 27 | * because the mobx-state-tree devtools are currently unmaintained. |
28 | */ | 28 | */ |
29 | export async function installDevToolsExtensions(): Promise<void> { | 29 | export async function installDevToolsExtensions(): Promise<void> { |
30 | const installerPackage = await import('electron-devtools-installer'); | 30 | // Hack to lazily require a CJS module from an ES module transpiled into a CJS module. |
31 | const { | 31 | const { |
32 | default: installExtension, | 32 | default: installExtension, |
33 | REACT_DEVELOPER_TOOLS, | 33 | REACT_DEVELOPER_TOOLS, |
34 | REDUX_DEVTOOLS, | 34 | REDUX_DEVTOOLS, |
35 | } = installerPackage.default instanceof Function | 35 | } = require('electron-devtools-installer'); |
36 | ? installerPackage | ||
37 | : installerPackage.default as unknown as typeof import('electron-devtools-installer'); | ||
38 | await installExtension( | 36 | await installExtension( |
39 | [ | 37 | [ |
40 | REACT_DEVELOPER_TOOLS, | 38 | REACT_DEVELOPER_TOOLS, |
diff --git a/packages/preload/esbuild.config.js b/packages/preload/esbuild.config.js index 76ac33f..de51fc5 100644 --- a/packages/preload/esbuild.config.js +++ b/packages/preload/esbuild.config.js | |||
@@ -1,10 +1,8 @@ | |||
1 | // @ts-check | 1 | import { chrome, fileURLToDirname } from '../../config/build-common.js'; |
2 | import { getConfig } from '../../config/esbuild-config.js'; | ||
2 | 3 | ||
3 | const { chrome } = require('../../config/build-common'); | 4 | export default getConfig({ |
4 | const { getConfig } = require('../../config/esbuild-config'); | 5 | absWorkingDir: fileURLToDirname(import.meta.url), |
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | 6 | entryPoints: [ |
9 | 'src/index.ts', | 7 | 'src/index.ts', |
10 | ], | 8 | ], |
diff --git a/packages/preload/jest.config.js b/packages/preload/jest.config.js index 5334b14..faecf9a 100644 --- a/packages/preload/jest.config.js +++ b/packages/preload/jest.config.js | |||
@@ -1,9 +1,7 @@ | |||
1 | // @ts-check | 1 | import rootConfig from '../../jest.config.js'; |
2 | |||
3 | const rootConfig = require('../../jest.config.js'); | ||
4 | 2 | ||
5 | /** @type {import('ts-jest').InitialOptionsTsJest} */ | 3 | /** @type {import('ts-jest').InitialOptionsTsJest} */ |
6 | module.exports = { | 4 | export default { |
7 | ...rootConfig, | 5 | ...rootConfig, |
8 | testEnvironment: 'jsdom', | 6 | testEnvironment: 'jsdom', |
9 | }; | 7 | }; |
diff --git a/packages/preload/package.json b/packages/preload/package.json index ac21618..e6dd0ee 100644 --- a/packages/preload/package.json +++ b/packages/preload/package.json | |||
@@ -3,10 +3,10 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "main": "dist/index.cjs", | 6 | "type": "module", |
7 | "types": "dist-types/index.d.ts", | 7 | "types": "dist-types/index.d.ts", |
8 | "scripts": { | 8 | "scripts": { |
9 | "test": "jest", | 9 | "test": "node --experimental-vm-modules ../../node_modules/jest/bin/jest.js", |
10 | "typecheck": "tsc" | 10 | "typecheck": "tsc" |
11 | }, | 11 | }, |
12 | "dependencies": { | 12 | "dependencies": { |
diff --git a/packages/preload/src/__mocks__/electron.ts b/packages/preload/src/__mocks__/electron.ts deleted file mode 100644 index 52cddf9..0000000 --- a/packages/preload/src/__mocks__/electron.ts +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com> | ||
3 | * | ||
4 | * This file is part of Sophie. | ||
5 | * | ||
6 | * Sophie is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU Affero General Public License as | ||
8 | * published by the Free Software Foundation, version 3. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU Affero General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU Affero General Public License | ||
16 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
17 | * | ||
18 | * SPDX-License-Identifier: AGPL-3.0-only | ||
19 | */ | ||
20 | |||
21 | export const ipcRenderer = { | ||
22 | invoke: jest.fn(), | ||
23 | on: jest.fn(), | ||
24 | send: jest.fn(), | ||
25 | }; | ||
diff --git a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts index 71ac2a1..e40dcf5 100644 --- a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts +++ b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts | |||
@@ -18,8 +18,8 @@ | |||
18 | * SPDX-License-Identifier: AGPL-3.0-only | 18 | * SPDX-License-Identifier: AGPL-3.0-only |
19 | */ | 19 | */ |
20 | 20 | ||
21 | import { describe, it, jest } from '@jest/globals'; | ||
21 | import { mocked } from 'jest-mock'; | 22 | import { mocked } from 'jest-mock'; |
22 | import { ipcRenderer } from 'electron'; | ||
23 | import type { IJsonPatch } from 'mobx-state-tree'; | 23 | import type { IJsonPatch } from 'mobx-state-tree'; |
24 | import { | 24 | import { |
25 | Action, | 25 | Action, |
@@ -29,9 +29,17 @@ import { | |||
29 | SophieRenderer, | 29 | SophieRenderer, |
30 | } from '@sophie/shared'; | 30 | } from '@sophie/shared'; |
31 | 31 | ||
32 | import { createSophieRenderer } from '../SophieRendererImpl'; | 32 | jest.unstable_mockModule('electron', () => ({ |
33 | ipcRenderer: { | ||
34 | invoke: jest.fn(), | ||
35 | on: jest.fn(), | ||
36 | send: jest.fn(), | ||
37 | }, | ||
38 | })); | ||
33 | 39 | ||
34 | jest.mock('electron'); | 40 | const { ipcRenderer } = await import('electron'); |
41 | |||
42 | const { createSophieRenderer } = await import('../SophieRendererImpl'); | ||
35 | 43 | ||
36 | const event: Electron.IpcRendererEvent = null as unknown as Electron.IpcRendererEvent; | 44 | const event: Electron.IpcRendererEvent = null as unknown as Electron.IpcRendererEvent; |
37 | 45 | ||
diff --git a/packages/preload/tsconfig.json b/packages/preload/tsconfig.json index 741d435..0f27305 100644 --- a/packages/preload/tsconfig.json +++ b/packages/preload/tsconfig.json | |||
@@ -6,9 +6,6 @@ | |||
6 | "dom", | 6 | "dom", |
7 | "dom.iterable", | 7 | "dom.iterable", |
8 | "esnext" | 8 | "esnext" |
9 | ], | ||
10 | "types": [ | ||
11 | "@types/jest" | ||
12 | ] | 9 | ] |
13 | }, | 10 | }, |
14 | "references": [ | 11 | "references": [ |
diff --git a/packages/renderer/package.json b/packages/renderer/package.json index fb13129..2a26b2b 100644 --- a/packages/renderer/package.json +++ b/packages/renderer/package.json | |||
@@ -2,7 +2,7 @@ | |||
2 | "name": "@sophie/renderer", | 2 | "name": "@sophie/renderer", |
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "main": "dist/index.html", | 5 | "type": "module", |
6 | "types": "dist-types/index.d.ts", | 6 | "types": "dist-types/index.d.ts", |
7 | "scripts": { | 7 | "scripts": { |
8 | "typecheck": "tsc" | 8 | "typecheck": "tsc" |
diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js index 30729c0..6f3d351 100644 --- a/packages/renderer/vite.config.js +++ b/packages/renderer/vite.config.js | |||
@@ -1,12 +1,12 @@ | |||
1 | // @ts-check | ||
2 | |||
3 | /* eslint-env node */ | 1 | /* eslint-env node */ |
4 | 2 | ||
5 | import { builtinModules } from 'module'; | 3 | import { builtinModules } from 'module'; |
6 | import { join } from 'path'; | 4 | import { join } from 'path'; |
7 | import react from '@vitejs/plugin-react'; | 5 | import react from '@vitejs/plugin-react'; |
8 | 6 | ||
9 | import { banner, chrome } from '../../config/build-common'; | 7 | import { banner, chrome, fileURLToDirname } from '../../config/build-common.js'; |
8 | |||
9 | const thisDir = fileURLToDirname(import.meta.url); | ||
10 | 10 | ||
11 | const mode = process.env.MODE || 'development'; | 11 | const mode = process.env.MODE || 'development'; |
12 | 12 | ||
@@ -20,8 +20,8 @@ export default { | |||
20 | /** @type {import('vite').LogLevel} */ | 20 | /** @type {import('vite').LogLevel} */ |
21 | logLevel: 'info', | 21 | logLevel: 'info', |
22 | mode, | 22 | mode, |
23 | root: __dirname, | 23 | root: thisDir, |
24 | cacheDir: join(__dirname, '../../.vite'), | 24 | cacheDir: join(thisDir, '../../.vite'), |
25 | plugins: [ | 25 | plugins: [ |
26 | react({ | 26 | react({ |
27 | babel: { | 27 | babel: { |
diff --git a/packages/service-inject/esbuild.config.js b/packages/service-inject/esbuild.config.js index 38e5b7d..3f1d6d0 100644 --- a/packages/service-inject/esbuild.config.js +++ b/packages/service-inject/esbuild.config.js | |||
@@ -1,10 +1,8 @@ | |||
1 | // @ts-check | 1 | import { chrome, fileURLToDirname } from '../../config/build-common.js'; |
2 | import { getConfig } from '../../config/esbuild-config.js'; | ||
2 | 3 | ||
3 | const { chrome } = require('../../config/build-common'); | 4 | export default getConfig({ |
4 | const { getConfig } = require('../../config/esbuild-config'); | 5 | absWorkingDir: fileURLToDirname(import.meta.url), |
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | 6 | entryPoints: [ |
9 | 'src/index.ts', | 7 | 'src/index.ts', |
10 | ], | 8 | ], |
diff --git a/packages/service-inject/package.json b/packages/service-inject/package.json index 825de24..7c496fd 100644 --- a/packages/service-inject/package.json +++ b/packages/service-inject/package.json | |||
@@ -3,7 +3,7 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "main": "dist/index.cjs", | 6 | "type": "module", |
7 | "types": "dist-types/index.d.ts", | 7 | "types": "dist-types/index.d.ts", |
8 | "scripts": { | 8 | "scripts": { |
9 | "typecheck": "tsc" | 9 | "typecheck": "tsc" |
diff --git a/packages/service-preload/esbuild.config.js b/packages/service-preload/esbuild.config.js index 76ac33f..3c67b31 100644 --- a/packages/service-preload/esbuild.config.js +++ b/packages/service-preload/esbuild.config.js | |||
@@ -1,10 +1,8 @@ | |||
1 | // @ts-check | 1 | import { chrome, fileURLToDirname } from "../../config/build-common.js"; |
2 | import { getConfig } from '../../config/esbuild-config.js'; | ||
2 | 3 | ||
3 | const { chrome } = require('../../config/build-common'); | 4 | export default getConfig({ |
4 | const { getConfig } = require('../../config/esbuild-config'); | 5 | absWorkingDir: fileURLToDirname(import.meta.url), |
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | 6 | entryPoints: [ |
9 | 'src/index.ts', | 7 | 'src/index.ts', |
10 | ], | 8 | ], |
diff --git a/packages/service-preload/package.json b/packages/service-preload/package.json index 7cbdfc8..8da5eb7 100644 --- a/packages/service-preload/package.json +++ b/packages/service-preload/package.json | |||
@@ -2,7 +2,7 @@ | |||
2 | "name": "@sophie/service-preload", | 2 | "name": "@sophie/service-preload", |
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "main": "dist/index.js", | 5 | "type": "module", |
6 | "types": "dist-types/index.d.ts", | 6 | "types": "dist-types/index.d.ts", |
7 | "scripts": { | 7 | "scripts": { |
8 | "typecheck": "tsc" | 8 | "typecheck": "tsc" |
diff --git a/packages/service-shared/esbuild.config.js b/packages/service-shared/esbuild.config.js index ce57cd7..8df2edf 100644 --- a/packages/service-shared/esbuild.config.js +++ b/packages/service-shared/esbuild.config.js | |||
@@ -1,10 +1,8 @@ | |||
1 | // @ts-check | 1 | import { chrome, fileURLToDirname } from '../../config/build-common.js'; |
2 | import { getConfig } from '../../config/esbuild-config.js'; | ||
2 | 3 | ||
3 | const { chrome } = require('../../config/build-common'); | 4 | export default getConfig({ |
4 | const { getConfig } = require('../../config/esbuild-config'); | 5 | absWorkingDir: fileURLToDirname(import.meta.url), |
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | 6 | entryPoints: [ |
9 | 'src/index.ts', | 7 | 'src/index.ts', |
10 | ], | 8 | ], |
diff --git a/packages/service-shared/package.json b/packages/service-shared/package.json index e812e4a..5c8ea79 100644 --- a/packages/service-shared/package.json +++ b/packages/service-shared/package.json | |||
@@ -3,7 +3,8 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "module": "dist/index.mjs", | 6 | "type": "module", |
7 | "main": "dist/index.mjs", | ||
7 | "types": "dist/index.d.ts", | 8 | "types": "dist/index.d.ts", |
8 | "scripts": { | 9 | "scripts": { |
9 | "typecheck": "tsc" | 10 | "typecheck": "tsc" |
diff --git a/packages/shared/esbuild.config.js b/packages/shared/esbuild.config.js index f58d776..fbaa6f1 100644 --- a/packages/shared/esbuild.config.js +++ b/packages/shared/esbuild.config.js | |||
@@ -1,10 +1,8 @@ | |||
1 | // @ts-check | 1 | import { chrome, fileURLToDirname } from '../../config/build-common.js'; |
2 | import { getConfig } from '../../config/esbuild-config.js'; | ||
2 | 3 | ||
3 | const { chrome } = require('../../config/build-common'); | 4 | export default getConfig({ |
4 | const { getConfig } = require('../../config/esbuild-config'); | 5 | absWorkingDir: fileURLToDirname(import.meta.url), |
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | 6 | entryPoints: [ |
9 | 'src/index.ts', | 7 | 'src/index.ts', |
10 | ], | 8 | ], |
diff --git a/packages/shared/package.json b/packages/shared/package.json index e4b57b0..428bff3 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json | |||
@@ -3,7 +3,8 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "module": "dist/index.mjs", | 6 | "type": "module", |
7 | "main": "dist/index.mjs", | ||
7 | "types": "dist/index.d.ts", | 8 | "types": "dist/index.d.ts", |
8 | "scripts": { | 9 | "scripts": { |
9 | "typecheck": "tsc" | 10 | "typecheck": "tsc" |
diff --git a/scripts/build.js b/scripts/build.js index 5abcdab..9b9b26e 100644 --- a/scripts/build.js +++ b/scripts/build.js | |||
@@ -1,19 +1,28 @@ | |||
1 | const esbuild = require('esbuild'); | 1 | import { build as esbuildBuild } from 'esbuild'; |
2 | const { join } = require('path'); | 2 | import { join } from 'path'; |
3 | const vite = require('vite'); | 3 | import { build as viteBuild } from 'vite'; |
4 | |||
5 | import { fileURLToDirname } from '../config/build-common.js'; | ||
6 | |||
7 | const thisDir = fileURLToDirname(import.meta.url); | ||
4 | 8 | ||
5 | /** | 9 | /** |
6 | * @param {string} packageName | 10 | * @param {string} packageName |
7 | * @returns {Promise<import('esbuild').BuildResult>} | 11 | * @returns {Promise<import('esbuild').BuildResult>} |
8 | */ | 12 | */ |
9 | function buildPackageEsbuild(packageName) { | 13 | async function buildPackageEsbuild(packageName) { |
10 | const config = require(`../packages/${packageName}/esbuild.config.js`); | 14 | /** @type {{ default: import('esbuild').BuildOptions }} */ |
11 | return esbuild.build(config); | 15 | const { default: config } = await import(`../packages/${packageName}/esbuild.config.js`); |
16 | return esbuildBuild(config); | ||
12 | } | 17 | } |
13 | 18 | ||
19 | /** | ||
20 | * @param {string} packageName | ||
21 | * @returns {Promise<unknown>} | ||
22 | */ | ||
14 | function buildPackageVite(packageName) { | 23 | function buildPackageVite(packageName) { |
15 | return vite.build({ | 24 | return viteBuild({ |
16 | configFile: join(__dirname, `../packages/${packageName}/vite.config.js`), | 25 | configFile: join(thisDir, `../packages/${packageName}/vite.config.js`), |
17 | }); | 26 | }); |
18 | } | 27 | } |
19 | 28 | ||
diff --git a/scripts/update-electron-vendors.js b/scripts/update-electron-vendors.js index 650d394..fea8b9d 100644 --- a/scripts/update-electron-vendors.js +++ b/scripts/update-electron-vendors.js | |||
@@ -1,11 +1,9 @@ | |||
1 | #!/usr/bin/env node | 1 | import { execSync } from 'child_process'; |
2 | import electronPath from 'electron'; | ||
3 | import { writeFile } from 'fs/promises'; | ||
4 | import { join, resolve } from 'path'; | ||
2 | 5 | ||
3 | // @ts-check | 6 | import { fileURLToDirname } from '../config/build-common.js'; |
4 | |||
5 | const { execSync } = require('child_process'); | ||
6 | const electronPath = require('electron'); | ||
7 | const { writeFile } = require('fs/promises'); | ||
8 | const path = require('path'); | ||
9 | 7 | ||
10 | /** | 8 | /** |
11 | * Returns versions of electron vendors | 9 | * Returns versions of electron vendors |
@@ -34,11 +32,11 @@ function updateVendors() { | |||
34 | const nodeMajorVersion = electronRelease.node.split('.')[0]; | 32 | const nodeMajorVersion = electronRelease.node.split('.')[0]; |
35 | const chromeMajorVersion = electronRelease.v8.split('.')[0] + electronRelease.v8.split('.')[1]; | 33 | const chromeMajorVersion = electronRelease.v8.split('.')[0] + electronRelease.v8.split('.')[1]; |
36 | 34 | ||
37 | const browserslistrcPath = path.resolve(process.cwd(), '.browserslistrc'); | 35 | const browserslistrcPath = resolve(process.cwd(), '.browserslistrc'); |
38 | 36 | ||
39 | return Promise.all([ | 37 | return Promise.all([ |
40 | writeFile( | 38 | writeFile( |
41 | './.electron-vendors.cache.json', | 39 | join(fileURLToDirname(import.meta.url), '../.electron-vendors.cache.json'), |
42 | JSON.stringify({ | 40 | JSON.stringify({ |
43 | chrome: chromeMajorVersion, | 41 | chrome: chromeMajorVersion, |
44 | node: nodeMajorVersion, | 42 | node: nodeMajorVersion, |
diff --git a/scripts/watch.js b/scripts/watch.js index d4229e9..82a8feb 100644 --- a/scripts/watch.js +++ b/scripts/watch.js | |||
@@ -1,20 +1,20 @@ | |||
1 | // @ts-check | 1 | import { build as esbuildBuild } from 'esbuild'; |
2 | import { spawn } from 'child_process'; | ||
3 | import { watch } from 'chokidar'; | ||
4 | import electronPath from 'electron'; | ||
5 | import { join } from 'path'; | ||
6 | import { createServer } from 'vite'; | ||
2 | 7 | ||
3 | const esbuild = require('esbuild'); | 8 | import { fileURLToDirname } from '../config/build-common.js'; |
4 | const { spawn } = require('child_process'); | ||
5 | const chokidar = require('chokidar'); | ||
6 | const electronPath = require('electron'); | ||
7 | const { join } = require('path'); | ||
8 | const { createServer } = require('vite'); | ||
9 | 9 | ||
10 | process.env.MODE = 'development'; | 10 | /** @type {string} */ |
11 | process.env.NODE_ENV = 'development'; | 11 | const thisDir = fileURLToDirname(import.meta.url); |
12 | 12 | ||
13 | /** @type {string} */ | 13 | /** @type {string} */ |
14 | const sharedModule = join(__dirname, '../packages/shared/dist/index.mjs'); | 14 | const sharedModule = join(thisDir, '../packages/shared/dist/index.mjs'); |
15 | 15 | ||
16 | /** @type {string} */ | 16 | /** @type {string} */ |
17 | const serviceSharedModule = join(__dirname, '../packages/service-shared/dist/index.mjs'); | 17 | const serviceSharedModule = join(thisDir, '../packages/service-shared/dist/index.mjs'); |
18 | 18 | ||
19 | /** @type {RegExp[]} */ | 19 | /** @type {RegExp[]} */ |
20 | const stderrIgnorePatterns = [ | 20 | const stderrIgnorePatterns = [ |
@@ -34,15 +34,17 @@ const stderrIgnorePatterns = [ | |||
34 | * @return {Promise<void>} | 34 | * @return {Promise<void>} |
35 | */ | 35 | */ |
36 | async function setupEsbuildWatcher(packageName, extraPaths, callback) { | 36 | async function setupEsbuildWatcher(packageName, extraPaths, callback) { |
37 | const config = require(`../packages/${packageName}/esbuild.config.js`); | 37 | /** @type {{ default: import('esbuild').BuildOptions }} */ |
38 | const { default: config } = await import(`../packages/${packageName}/esbuild.config.js`); | ||
38 | config.logLevel = 'info'; | 39 | config.logLevel = 'info'; |
39 | config.incremental = true; | 40 | config.incremental = true; |
40 | const incrementalBuild = await esbuild.build(config); | 41 | |
42 | const incrementalBuild = await esbuildBuild(config); | ||
41 | const paths = [ | 43 | const paths = [ |
42 | join(__dirname, `../packages/${packageName}/src`), | 44 | join(thisDir, `../packages/${packageName}/src`), |
43 | ...(extraPaths || []), | 45 | ...(extraPaths || []), |
44 | ]; | 46 | ]; |
45 | const watcher = chokidar.watch(paths, { | 47 | const watcher = watch(paths, { |
46 | ignored: /(^|[\/\\])\.|__(tests|mocks)__|\.(spec|test)\.[jt]sx?$/, | 48 | ignored: /(^|[\/\\])\.|__(tests|mocks)__|\.(spec|test)\.[jt]sx?$/, |
47 | ignoreInitial: true, | 49 | ignoreInitial: true, |
48 | persistent: true, | 50 | persistent: true, |
@@ -51,7 +53,7 @@ async function setupEsbuildWatcher(packageName, extraPaths, callback) { | |||
51 | callback(); | 53 | callback(); |
52 | } | 54 | } |
53 | watcher.on('change', () => { | 55 | watcher.on('change', () => { |
54 | incrementalBuild.rebuild().then(() => { | 56 | incrementalBuild.rebuild?.().then(() => { |
55 | if (callback) { | 57 | if (callback) { |
56 | console.log(`\u26a1 Reloading package ${packageName}`); | 58 | console.log(`\u26a1 Reloading package ${packageName}`); |
57 | callback(); | 59 | callback(); |
@@ -81,7 +83,7 @@ async function setupDevServer(packageName) { | |||
81 | clearScreen: false, | 83 | clearScreen: false, |
82 | }, | 84 | }, |
83 | }, | 85 | }, |
84 | configFile: join(__dirname, `../packages/${packageName}/vite.config.js`), | 86 | configFile: join(thisDir, `../packages/${packageName}/vite.config.js`), |
85 | }); | 87 | }); |
86 | await viteDevServer.listen(); | 88 | await viteDevServer.listen(); |
87 | return viteDevServer; | 89 | return viteDevServer; |
@@ -158,6 +160,9 @@ function setupMainPackageWatcher(viteDevServer) { | |||
158 | * @returns {Promise<void>} | 160 | * @returns {Promise<void>} |
159 | */ | 161 | */ |
160 | async function setupDevEnvironment() { | 162 | async function setupDevEnvironment() { |
163 | process.env.MODE = 'development'; | ||
164 | process.env.NODE_ENV = 'development'; | ||
165 | |||
161 | /** @type {import('vite').ViteDevServer | null} */ | 166 | /** @type {import('vite').ViteDevServer | null} */ |
162 | let viteDevServer = null; | 167 | let viteDevServer = null; |
163 | /** @type {(event: import('vite').HMRPayload) => void} */ | 168 | /** @type {(event: import('vite').HMRPayload) => void} */ |
@@ -182,6 +187,11 @@ async function setupDevEnvironment() { | |||
182 | ])), | 187 | ])), |
183 | ]); | 188 | ]); |
184 | 189 | ||
190 | if (viteDevServer === null) { | ||
191 | console.error('Failed to create vite dev server'); | ||
192 | return; | ||
193 | } | ||
194 | |||
185 | console.log('\ud83c\udf80 Sophie is starting up') | 195 | console.log('\ud83c\udf80 Sophie is starting up') |
186 | return setupMainPackageWatcher(viteDevServer); | 196 | return setupMainPackageWatcher(viteDevServer); |
187 | } | 197 | } |
diff --git a/tsconfig.json b/tsconfig.json index 270616b..dfffc9d 100644 --- a/tsconfig.json +++ b/tsconfig.json | |||
@@ -1,7 +1,7 @@ | |||
1 | { | 1 | { |
2 | "compilerOptions": { | 2 | "compilerOptions": { |
3 | "module": "esnext", | 3 | "module": "es2022", |
4 | "target": "esnext", | 4 | "target": "es2021", |
5 | "moduleResolution": "node", | 5 | "moduleResolution": "node", |
6 | "esModuleInterop": true, | 6 | "esModuleInterop": true, |
7 | "allowSyntheticDefaultImports": true, | 7 | "allowSyntheticDefaultImports": true, |
@@ -11,6 +11,7 @@ | |||
11 | "exactOptionalPropertyTypes": true, | 11 | "exactOptionalPropertyTypes": true, |
12 | "isolatedModules": true, | 12 | "isolatedModules": true, |
13 | "skipLibCheck": true, | 13 | "skipLibCheck": true, |
14 | "checkJs": true, | ||
14 | "lib": [ | 15 | "lib": [ |
15 | "esnext" | 16 | "esnext" |
16 | ] | 17 | ] |