diff --git a/forge.config.ts b/forge.config.cts similarity index 97% rename from forge.config.ts rename to forge.config.cts index 90b9c5c8b..2b795dce5 100644 --- a/forge.config.ts +++ b/forge.config.cts @@ -9,10 +9,12 @@ import { FusesPlugin } from '@electron-forge/plugin-fuses'; import { FuseV1Options, FuseVersion } from '@electron/fuses'; import * as path from 'node:path'; import packageJson from './package.json'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; const { version } = packageJson; -const iconDir = path.resolve(__dirname, 'assets', 'icons'); +const iconDir = path.resolve('assets', 'icons'); console.log("forge.config.ts iconDir: ", iconDir); const packagerConfig: ForgePackagerOptions = { diff --git a/forge.env.d.ts b/forge.env.d.ts index 8cbf19d3c..590242b94 100644 --- a/forge.env.d.ts +++ b/forge.env.d.ts @@ -1,4 +1,4 @@ -export {}; // Make this a module +export type {}; // Make this a module declare global { // This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Vite diff --git a/package-lock.json b/package-lock.json index 17bd56407..a1adeb931 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "vite": "^5.2.8", "vite-plugin-svgr": "^4.2.0", "vitest": "^1.5.0", - "wdio-electron-service": "^6.3.1", + "wdio-electron-service": "^6.4.1", "wdio-wait-for": "^3.0.11" } }, diff --git a/package.json b/package.json index d03dd289b..858787708 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Run a node at home, the easy way.", "homepage": "https://nicenode.xyz", "productName": "NiceNode", + "type": "module", "main": ".vite/build/main.js", "scripts": { "start": "electron-forge start", @@ -75,7 +76,7 @@ "vite": "^5.2.8", "vite-plugin-svgr": "^4.2.0", "vitest": "^1.5.0", - "wdio-electron-service": "^6.3.1", + "wdio-electron-service": "^6.4.1", "wdio-wait-for": "^3.0.11" }, "dependencies": { diff --git a/src/__tests__/node/childProcess.test.ts b/src/__tests__/node/childProcess.test.ts index 32d938ad1..5d9ead47d 100644 --- a/src/__tests__/node/childProcess.test.ts +++ b/src/__tests__/node/childProcess.test.ts @@ -1,6 +1,9 @@ import { type SpawnOptions, spawn } from 'node:child_process'; import sleep from 'await-sleep'; import { describe, expect, it } from 'vitest'; +import * as url from 'node:url'; + +const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); // setTimeout(10000); describe('Nodejs process testing', () => { diff --git a/src/main/docker/docker.ts b/src/main/docker/docker.ts index b2bd15976..72cd53f8f 100644 --- a/src/main/docker/docker.ts +++ b/src/main/docker/docker.ts @@ -4,6 +4,7 @@ import { spawn, } from 'node:child_process'; import path from 'node:path'; +import url from 'node:url'; import * as readline from 'node:readline'; import { Docker, Options } from 'docker-cli-js'; @@ -25,6 +26,9 @@ import * as dockerCompose from './docker-compose'; // stdin: undefined, // }; +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + + const options = new Options( undefined, path.join(__dirname), diff --git a/src/main/files.ts b/src/main/files.ts index 1e9ceed5a..ce656823f 100644 --- a/src/main/files.ts +++ b/src/main/files.ts @@ -1,5 +1,6 @@ import { access, chmod, mkdir, readFile, rm } from 'node:fs/promises'; import path from 'node:path'; +import url from 'node:url'; import checkDiskSpace from 'check-disk-space'; import { app } from 'electron'; @@ -12,6 +13,9 @@ logger.info(`App data dir: ${app.getPath('appData')}`); logger.info(`User data dir: ${app.getPath('userData')}`); logger.info(`logs dir: ${app.getPath('logs')}`); +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + + export const getNNDirPath = (): string => { // In packaged build... // Linux: ~/.config/NiceNode diff --git a/src/main/main.ts b/src/main/main.ts index 199e3626f..3378a6be1 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -7,6 +7,7 @@ * `./src/main.js` using webpack. This gives us some performance wins. */ import path from 'node:path'; +import url from 'node:url'; import * as Sentry from '@sentry/electron/main'; import dotenv from 'dotenv'; import { BrowserWindow, app, shell } from 'electron'; @@ -46,10 +47,11 @@ if (process.env.NODE_ENV === 'development') { // require('wdio-electron-service/main'); // } +// todo: Turned off when switching to ESM modules. Do we need this? // https://www.electronforge.io/config/makers/squirrel.windows#handling-startup-events -if (require('electron-squirrel-startup')) { - app.quit(); -} +// if (require('electron-squirrel-startup')) { +// app.quit(); +// } // fixPathEnvVar(); logger.info(`NICENODE_ENV: ${process.env.NICENODE_ENV}`); @@ -78,13 +80,21 @@ const isDevelopment = // require('electron-debug')(); // } +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + +console.log('electron.app.getAppPath(): ', app.getAppPath()); +const preloadPath = path.resolve(app.getAppPath(), '.vite/build/preload.js') +console.log('preloadPath:', preloadPath) + // __dirname = package.json dir or app.asar in build. works in dev and built app. -const RESOURCES_PATH = app.isPackaged - ? path.join(__dirname) - : path.join(__dirname, '..', '..', 'assets'); // starting point: .vite/build/main.js +// electron.app.getAppPath() = ../../__dirname (I think .vite/build/__dirname) +// const RESOURCES_PATH = app.isPackaged +// ? path.join(__dirname) +// : path.join(__dirname, '..', '..', 'assets'); // starting point: .vite/build/main.js +const RESOURCES_PATH = __dirname const getAssetPath = (...paths: string[]): string => { - logger.log('RESOURCES_PATH: ', RESOURCES_PATH); + logger.info('RESOURCES_PATH: ', RESOURCES_PATH); return path.join(RESOURCES_PATH, ...paths); }; diff --git a/src/main/podman/podman-desktop/util.ts b/src/main/podman/podman-desktop/util.ts index fcde2f313..d20456c32 100644 --- a/src/main/podman/podman-desktop/util.ts +++ b/src/main/podman/podman-desktop/util.ts @@ -19,8 +19,11 @@ import { spawn } from 'node:child_process'; import * as os from 'node:os'; import * as path from 'node:path'; +import url from 'node:url'; import { getInstallationPath } from './podman-cli'; +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + const windows = os.platform() === 'win32'; export function isWindows(): boolean { return windows; diff --git a/src/main/util.ts b/src/main/util.ts index 4d955271c..f163e0433 100644 --- a/src/main/util.ts +++ b/src/main/util.ts @@ -1,5 +1,8 @@ import path from 'node:path'; import { URL } from 'node:url'; +import url from 'node:url'; + +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); export function resolveHtmlPath(htmlFileName: string) { if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { diff --git a/tsconfig.json b/tsconfig.json index b967aaa8f..950ef9c18 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ { "compilerOptions": { "target": "ESNext", - "module": "commonjs", + "module": "nodenext", "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, @@ -11,10 +11,10 @@ "sourceMap": true, "baseUrl": ".", "outDir": "dist", - "moduleResolution": "node", + "moduleResolution": "nodenext", "resolveJsonModule": true, - "jsx": "react-jsx" + "jsx": "react-jsx", // not in vite template but was in previously // "declaration": true, @@ -43,7 +43,12 @@ // skip because github's macos-latest was checking lib types // "skipLibCheck": true, // todo: when using electron apis in e2e tests - // "types": ["@wdio/globals/types", "wdio-electron-service", "@wdio/types"], + "types": [ + "@wdio/globals/types", + "wdio-electron-service", + "@wdio/types", + "mocha" + ] // "typeRoots": ["./node_modules", "./node_modules/@types", "./@types"] }, // not in vite template but was in previously diff --git a/vite.main.config.ts b/vite.main.config.ts index ef27bee8a..b2b11fa8a 100644 --- a/vite.main.config.ts +++ b/vite.main.config.ts @@ -1,6 +1,6 @@ import type { ConfigEnv, UserConfig } from 'vite'; import { defineConfig, mergeConfig } from 'vite'; -import { getBuildConfig, getBuildDefine, external, pluginHotRestart } from './vite.base.config'; +import { getBuildConfig, getBuildDefine, external, pluginHotRestart } from './vite.base.config.js'; console.log("vite.main.config.ts"); @@ -14,7 +14,7 @@ export default defineConfig((env) => { lib: { entry: forgeConfigSelf.entry!, fileName: () => '[name].js', - formats: ['cjs'], + formats: ['es'], }, rollupOptions: { external, diff --git a/vite.preload.config.ts b/vite.preload.config.ts index 3c2b52ce2..39ab0c7c6 100644 --- a/vite.preload.config.ts +++ b/vite.preload.config.ts @@ -1,6 +1,6 @@ import type { ConfigEnv, UserConfig } from 'vite'; import { defineConfig, mergeConfig } from 'vite'; -import { getBuildConfig, external, pluginHotRestart } from './vite.base.config'; +import { getBuildConfig, external, pluginHotRestart } from './vite.base.config.js'; console.log("vite.preload.config.ts"); diff --git a/vite.renderer.config.ts b/vite.renderer.config.ts index ee3b63bdf..50987b3d1 100644 --- a/vite.renderer.config.ts +++ b/vite.renderer.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'vite'; import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import svgr from "vite-plugin-svgr"; -import { pluginExposeRenderer } from './vite.base.config'; +import { pluginExposeRenderer } from './vite.base.config.js'; console.log("vite.renderer.config.ts"); diff --git a/wdio.conf.ts b/wdio.conf.ts index 16a7db2e3..e826ff947 100644 --- a/wdio.conf.ts +++ b/wdio.conf.ts @@ -1,6 +1,7 @@ /// import type { Options } from '@wdio/types'; import path from 'node:path'; +import process from 'node:process'; console.log("process.arch: ", process.arch); const arch = process.arch || 'x64'; @@ -11,7 +12,7 @@ if (process.platform === 'darwin') { } else if(process.platform === 'linux') { appBinaryPath = `./out/NiceNode-linux-${arch}/nice-node` } else { - appBinaryPath = path.join(__dirname, 'out', `NiceNode-win32-${arch}`, 'nice-node.exe') + appBinaryPath = path.join('out', `NiceNode-win32-${arch}`, 'nice-node.exe') } export const config: Options.Testrunner = { @@ -21,13 +22,6 @@ export const config: Options.Testrunner = { // ==================== // WebdriverIO supports running e2e tests as well as unit and component tests. runner: 'local', - autoCompileOpts: { - autoCompile: true, - tsNodeOpts: { - project: './test/tsconfig.json', - transpileOnly: true, - }, - }, // // ==================