diff --git a/.changeset/config.release-v27.json b/.changeset/config.release-v27.json new file mode 100644 index 00000000000..a5d628bbcf7 --- /dev/null +++ b/.changeset/config.release-v27.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": ["changesets-changelog-clean", { "repo": "electron-userland/electron-builder" }], + "commit": false, + "linked": [[ + "app-builder-lib", + "builder-util", + "dmg-builder", + "electron-builder", + "electron-builder-squirrel-windows", + "electron-publish" + ]], + "access": "public", + "baseBranch": "release/v27", + "updateInternalDependencies": "patch", + "ignore": [ + "electron-forge-maker-appimage", + "electron-forge-maker-nsis", + "electron-forge-maker-nsis-web", + "electron-forge-maker-snap", + "@electron-builder/test" + ] +} \ No newline at end of file diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000000..bb23527de2d --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,20 @@ +{ + "mode": "pre", + "tag": "alpha", + "initialVersions": { + "app-builder-lib": "26.8.0", + "builder-util": "26.8.0", + "builder-util-runtime": "9.5.1", + "dmg-builder": "26.8.0", + "electron-builder": "26.8.0", + "electron-builder-squirrel-windows": "26.8.0", + "electron-forge-maker-appimage": "26.8.0", + "electron-forge-maker-nsis": "26.8.0", + "electron-forge-maker-nsis-web": "26.8.0", + "electron-forge-maker-snap": "26.8.0", + "electron-publish": "26.8.0", + "electron-updater": "6.8.3", + "@electron-builder/test": "0.0.0" + }, + "changesets": [] +} diff --git a/.changeset/small-times-scream.md b/.changeset/small-times-scream.md new file mode 100644 index 00000000000..891d81b92c1 --- /dev/null +++ b/.changeset/small-times-scream.md @@ -0,0 +1,12 @@ +--- +"electron-builder-squirrel-windows": major +"builder-util-runtime": major +"electron-builder": major +"electron-publish": major +"electron-updater": major +"app-builder-lib": major +"builder-util": major +"dmg-builder": major +--- + +chore(node): migrating to ESM and updating all engines to node 22 to support latest versions of `electron/*` packages diff --git a/.github/workflows/pr-release.yml b/.github/workflows/pr-release.yml index 5760d99c01e..c1ea8e12ec8 100644 --- a/.github/workflows/pr-release.yml +++ b/.github/workflows/pr-release.yml @@ -4,7 +4,8 @@ on: push: branches: - master - - release/v* + - release/v27 + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false diff --git a/package.json b/package.json index 10df28e9b50..90761288a40 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "///": "Please see https://github.com/electron-userland/electron-builder/blob/master/CONTRIBUTING.md#run-test-using-cli how to run particular test instead full (and very slow) run", "test-all": "pnpm compile && pnpm pretest && pnpm ci:test", "test-linux": "docker run --rm -e CI=${CI:-false} -e DEBUG=${DEBUG:-} -e VITEST_SHARD_INDEX=${VITEST_SHARD_INDEX:-} -e VITEST_SHARD_COUNT=${VITEST_SHARD_COUNT:-} -e UPDATE_SNAPSHOT=\"${UPDATE_SNAPSHOT:-false}\" -e TEST_FILES=\"${TEST_FILES:-}\" -w /project -v $(pwd):/project -v $(pwd)-node-modules:/project/node_modules -v $HOME/Library/Caches/electron:/root/.cache/electron -v $HOME/Library/Caches/electron-builder:/root/.cache/electron-builder ${ADDITIONAL_DOCKER_ARGS} ${TEST_RUNNER_IMAGE_TAG:-electronuserland/builder:22-wine-mono} /bin/bash -c \"bash ./docker/test-in-docker.sh\"", - "ci:test": "ts-node test/vitest-scripts/run-vitest.ts", - "ci:test:count": "ts-node test/vitest-scripts/smart-shard-count.ts", + "ci:test": "tsx test/vitest-scripts/run-vitest.ts", + "ci:test:count": "tsx test/vitest-scripts/smart-shard-count.ts", "ci:validate": "pnpm compile && pnpm pretest && pnpm generate-all", "ci:version": "pnpm i && pnpm changelog && changeset version && node scripts/update-package-version-export.js && pnpm compile && pnpm generate-all && git add .", "ci:publish": "pnpm i && pnpm compile && pnpm publish -r --tag ${NPM_DIST_TAG:-next} && changeset tag", @@ -21,10 +21,10 @@ "docker-push": "docker/push.sh", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md", "generate-changeset": "pnpm changeset", - "generate-schema": "typescript-json-schema packages/app-builder-lib/tsconfig-scheme.json Configuration --out packages/app-builder-lib/scheme.json --noExtraProps --useTypeOfKeyword --strictNullChecks --required && node ./scripts/fix-schema.js", + "generate-schema": "tsx scripts/generate-schema.ts", "generate-all": "pnpm generate-schema && pnpm prettier", "docs:prebuild": "docker build -t mkdocs-dockerfile -f mkdocs-dockerfile . ", - "docs:build": "pnpm compile && ts-node scripts/renderer/src/typedoc2html.ts", + "docs:build": "pnpm compile && tsx scripts/renderer/src/typedoc2html.ts", "docs:mkdocs": "docker run --rm -v ${PWD}:/docs -v ${PWD}/site:/site mkdocs-dockerfile build", "docs:preview": "open ./site/index.html", "docs:all": "pnpm docs:prebuild && pnpm docs:build && pnpm docs:mkdocs" @@ -40,6 +40,7 @@ "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.37.0", "@stylistic/eslint-plugin": "^2.8.0", + "@tsconfig/node22": "^22.0.5", "@types/node": "^22.7.4", "@typescript-eslint/eslint-plugin": "8.17.0", "@typescript-eslint/parser": "8.17.0", @@ -51,10 +52,10 @@ "eslint": "9.39.2", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", - "fs-extra": "10.1.0", + "fs-extra": "^11.3.4", "is-ci": "^4.1.0", "prettier": "3.7.4", - "ts-node": "^10.9.2", + "tsx": "^4.21.0", "typedoc": "^0.26.7", "typedoc-plugin-markdown": "4.2.8", "typescript": "^5.6.2", @@ -62,7 +63,7 @@ "vitest": "^3.2.2" }, "engines": { - "node": ">=14.14", + "node": ">=22.12.0", "pnpm": ">=10" }, "packageManager": "pnpm@10.18.0+sha512.e804f889f1cecc40d572db084eec3e4881739f8dec69c0ff10d2d1beff9a4e309383ba27b5b750059d7f4c149535b6cd0d2cb1ed3aeb739239a4284a68f40cfa", diff --git a/packages/app-builder-lib/helpers/dynamic-import.cjs b/packages/app-builder-lib/helpers/dynamic-import.cjs new file mode 100644 index 00000000000..1089411ced3 --- /dev/null +++ b/packages/app-builder-lib/helpers/dynamic-import.cjs @@ -0,0 +1,23 @@ +const url = require("url") +const fs = require("fs") + +exports.dynamicImport = async function dynamicImport(path) { + try { + return await import(fs.existsSync(path) ? url.pathToFileURL(path).href : path) + } catch (error) { + return Promise.reject(error) + } +} + +exports.dynamicImportMaybe = async function dynamicImportMaybe(path) { + try { + return require(path) + } catch (e1) { + try { + return await exports.dynamicImport(path) + } catch (e2) { + e1.message = "\n1. " + e1.message + "\n2. " + e2.message + throw e1 + } + } +} diff --git a/packages/app-builder-lib/helpers/dynamic-import.js b/packages/app-builder-lib/helpers/dynamic-import.js index 1089411ced3..316caeb7143 100644 --- a/packages/app-builder-lib/helpers/dynamic-import.js +++ b/packages/app-builder-lib/helpers/dynamic-import.js @@ -1,20 +1,24 @@ -const url = require("url") -const fs = require("fs") +import { createRequire } from "node:module" +import { pathToFileURL } from "node:url" +import { existsSync } from "node:fs" -exports.dynamicImport = async function dynamicImport(path) { +const require = createRequire(import.meta.url) + +export async function dynamicImport(path) { try { - return await import(fs.existsSync(path) ? url.pathToFileURL(path).href : path) + return await import(existsSync(path) ? pathToFileURL(path).href : path) } catch (error) { return Promise.reject(error) } } -exports.dynamicImportMaybe = async function dynamicImportMaybe(path) { +/** Like {@link dynamicImport()}, except it tries out {@link require()} first. */ +export async function dynamicImportMaybe(path) { try { return require(path) } catch (e1) { try { - return await exports.dynamicImport(path) + return await dynamicImport(path) } catch (e2) { e1.message = "\n1. " + e1.message + "\n2. " + e2.message throw e1 diff --git a/packages/app-builder-lib/helpers/remote-rebuild.cjs b/packages/app-builder-lib/helpers/remote-rebuild.cjs new file mode 100644 index 00000000000..7d82d390e5f --- /dev/null +++ b/packages/app-builder-lib/helpers/remote-rebuild.cjs @@ -0,0 +1,36 @@ +if (!process.send) { + console.error("The remote rebuilder expects to be spawned with an IPC channel") + process.exit(1) +} + +const rebuilder = rebuilder => { + rebuilder.lifecycle.on("module-found", moduleName => process.send?.({ msg: "module-found", moduleName })) + rebuilder.lifecycle.on("module-done", moduleName => process.send?.({ msg: "module-done", moduleName })) + rebuilder.lifecycle.on("module-skip", moduleName => process.send?.({ msg: "module-skip", moduleName })) + + return rebuilder + .then(() => { + process.send?.({ msg: "rebuild-done" }) + return process.exit(0) + }) + .catch(err => { + process.send?.({ + msg: "rebuild-error", + err: { + message: err.message, + stack: err.stack, + }, + }) + process.exit(0) + }) +} + +const main = async () => { + const options = JSON.parse(process.argv[2]) + return import("@electron/rebuild").then(module => { + const { rebuild } = module + return rebuilder(rebuild(options)) + }) +} + +main() diff --git a/packages/app-builder-lib/helpers/remote-rebuild.js b/packages/app-builder-lib/helpers/remote-rebuild.js index 58fea60009c..7d82d390e5f 100644 --- a/packages/app-builder-lib/helpers/remote-rebuild.js +++ b/packages/app-builder-lib/helpers/remote-rebuild.js @@ -25,11 +25,9 @@ const rebuilder = rebuilder => { }) } -const main = () => { +const main = async () => { const options = JSON.parse(process.argv[2]) - - const dynamicImport = require("./dynamic-import").dynamicImportMaybe - return dynamicImport("@electron/rebuild").then(module => { + return import("@electron/rebuild").then(module => { const { rebuild } = module return rebuilder(rebuild(options)) }) diff --git a/packages/app-builder-lib/package.json b/packages/app-builder-lib/package.json index f10e80248bb..ce1a1c1cc66 100644 --- a/packages/app-builder-lib/package.json +++ b/packages/app-builder-lib/package.json @@ -1,8 +1,12 @@ { "name": "app-builder-lib", "description": "electron-builder lib", - "version": "26.9.0", - "main": "out/index.js", + "version": "26.8.2", + "type": "module", + "exports": { + ".": "./out/index.js", + "./internal": "./out/indexInternal.js" + }, "files": [ "out", "templates", @@ -56,7 +60,6 @@ "@electron/rebuild": "^4.0.3", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "builder-util": "workspace:*", "builder-util-runtime": "workspace:*", @@ -67,7 +70,7 @@ "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "workspace:*", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", @@ -106,6 +109,7 @@ "@babel/preset-env": "7.24.8", "@babel/preset-react": "7.24.7", "@types/debug": "4.1.7", + "@types/fs-extra": "9.0.13", "@types/ejs": "3.1.0", "@types/hosted-git-info": "3.0.2", "@types/js-yaml": "4.0.3", @@ -123,5 +127,5 @@ "electron-builder-squirrel-windows": "workspace:*" }, "//": "electron-builder-squirrel-windows and dmg-builder added as dev dep for tests (as otherwise `require` doesn't work using Yarn 2)", - "typings": "./out/index.d.ts" + "types": "./out/index.d.ts" } diff --git a/packages/app-builder-lib/src/Framework.ts b/packages/app-builder-lib/src/Framework.ts index a875efe8c1e..1b80ec53f38 100644 --- a/packages/app-builder-lib/src/Framework.ts +++ b/packages/app-builder-lib/src/Framework.ts @@ -1,6 +1,9 @@ import { FileTransformer } from "builder-util" -import { AsarIntegrity } from "./asar/integrity" -import { AfterPackContext, ElectronPlatformName, Platform, PlatformPackager } from "./index" +import { AsarIntegrity } from "./asar/integrity.js" +import { AfterPackContext } from "./configuration.js" +import { Platform } from "./core.js" +import { ElectronPlatformName } from "./electron/ElectronFramework.js" +import type { PlatformPackager } from "./platformPackager.js" export interface Framework { readonly name: string diff --git a/packages/app-builder-lib/src/ProtonFramework.ts b/packages/app-builder-lib/src/ProtonFramework.ts index ebf1b2efb71..12c0d7d23f8 100644 --- a/packages/app-builder-lib/src/ProtonFramework.ts +++ b/packages/app-builder-lib/src/ProtonFramework.ts @@ -1,9 +1,12 @@ +import { createRequire } from "node:module" import { FileTransformer, log } from "builder-util" + +const require = createRequire(import.meta.url) import { safeStringifyJson } from "builder-util-runtime" -import { Platform } from "./core" -import { NODE_MODULES_PATTERN } from "./fileTransformer" -import { LibUiFramework } from "./frameworks/LibUiFramework" -import { getTemplatePath } from "./util/pathManager" +import { Platform } from "./core.js" +import { NODE_MODULES_PATTERN } from "./fileTransformer.js" +import { LibUiFramework } from "./frameworks/LibUiFramework.js" +import { getTemplatePath } from "./util/pathManager.js" export class ProtonFramework extends LibUiFramework { readonly name = "proton" diff --git a/packages/app-builder-lib/src/appInfo.ts b/packages/app-builder-lib/src/appInfo.ts index 1b053977d64..3cb6b2435e2 100644 --- a/packages/app-builder-lib/src/appInfo.ts +++ b/packages/app-builder-lib/src/appInfo.ts @@ -1,10 +1,10 @@ import { isEmptyOrSpaces, log } from "builder-util" +import { sanitizeFileName } from "builder-util/internal" import { Nullish } from "builder-util-runtime" -import { sanitizeFileName } from "builder-util/out/filename" import { prerelease } from "semver" -import { PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions" -import { Packager } from "./packager" -import { expandMacro } from "./util/macroExpander" +import { PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions.js" +import { Packager } from "./packager.js" +import { expandMacro } from "./util/macroExpander.js" // fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote // http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/ @@ -21,7 +21,7 @@ export function smarten(s: string): string { } export class AppInfo { - readonly description = smarten(this.info.metadata.description || "") + readonly description: string readonly version: string readonly type: string | undefined readonly shortVersion: string | undefined @@ -40,6 +40,7 @@ export class AppInfo { private readonly platformSpecificOptions: PlatformSpecificBuildOptions | null = null, normalizeNfd = false ) { + this.description = smarten(this.info.metadata.description || "") this.version = info.metadata.version! this.type = info.metadata.type diff --git a/packages/app-builder-lib/src/asar/asar.ts b/packages/app-builder-lib/src/asar/asar.ts index b86d3cdd41a..ac08625e5c9 100644 --- a/packages/app-builder-lib/src/asar/asar.ts +++ b/packages/app-builder-lib/src/asar/asar.ts @@ -1,5 +1,5 @@ -import { createFromBuffer } from "chromium-pickle-js" -import { close, open, read, readFile, Stats } from "fs-extra" +import * as chromiumPickleJs from "chromium-pickle-js" +import fsExtra from "fs-extra" import * as path from "path" export interface ReadAsarHeader { @@ -88,7 +88,7 @@ export class AsarFilesystem { return result } - addFileNode(file: string, dirNode: Node, size: number, unpacked: boolean, stat: Stats, integrity?: NodeIntegrity): Node { + addFileNode(file: string, dirNode: Node, size: number, unpacked: boolean, stat: fsExtra.Stats, integrity?: NodeIntegrity): Node { if (size > 4294967295) { throw new Error(`${file}: file size cannot be larger than 4.2GB`) } @@ -147,26 +147,26 @@ export class AsarFilesystem { } export async function readAsarHeader(archive: string): Promise { - const fd = await open(archive, "r") + const fd = await fsExtra.open(archive, "r") let size: number let headerBuf try { const sizeBuf = Buffer.allocUnsafe(8) - if ((await read(fd, sizeBuf, 0, 8, null as any)).bytesRead !== 8) { + if ((await fsExtra.read(fd, sizeBuf, 0, 8, null as any)).bytesRead !== 8) { throw new Error("Unable to read header size") } - const sizePickle = createFromBuffer(sizeBuf) + const sizePickle = chromiumPickleJs.createFromBuffer(sizeBuf) size = sizePickle.createIterator().readUInt32() headerBuf = Buffer.allocUnsafe(size) - if ((await read(fd, headerBuf, 0, size, null as any)).bytesRead !== size) { + if ((await fsExtra.read(fd, headerBuf, 0, size, null as any)).bytesRead !== size) { throw new Error("Unable to read header") } } finally { - await close(fd) + await fsExtra.close(fd) } - const headerPickle = createFromBuffer(headerBuf) + const headerPickle = chromiumPickleJs.createFromBuffer(headerBuf) return { header: headerPickle.createIterator().readString(), size } } @@ -188,15 +188,15 @@ async function readFileFromAsar(filesystem: AsarFilesystem, filename: string, in } if (info.unpacked) { - return await readFile(path.join(`${filesystem.src}.unpacked`, filename)) + return await fsExtra.readFile(path.join(`${filesystem.src}.unpacked`, filename)) } - const fd = await open(filesystem.src, "r") + const fd = await fsExtra.open(filesystem.src, "r") try { const offset = 8 + filesystem.headerSize + parseInt(info.offset!, 10) - await read(fd, buffer, 0, size, offset) + await fsExtra.read(fd, buffer, 0, size, offset) } finally { - await close(fd) + await fsExtra.close(fd) } return buffer } diff --git a/packages/app-builder-lib/src/asar/asarFileChecker.ts b/packages/app-builder-lib/src/asar/asarFileChecker.ts index da9daa56a9a..16e44783fd5 100644 --- a/packages/app-builder-lib/src/asar/asarFileChecker.ts +++ b/packages/app-builder-lib/src/asar/asarFileChecker.ts @@ -1,5 +1,5 @@ import * as asar from "@electron/asar" -import { FilesystemEntry, FilesystemFileEntry } from "@electron/asar/lib/filesystem" +import { FilesystemEntry, FilesystemFileEntry } from "@electron/asar/lib/filesystem.js" export function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string) { function error(text: string) { diff --git a/packages/app-builder-lib/src/asar/asarUtil.ts b/packages/app-builder-lib/src/asar/asarUtil.ts index 4a52b02c1c6..77e7f7c0947 100644 --- a/packages/app-builder-lib/src/asar/asarUtil.ts +++ b/packages/app-builder-lib/src/asar/asarUtil.ts @@ -1,15 +1,14 @@ -import { createPackageFromStreams, AsarStreamType, AsarDirectory } from "@electron/asar" -import { isEmptyOrSpaces, log } from "builder-util" -import { exists, Filter, FilterStats } from "builder-util/out/fs" -import * as fs from "fs-extra" -import { readlink } from "fs-extra" +import { AsarDirectory, AsarStreamType, createPackageFromStreams } from "@electron/asar" +import { exists, Filter, FilterStats, isEmptyOrSpaces, log } from "builder-util" +import * as fs from "fs/promises" +import fsExtra from "fs-extra" +import * as os from "os" import * as path from "path" -import { AsarOptions } from "../options/PlatformSpecificBuildOptions" -import { PlatformPackager } from "../platformPackager" -import { ResolvedFileSet, getDestinationPath } from "../util/appFileCopier" -import { detectUnpackedDirs } from "./unpackDetector" import { Readable } from "stream" -import * as os from "os" +import { AsarOptions } from "../options/PlatformSpecificBuildOptions.js" +import { PlatformPackager } from "../platformPackager.js" +import { getDestinationPath, ResolvedFileSet } from "../util/appFileCopier.js" +import { detectUnpackedDirs } from "./unpackDetector.js" const resolvePath = async (file: string | undefined): Promise => (file && (await exists(file)) ? fs.realpath(file).catch(() => path.resolve(file)) : undefined) const resolvePaths = async (filepaths: (string | undefined)[]) => { @@ -197,7 +196,7 @@ export class AsarPackager { private async processFileOrSymlink(options: { file: string destination: string - stat: fs.Stats + stat: fsExtra.Stats fileSet: ResolvedFileSet transformedData: string | Buffer | undefined isUnpacked: (dir: string, file?: string, stat?: FilterStats) => boolean @@ -233,7 +232,7 @@ export class AsarPackager { const baseConfig = { path: destination, - streamGenerator: () => fs.createReadStream(file), + streamGenerator: () => fsExtra.createReadStream(file), unpacked, stat, } @@ -244,7 +243,7 @@ export class AsarPackager { } // Handle symlinks - make relative to source location - let link = await readlink(file) + let link = await fsExtra.readlink(file) if (path.isAbsolute(link)) { link = path.relative(path.dirname(file), link) } diff --git a/packages/app-builder-lib/src/asar/integrity.ts b/packages/app-builder-lib/src/asar/integrity.ts index 10012924b94..868285d10db 100644 --- a/packages/app-builder-lib/src/asar/integrity.ts +++ b/packages/app-builder-lib/src/asar/integrity.ts @@ -2,8 +2,8 @@ import { FilterStats, log, statOrNull, walk } from "builder-util" import { createHash } from "crypto" import { readdir } from "fs/promises" import * as path from "path" -import { FileMatcher } from "../fileMatcher" -import { readAsarHeader } from "./asar" +import { FileMatcher } from "../fileMatcher.js" +import { readAsarHeader } from "./asar.js" export interface AsarIntegrityOptions { readonly resourcesPath: string diff --git a/packages/app-builder-lib/src/asar/unpackDetector.ts b/packages/app-builder-lib/src/asar/unpackDetector.ts index fce460c4c2d..5be0d6d2c88 100644 --- a/packages/app-builder-lib/src/asar/unpackDetector.ts +++ b/packages/app-builder-lib/src/asar/unpackDetector.ts @@ -1,7 +1,7 @@ import { FilterStats, log } from "builder-util" import { isBinaryFileSync } from "isbinaryfile" import * as path from "path" -import { ResolvedFileSet } from "../util/appFileCopier" +import { ResolvedFileSet } from "../util/appFileCopier.js" export function isLibOrExe(file: string): boolean { // https://github.com/electron-userland/electron-builder/issues/3038 diff --git a/packages/app-builder-lib/src/binDownload.ts b/packages/app-builder-lib/src/binDownload.ts index a676c2b7737..7f610f08d7a 100644 --- a/packages/app-builder-lib/src/binDownload.ts +++ b/packages/app-builder-lib/src/binDownload.ts @@ -1,9 +1,9 @@ import * as get from "@electron/get" import { ElectronDownloadCacheMode, ElectronDownloadRequest, ElectronDownloadRequestOptions, GotDownloaderOptions } from "@electron/get" import { executeAppBuilder, exists, log, PADDING } from "builder-util" +import { sanitizeFileName } from "builder-util/internal" import { Nullish } from "builder-util-runtime" -import { sanitizeFileName } from "builder-util/out/filename" -import { MultiProgress } from "electron-publish/out/multiProgress" +import { MultiProgress } from "electron-publish/internal" import * as fs from "fs/promises" import * as os from "os" import * as path from "path" diff --git a/packages/app-builder-lib/src/codeSign/codesign.ts b/packages/app-builder-lib/src/codeSign/codesign.ts index 4a8d0e2d292..408d7ac7d63 100644 --- a/packages/app-builder-lib/src/codeSign/codesign.ts +++ b/packages/app-builder-lib/src/codeSign/codesign.ts @@ -1,9 +1,9 @@ import { InvalidConfigurationError, statOrNull } from "builder-util" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { homedir } from "os" import * as path from "path" import { TmpDir } from "temp-file" -import { download } from "../binDownload" +import { download } from "../binDownload.js" /** @private */ export async function importCertificate(cscLink: string, tmpDir: TmpDir, currentDir: string): Promise { @@ -24,7 +24,7 @@ export async function importCertificate(cscLink: string, tmpDir: TmpDir, current const mimeType = /data:.*;base64,/.exec(cscLink)?.[0] if (mimeType || cscLink.length > 2048 || cscLink.endsWith("=")) { const tempFile = await tmpDir.getTempFile({ suffix: ".p12" }) - await outputFile(tempFile, Buffer.from(cscLink.substring(mimeType?.length ?? 0), "base64")) + await fsExtra.outputFile(tempFile, Buffer.from(cscLink.substring(mimeType?.length ?? 0), "base64")) return tempFile } file = cscLink diff --git a/packages/app-builder-lib/src/codeSign/macCodeSign.ts b/packages/app-builder-lib/src/codeSign/macCodeSign.ts index 20b838848df..d3dca1ad0c4 100644 --- a/packages/app-builder-lib/src/codeSign/macCodeSign.ts +++ b/packages/app-builder-lib/src/codeSign/macCodeSign.ts @@ -1,6 +1,4 @@ -import { signAsync } from "@electron/osx-sign" -import { SignOptions } from "@electron/osx-sign/dist/cjs/types" -import { Identity as _Identity } from "@electron/osx-sign/dist/cjs/util-identities" +import { signAsync, SignOptions } from "@electron/osx-sign" import { copyFile, exec, Fields, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isPullRequest, log, Logger, retry, TmpDir, unlinkIfExists } from "builder-util" import { Nullish } from "builder-util-runtime" import { createHash, randomBytes } from "crypto" @@ -9,8 +7,8 @@ import { Lazy } from "lazy-val" import { homedir, tmpdir } from "os" import * as path from "path" import { getTempName } from "temp-file" -import { isAutoDiscoveryCodeSignIdentity } from "../util/flags" -import { importCertificate } from "./codesign" +import { isAutoDiscoveryCodeSignIdentity } from "../util/flags.js" +import { importCertificate } from "./codesign.js" export const appleCertificatePrefixes = ["Developer ID Application:", "Developer ID Installer:", "3rd Party Mac Developer Application:", "3rd Party Mac Developer Installer:"] @@ -107,7 +105,7 @@ const bundledCertKeychainAdded = new Lazy(async () => { const keychainPath = path.join(cacheDir, "electron-builder-root-certs.keychain") const results = await Promise.all([ listUserKeychains(), - copyFile(path.join(__dirname, "..", "..", "certs", "root_certs.keychain"), tmpKeychainPath).then(() => rename(tmpKeychainPath, keychainPath)), + copyFile(path.join(import.meta.dirname, "..", "..", "certs", "root_certs.keychain"), tmpKeychainPath).then(() => rename(tmpKeychainPath, keychainPath)), ]) const list = results[0] if (!list.includes(keychainPath)) { @@ -307,18 +305,18 @@ async function _findIdentity(type: CertType, qualifier?: string | null, keychain return null } -export declare class Identity { - readonly name: string - readonly hash?: string - - constructor(name: string, hash?: string) +export class Identity { + constructor( + readonly name: string, + readonly hash?: string + ) {} } function parseIdentity(line: string): Identity { const firstQuoteIndex = line.indexOf('"') const name = line.substring(firstQuoteIndex + 1, line.lastIndexOf('"')) const hash = line.substring(0, firstQuoteIndex - 1) - return new _Identity(name, hash) + return new Identity(name, hash) } export function findIdentity(certType: CertType, qualifier?: string | null, keychain?: string | null): Promise { diff --git a/packages/app-builder-lib/src/codeSign/signManager.ts b/packages/app-builder-lib/src/codeSign/signManager.ts index 6825c355017..ee6ac00ed8b 100644 --- a/packages/app-builder-lib/src/codeSign/signManager.ts +++ b/packages/app-builder-lib/src/codeSign/signManager.ts @@ -1,9 +1,9 @@ import { MemoLazy, Nullish } from "builder-util-runtime" import { Lazy } from "lazy-val" -import { Target } from "../core" -import { WindowsConfiguration } from "../options/winOptions" -import { WindowsSignOptions } from "./windowsCodeSign" -import { CertificateFromStoreInfo, FileCodeSigningInfo } from "./windowsSignToolManager" +import { Target } from "../core.js" +import { WindowsConfiguration } from "../options/winOptions.js" +import { WindowsSignOptions } from "./windowsCodeSign.js" +import { CertificateFromStoreInfo, FileCodeSigningInfo } from "./windowsSignToolManager.js" export interface SignManager { readonly computedPublisherName: Lazy | null> diff --git a/packages/app-builder-lib/src/codeSign/windowsCodeSign.ts b/packages/app-builder-lib/src/codeSign/windowsCodeSign.ts index 8eb63b66774..71a196dd3cf 100644 --- a/packages/app-builder-lib/src/codeSign/windowsCodeSign.ts +++ b/packages/app-builder-lib/src/codeSign/windowsCodeSign.ts @@ -1,6 +1,6 @@ import { log, retry } from "builder-util" -import { WindowsConfiguration } from "../options/winOptions" -import { WinPackager } from "../winPackager" +import { WindowsConfiguration } from "../options/winOptions.js" +import { WinPackager } from "../winPackager.js" export interface WindowsSignOptions { readonly path: string diff --git a/packages/app-builder-lib/src/codeSign/windowsSignAzureManager.ts b/packages/app-builder-lib/src/codeSign/windowsSignAzureManager.ts index ba81309a33c..e5edbcaea7b 100644 --- a/packages/app-builder-lib/src/codeSign/windowsSignAzureManager.ts +++ b/packages/app-builder-lib/src/codeSign/windowsSignAzureManager.ts @@ -1,11 +1,11 @@ import { asArray, log } from "builder-util" import { MemoLazy } from "builder-util-runtime" import { Lazy } from "lazy-val" -import { WindowsAzureSigningConfiguration, WindowsConfiguration } from "../options/winOptions" -import { WinPackager } from "../winPackager" -import { SignManager } from "./signManager" -import { WindowsSignOptions } from "./windowsCodeSign" -import { CertificateFromStoreInfo, FileCodeSigningInfo } from "./windowsSignToolManager" +import { WindowsAzureSigningConfiguration, WindowsConfiguration } from "../options/winOptions.js" +import { WinPackager } from "../winPackager.js" +import { SignManager } from "./signManager.js" +import { WindowsSignOptions } from "./windowsCodeSign.js" +import { CertificateFromStoreInfo, FileCodeSigningInfo } from "./windowsSignToolManager.js" export class WindowsSignAzureManager implements SignManager { private readonly platformSpecificBuildOptions: WindowsConfiguration diff --git a/packages/app-builder-lib/src/codeSign/windowsSignToolManager.ts b/packages/app-builder-lib/src/codeSign/windowsSignToolManager.ts index 13c217e29c9..84de38d2f9d 100644 --- a/packages/app-builder-lib/src/codeSign/windowsSignToolManager.ts +++ b/packages/app-builder-lib/src/codeSign/windowsSignToolManager.ts @@ -1,19 +1,19 @@ import { asArray, InvalidConfigurationError, log, retry } from "builder-util" import { MemoLazy, parseDn } from "builder-util-runtime" -import { rename } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" -import { Target } from "../core" -import { WindowsConfiguration } from "../options/winOptions" -import AppXTarget from "../targets/AppxTarget" -import { getSignToolPath } from "../toolsets/windows" -import { executeAppBuilderAsJson } from "../util/appBuilder" -import { resolveFunction } from "../util/resolve" -import { VmManager } from "../vm/vm" -import { WinPackager } from "../winPackager" -import { importCertificate } from "./codesign" -import { SignManager } from "./signManager" -import { WindowsSignOptions } from "./windowsCodeSign" +import { Target } from "../core.js" +import { WindowsConfiguration } from "../options/winOptions.js" +import AppXTarget from "../targets/AppxTarget.js" +import { getSignToolPath } from "../toolsets/windows.js" +import { executeAppBuilderAsJson } from "../util/appBuilder.js" +import { resolveFunction } from "../util/resolve.js" +import { VmManager } from "../vm/vm.js" +import { WinPackager } from "../winPackager.js" +import { importCertificate } from "./codesign.js" +import { SignManager } from "./signManager.js" +import { WindowsSignOptions } from "./windowsCodeSign.js" export type CustomWindowsSign = (configuration: CustomWindowsSignTaskConfiguration, packager?: WinPackager) => Promise @@ -232,7 +232,7 @@ export class WindowsSignToolManager implements SignManager { ) isNest = true if (taskConfiguration.resultOutputPath != null) { - await rename(taskConfiguration.resultOutputPath, options.path) + await fsExtra.rename(taskConfiguration.resultOutputPath, options.path) } } diff --git a/packages/app-builder-lib/src/configuration.ts b/packages/app-builder-lib/src/configuration.ts index 1bb117408e6..8ff297db234 100644 --- a/packages/app-builder-lib/src/configuration.ts +++ b/packages/app-builder-lib/src/configuration.ts @@ -1,21 +1,21 @@ import { Arch } from "builder-util" -import { BeforeBuildContext, Target } from "./core" -import { ElectronBrandingOptions, ElectronDownloadOptions } from "./electron/ElectronFramework" -import { PrepareApplicationStageDirectoryOptions } from "./Framework" -import { AppXOptions } from "./options/AppXOptions" -import { AppImageOptions, DebOptions, FlatpakOptions, LinuxConfiguration, LinuxTargetSpecificOptions } from "./options/linuxOptions" -import { DmgOptions, MacConfiguration, MasConfiguration } from "./options/macOptions" -import { MsiOptions } from "./options/MsiOptions" -import { MsiWrappedOptions } from "./options/MsiWrappedOptions" -import { PkgOptions } from "./options/pkgOptions" -import { PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions" -import { SnapOptions } from "./options/SnapOptions" -import { SquirrelWindowsOptions } from "./options/SquirrelWindowsOptions" -import { WindowsConfiguration } from "./options/winOptions" -import { BuildResult } from "./packager" -import { ArtifactBuildStarted, ArtifactCreated } from "./packagerApi" -import { PlatformPackager } from "./platformPackager" -import { NsisOptions, NsisWebOptions, PortableOptions } from "./targets/nsis/nsisOptions" +import { BeforeBuildContext, Target } from "./core.js" +import { ElectronBrandingOptions, ElectronDownloadOptions } from "./electron/ElectronFramework.js" +import { PrepareApplicationStageDirectoryOptions } from "./Framework.js" +import { AppXOptions } from "./options/AppXOptions.js" +import { AppImageOptions, DebOptions, FlatpakOptions, LinuxConfiguration, LinuxTargetSpecificOptions } from "./options/linuxOptions.js" +import { DmgOptions, MacConfiguration, MasConfiguration } from "./options/macOptions.js" +import { MsiOptions } from "./options/MsiOptions.js" +import { MsiWrappedOptions } from "./options/MsiWrappedOptions.js" +import { PkgOptions } from "./options/pkgOptions.js" +import { PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions.js" +import { SnapOptions } from "./options/SnapOptions.js" +import { SquirrelWindowsOptions } from "./options/SquirrelWindowsOptions.js" +import { WindowsConfiguration } from "./options/winOptions.js" +import { BuildResult } from "./packager.js" +import { ArtifactBuildStarted, ArtifactCreated } from "./packagerApi.js" +import { PlatformPackager } from "./platformPackager.js" +import { NsisOptions, NsisWebOptions, PortableOptions } from "./targets/nsis/nsisOptions.js" // duplicate appId here because it is important /** diff --git a/packages/app-builder-lib/src/electron/ElectronFramework.ts b/packages/app-builder-lib/src/electron/ElectronFramework.ts index cabd64f4771..2df32c11c71 100644 --- a/packages/app-builder-lib/src/electron/ElectronFramework.ts +++ b/packages/app-builder-lib/src/electron/ElectronFramework.ts @@ -1,18 +1,19 @@ import { asArray, copyDir, DO_NOT_USE_HARD_LINKS, executeAppBuilder, isEmptyOrSpaces, log, MAX_FILE_REQUESTS, statOrNull, unlinkIfExists } from "builder-util" -import { emptyDir, readdir, rename, rm } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" import asyncPool from "tiny-async-pool" -import { Configuration } from "../configuration" -import { BeforeCopyExtraFilesOptions, Framework, PrepareApplicationStageDirectoryOptions } from "../Framework" -import { Packager, Platform } from "../index" -import { LinuxPackager } from "../linuxPackager" -import { MacPackager } from "../macPackager" -import { getTemplatePath } from "../util/pathManager" -import { resolveFunction } from "../util/resolve" -import { createMacApp } from "./electronMac" -import { computeElectronVersion, getElectronVersionFromInstalled } from "./electronVersion" -import { addWinAsarIntegrity } from "./electronWin" -import injectFFMPEG from "./injectFFMPEG" +import { Configuration } from "../configuration.js" +import { BeforeCopyExtraFilesOptions, Framework, PrepareApplicationStageDirectoryOptions } from "../Framework.js" +import { Platform } from "../core.js" +import type { Packager } from "../packager.js" +import type { LinuxPackager } from "../linuxPackager.js" +import type { MacPackager } from "../macPackager.js" +import { getTemplatePath } from "../util/pathManager.js" +import { resolveFunction } from "../util/resolve.js" +import { createMacApp } from "./electronMac.js" +import { computeElectronVersion, getElectronVersionFromInstalled } from "./electronVersion.js" +import { addWinAsarIntegrity } from "./electronWin.js" +import injectFFMPEG from "./injectFFMPEG.js" export type ElectronPlatformName = "darwin" | "linux" | "win32" | "mas" @@ -74,10 +75,10 @@ async function beforeCopyExtraFiles(options: BeforeCopyExtraFilesOptions) { if (packager.platform === Platform.LINUX) { const linuxPackager = packager as LinuxPackager const executable = path.join(appOutDir, linuxPackager.executableName) - await rename(path.join(appOutDir, electronBranding.projectName), executable) + await fsExtra.rename(path.join(appOutDir, electronBranding.projectName), executable) } else if (packager.platform === Platform.WINDOWS) { const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`) - await rename(path.join(appOutDir, `${electronBranding.projectName}.exe`), executable) + await fsExtra.rename(path.join(appOutDir, `${electronBranding.projectName}.exe`), executable) if (options.asarIntegrity) { await addWinAsarIntegrity(executable, options.asarIntegrity) } @@ -108,7 +109,7 @@ async function removeUnusedLanguagesIfNeeded(options: BeforeCopyExtraFilesOption const { dirs, langFileExt } = getLocalesConfig() // noinspection SpellCheckingInspection const deleteNonMatchedLanguages: (dir: string) => Promise[] | undefined> = async (dir: string) => { - const files = await readdir(dir) + const files = await fsExtra.readdir(dir) return files.map(async file => { if (path.extname(file) !== langFileExt) { return @@ -127,7 +128,7 @@ async function removeUnusedLanguagesIfNeeded(options: BeforeCopyExtraFilesOption if (isWantedLocale) { return undefined } - return rm(path.join(dir, file), { recursive: true, force: true }) + return fsExtra.rm(path.join(dir, file), { recursive: true, force: true }) }) } const allDeletedFiles = (await Promise.all(dirs.map(deleteNonMatchedLanguages))).flat().filter((it): it is Promise => it != null) @@ -209,7 +210,7 @@ async function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, d const source = packager.getElectronSrcDir(folderPath) const destination = packager.getElectronDestinationDir(appOutDir) log.info({ source, destination }, "copying unpacked Electron") - await emptyDir(appOutDir) + await fsExtra.emptyDir(appOutDir) await copyDir(source, destination, { isUseHardLink: DO_NOT_USE_HARD_LINKS, }) @@ -238,7 +239,7 @@ async function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, d if (electronDistStats.isDirectory()) { // backward compatibility: if electronDist is a directory, check for the default zip file inside it - const files = await readdir(resolvedDist) + const files = await fsExtra.readdir(resolvedDist) if (files.includes(defaultZipName)) { log.info({ electronDist: log.filePath(resolvedDist) }, "using custom electronDist directory") await downloadUsingAdjustedConfig({ @@ -291,7 +292,7 @@ function cleanupAfterUnpack(prepareOptions: PrepareApplicationStageDirectoryOpti isFullCleanup ? unlinkIfExists(path.join(out, "version")) : Promise.resolve(), isMac ? Promise.resolve() - : rename(path.join(out, "LICENSE"), path.join(out, "LICENSE.electron.txt")).catch(() => { + : fsExtra.rename(path.join(out, "LICENSE"), path.join(out, "LICENSE.electron.txt")).catch(() => { /* ignore */ }), ]) diff --git a/packages/app-builder-lib/src/electron/electronMac.ts b/packages/app-builder-lib/src/electron/electronMac.ts index 5b46b793fd3..8f252cf55bf 100644 --- a/packages/app-builder-lib/src/electron/electronMac.ts +++ b/packages/app-builder-lib/src/electron/electronMac.ts @@ -2,12 +2,12 @@ import { asArray, copyOrLinkFile, getPlatformIconFileName, InvalidConfigurationE import { rename, utimes } from "fs/promises" import * as path from "path" import * as fs from "fs" -import { filterCFBundleIdentifier } from "../appInfo" -import { AsarIntegrity } from "../asar/integrity" -import { MacPackager } from "../macPackager" -import { normalizeExt } from "../platformPackager" -import { savePlistFile, parsePlistFile, PlistObject, PlistValue } from "../util/plist" -import { createBrandingOpts } from "./ElectronFramework" +import { filterCFBundleIdentifier } from "../appInfo.js" +import { AsarIntegrity } from "../asar/integrity.js" +import { MacPackager } from "../macPackager.js" +import { normalizeExt } from "../platformPackager.js" +import { savePlistFile, parsePlistFile, PlistObject, PlistValue } from "../util/plist.js" +import { createBrandingOpts } from "./ElectronFramework.js" function doRename(basePath: string, oldName: string, newName: string) { return rename(path.join(basePath, oldName), path.join(basePath, newName)) diff --git a/packages/app-builder-lib/src/electron/electronVersion.ts b/packages/app-builder-lib/src/electron/electronVersion.ts index 8d5ba107e8f..dba8fbaf173 100644 --- a/packages/app-builder-lib/src/electron/electronVersion.ts +++ b/packages/app-builder-lib/src/electron/electronVersion.ts @@ -1,13 +1,13 @@ import { httpExecutor, InvalidConfigurationError, log } from "builder-util" import { parseXml } from "builder-util-runtime" -import { readJson } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" import * as semver from "semver" -import { Configuration } from "../configuration" -import { getConfig } from "../util/config/config" -import { orNullIfFileNotExist } from "../util/config/load" -import { getProjectRootPath } from "./search-module" +import { Configuration } from "../configuration.js" +import { getConfig } from "../util/config/config.js" +import { orNullIfFileNotExist } from "../util/config/load.js" +import { getProjectRootPath } from "./search-module.js" export type MetadataValue = Lazy | null> @@ -26,7 +26,7 @@ export async function getElectronVersion(projectDir: string, config?: Configurat export async function getElectronVersionFromInstalled(projectDir: string): Promise { for (const name of electronPackages) { try { - return (await readJson(path.join(projectDir, "node_modules", name, "package.json"))).version + return (await fsExtra.readJson(path.join(projectDir, "node_modules", name, "package.json"))).version } catch (e: any) { if (e.code !== "ENOENT") { log.warn({ name, error: e }, `cannot read electron version package.json`) @@ -39,7 +39,7 @@ export async function getElectronVersionFromInstalled(projectDir: string): Promi export async function getElectronPackage(projectDir: string) { for (const name of electronPackages) { try { - return await readJson(path.join(projectDir, "node_modules", name, "package.json")) + return await fsExtra.readJson(path.join(projectDir, "node_modules", name, "package.json")) } catch (e: any) { if (e.code !== "ENOENT") { log.warn({ name, error: e }, `cannot find electron in package.json`) @@ -59,7 +59,7 @@ export async function computeElectronVersion(projectDir: string): Promise { diff --git a/packages/app-builder-lib/src/electron/search-module.ts b/packages/app-builder-lib/src/electron/search-module.ts index 8e263cae4bc..cf056d3ca72 100644 --- a/packages/app-builder-lib/src/electron/search-module.ts +++ b/packages/app-builder-lib/src/electron/search-module.ts @@ -1,4 +1,4 @@ -import * as fs from "fs-extra" +import fs from "fs-extra" import * as path from "node:path" async function shouldContinueSearch(traversedPath: string, rootPath?: string, stopAtPackageJSON?: boolean): Promise { diff --git a/packages/app-builder-lib/src/fileMatcher.ts b/packages/app-builder-lib/src/fileMatcher.ts index dfbdb908bf6..013c8acb174 100644 --- a/packages/app-builder-lib/src/fileMatcher.ts +++ b/packages/app-builder-lib/src/fileMatcher.ts @@ -3,9 +3,11 @@ import { Nullish } from "builder-util-runtime" import { mkdir } from "fs/promises" import { Minimatch } from "minimatch" import * as path from "path" -import { Configuration, FileSet, Packager, PlatformSpecificBuildOptions } from "./index" -import { PlatformPackager } from "./platformPackager" -import { createFilter, hasMagic } from "./util/filter" +import type { Configuration } from "./configuration.js" +import type { Packager } from "./packager.js" +import { FileSet, PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions.js" +import { PlatformPackager } from "./platformPackager.js" +import { createFilter, hasMagic } from "./util/filter.js" // https://github.com/electron-userland/electron-builder/issues/733 const minimatchOptions = { dot: true } diff --git a/packages/app-builder-lib/src/fileTransformer.ts b/packages/app-builder-lib/src/fileTransformer.ts index ac3054cd777..8b045e4c66e 100644 --- a/packages/app-builder-lib/src/fileTransformer.ts +++ b/packages/app-builder-lib/src/fileTransformer.ts @@ -1,8 +1,11 @@ +import { createRequire } from "node:module" import { debug, deepAssign, FileTransformer, log } from "builder-util" + +const require = createRequire(import.meta.url) import { readFile } from "fs/promises" import * as path from "path" -import { Configuration } from "./configuration" -import { Packager } from "./packager" +import { Configuration } from "./configuration.js" +import { Packager } from "./packager.js" /** @internal */ export const NODE_MODULES_PATTERN = `${path.sep}node_modules${path.sep}` diff --git a/packages/app-builder-lib/src/forge-maker.ts b/packages/app-builder-lib/src/forge-maker.ts index 640e1f37675..64b589a21cd 100644 --- a/packages/app-builder-lib/src/forge-maker.ts +++ b/packages/app-builder-lib/src/forge-maker.ts @@ -1,6 +1,6 @@ import * as path from "path" -import { build } from "./index" -import { PackagerOptions } from "./packagerApi" +import { build } from "./index.js" +import { PackagerOptions } from "./packagerApi.js" export interface ForgeOptions { readonly dir: string diff --git a/packages/app-builder-lib/src/frameworks/LibUiFramework.ts b/packages/app-builder-lib/src/frameworks/LibUiFramework.ts index 82f7de429ff..ef21e41a68d 100644 --- a/packages/app-builder-lib/src/frameworks/LibUiFramework.ts +++ b/packages/app-builder-lib/src/frameworks/LibUiFramework.ts @@ -1,13 +1,13 @@ import { executeAppBuilder } from "builder-util" -import { emptyDir } from "fs-extra" +import fsExtra from "fs-extra" import { chmod, mkdir, rename, writeFile } from "fs/promises" import * as path from "path" -import { AfterPackContext } from "../configuration" -import { Platform } from "../core" -import { Framework, PrepareApplicationStageDirectoryOptions } from "../Framework" -import { LinuxPackager } from "../linuxPackager" -import { MacPackager } from "../macPackager" -import { savePlistFile } from "../util/plist" +import { AfterPackContext } from "../configuration.js" +import { Platform } from "../core.js" +import { Framework, PrepareApplicationStageDirectoryOptions } from "../Framework.js" +import { LinuxPackager } from "../linuxPackager.js" +import { MacPackager } from "../macPackager.js" +import { savePlistFile } from "../util/plist.js" export class LibUiFramework implements Framework { readonly name: string = "libui" @@ -29,7 +29,7 @@ export class LibUiFramework implements Framework { ) {} async prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) { - await emptyDir(options.appOutDir) + await fsExtra.emptyDir(options.appOutDir) const packager = options.packager const platform = packager.platform diff --git a/packages/app-builder-lib/src/index.ts b/packages/app-builder-lib/src/index.ts index 29ab91e15be..bb60eeac812 100644 --- a/packages/app-builder-lib/src/index.ts +++ b/packages/app-builder-lib/src/index.ts @@ -1,13 +1,13 @@ import { InvalidConfigurationError, executeFinally, log } from "builder-util" import { asArray } from "builder-util-runtime" import { PublishOptions } from "electron-publish" -import { Packager } from "./packager" -import { PackagerOptions } from "./packagerApi" -import { PublishManager } from "./publish/PublishManager" -import { resolveFunction } from "./util/resolve" +import { Packager } from "./packager.js" +import { PackagerOptions } from "./packagerApi.js" +import { PublishManager } from "./publish/PublishManager.js" +import { resolveFunction } from "./util/resolve.js" export { Arch, archFromString, getArchSuffix } from "builder-util" -export { AppInfo } from "./appInfo" +export { AppInfo } from "./appInfo.js" export { AfterExtractContext, AfterPackContext, @@ -20,7 +20,7 @@ export { MetadataDirectories, PackContext, ToolsetConfig, -} from "./configuration" +} from "./configuration.js" export { BeforeBuildContext, CompressionLevel, @@ -32,42 +32,42 @@ export { TargetConfigType, TargetConfiguration, TargetSpecificOptions, -} from "./core" -export { ElectronBrandingOptions, ElectronDownloadOptions, ElectronPlatformName } from "./electron/ElectronFramework" -export { AppXOptions } from "./options/AppXOptions" -export { CommonWindowsInstallerConfiguration } from "./options/CommonWindowsInstallerConfiguration" -export { FileAssociation } from "./options/FileAssociation" -export { AppImageOptions, CommonLinuxOptions, DebOptions, FlatpakOptions, LinuxConfiguration, LinuxDesktopFile, LinuxTargetSpecificOptions } from "./options/linuxOptions" -export { DmgContent, DmgOptions, DmgWindow, MacConfiguration, MacOsTargetName, MasConfiguration } from "./options/macOptions" -export { AuthorMetadata, Metadata, RepositoryInfo } from "./options/metadata" -export { MsiOptions } from "./options/MsiOptions" -export { MsiWrappedOptions } from "./options/MsiWrappedOptions" -export { BackgroundAlignment, BackgroundScaling, PkgBackgroundOptions, PkgOptions } from "./options/pkgOptions" -export { AsarOptions, FileSet, FilesBuildOptions, PlatformSpecificBuildOptions, Protocol, ReleaseInfo } from "./options/PlatformSpecificBuildOptions" -export { PlugDescriptor, SlotDescriptor, SnapOptions } from "./options/SnapOptions" -export { SquirrelWindowsOptions } from "./options/SquirrelWindowsOptions" -export { WindowsAzureSigningConfiguration, WindowsConfiguration, WindowsSigntoolConfiguration } from "./options/winOptions" -export { BuildResult, Packager } from "./packager" -export { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from "./packagerApi" -export { CommonNsisOptions, CustomNsisBinary, NsisOptions, NsisWebOptions, PortableOptions } from "./targets/nsis/nsisOptions" +} from "./core.js" +export { ElectronBrandingOptions, ElectronDownloadOptions, ElectronPlatformName } from "./electron/ElectronFramework.js" +export { AppXOptions } from "./options/AppXOptions.js" +export { CommonWindowsInstallerConfiguration } from "./options/CommonWindowsInstallerConfiguration.js" +export { FileAssociation } from "./options/FileAssociation.js" +export { AppImageOptions, CommonLinuxOptions, DebOptions, FlatpakOptions, LinuxConfiguration, LinuxDesktopFile, LinuxTargetSpecificOptions } from "./options/linuxOptions.js" +export { DmgContent, DmgOptions, DmgWindow, MacConfiguration, MacOsTargetName, MasConfiguration } from "./options/macOptions.js" +export { AuthorMetadata, Metadata, RepositoryInfo } from "./options/metadata.js" +export { MsiOptions } from "./options/MsiOptions.js" +export { MsiWrappedOptions } from "./options/MsiWrappedOptions.js" +export { BackgroundAlignment, BackgroundScaling, PkgBackgroundOptions, PkgOptions } from "./options/pkgOptions.js" +export { AsarOptions, FileSet, FilesBuildOptions, PlatformSpecificBuildOptions, Protocol, ReleaseInfo } from "./options/PlatformSpecificBuildOptions.js" +export { PlugDescriptor, SlotDescriptor, SnapOptions } from "./options/SnapOptions.js" +export { SquirrelWindowsOptions } from "./options/SquirrelWindowsOptions.js" +export { WindowsAzureSigningConfiguration, WindowsConfiguration, WindowsSigntoolConfiguration } from "./options/winOptions.js" +export { BuildResult, Packager } from "./packager.js" +export { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from "./packagerApi.js" +export { CommonNsisOptions, CustomNsisBinary, NsisOptions, NsisWebOptions, PortableOptions } from "./targets/nsis/nsisOptions.js" export { CancellationToken, ProgressInfo } from "builder-util-runtime" export { PublishOptions, UploadTask } from "electron-publish" -export { WindowsSignOptions } from "./codeSign/windowsCodeSign" +export { WindowsSignOptions } from "./codeSign/windowsCodeSign.js" export { CertificateFromStoreInfo, CustomWindowsSign, CustomWindowsSignTaskConfiguration, FileCodeSigningInfo, WindowsSignTaskConfiguration, -} from "./codeSign/windowsSignToolManager" -export { ForgeOptions, buildForge } from "./forge-maker" -export { Framework, PrepareApplicationStageDirectoryOptions } from "./Framework" -export { LinuxPackager } from "./linuxPackager" -export { CustomMacSign, CustomMacSignOptions, MacPackager } from "./macPackager" -export { PlatformPackager } from "./platformPackager" -export { PublishManager } from "./publish/PublishManager" -export { WinPackager } from "./winPackager" +} from "./codeSign/windowsSignToolManager.js" +export { ForgeOptions, buildForge } from "./forge-maker.js" +export { Framework, PrepareApplicationStageDirectoryOptions } from "./Framework.js" +export { LinuxPackager } from "./linuxPackager.js" +export { CustomMacSign, CustomMacSignOptions, MacPackager } from "./macPackager.js" +export { PlatformPackager } from "./platformPackager.js" +export { PublishManager } from "./publish/PublishManager.js" +export { WinPackager } from "./winPackager.js" const expectedOptions = new Set(["publish", "targets", "mac", "win", "linux", "projectDir", "platformPackagerFactory", "config", "effectiveOptionComputed", "prepackaged"]) diff --git a/packages/app-builder-lib/src/indexInternal.ts b/packages/app-builder-lib/src/indexInternal.ts new file mode 100644 index 00000000000..17479bb8726 --- /dev/null +++ b/packages/app-builder-lib/src/indexInternal.ts @@ -0,0 +1,33 @@ +export { AsarFilesystem, readAsar, readAsarJson } from "./asar/asar.js" +export { AsarIntegrity } from "./asar/integrity.js" +export { downloadArtifact, getBinFromUrl } from "./binDownload.js" +export { Identity, createKeychain, findIdentity, isSignAllowed, removeKeychain } from "./codeSign/macCodeSign.js" +export { Publish } from "./core.js" +export { getElectronVersion } from "./electron/electronVersion.js" +export { HoisterDependencyKind, HoisterResult, HoisterTree, hoist } from "./node-module-collector/hoist.js" +export { + determinePackageManagerEnv, + getCollectorByPackageManager, + PnpmNodeModulesCollector, + YarnNodeModulesCollector, + YarnBerryNodeModulesCollector, + BunNodeModulesCollector, + TraversalNodeModulesCollector, +} from "./node-module-collector/index.js" +export { detectPackageManager, PM } from "./node-module-collector/packageManager.js" +export { DoPackOptions, computeSafeArtifactNameIfNeeded } from "./platformPackager.js" +export { createPublisher } from "./publish/PublishManager.js" +export { createBlockmap } from "./targets/differentialUpdateInfoBuilder.js" +export { computeArchToTargetNamesMap } from "./targets/targetFactory.js" +export { getLinuxToolsPath } from "./toolsets/linux.js" +export { getWindowsKitsBundle } from "./toolsets/windows.js" +export { computeDefaultAppDirectory, doMergeConfigs, getConfig, validateConfiguration } from "./util/config/config.js" +export { loadEnv } from "./util/config/load.js" +export { getLicenseAssets, getLicenseFiles } from "./util/license.js" +export { expandMacro } from "./util/macroExpander.js" +export { createLazyProductionDeps } from "./util/packageDependencies.js" +export { PlistObject, parsePlistFile } from "./util/plist.js" +export { getRepositoryInfo } from "./util/repositoryInfo.js" +export { installDependencies, installOrRebuild, nodeGypRebuild } from "./util/yarn.js" +export { PACKAGE_VERSION } from "./version.js" +export { execWine } from "./wine.js" diff --git a/packages/app-builder-lib/src/linuxPackager.ts b/packages/app-builder-lib/src/linuxPackager.ts index ba42b5ad534..1b880b7b889 100644 --- a/packages/app-builder-lib/src/linuxPackager.ts +++ b/packages/app-builder-lib/src/linuxPackager.ts @@ -1,15 +1,15 @@ import { Arch } from "builder-util" -import { sanitizeFileName } from "builder-util/out/filename" -import { DIR_TARGET, Platform, Target } from "./core" -import { LinuxConfiguration } from "./options/linuxOptions" -import { Packager } from "./packager" -import { PlatformPackager } from "./platformPackager" -import AppImageTarget from "./targets/appimage/AppImageTarget" -import FlatpakTarget from "./targets/FlatpakTarget" -import FpmTarget from "./targets/FpmTarget" -import { LinuxTargetHelper } from "./targets/LinuxTargetHelper" -import SnapTarget from "./targets/snap" -import { createCommonTarget } from "./targets/targetFactory" +import { sanitizeFileName } from "builder-util/internal" +import { DIR_TARGET, Platform, Target } from "./core.js" +import { LinuxConfiguration } from "./options/linuxOptions.js" +import { Packager } from "./packager.js" +import { PlatformPackager } from "./platformPackager.js" +import AppImageTarget from "./targets/appimage/AppImageTarget.js" +import FlatpakTarget from "./targets/FlatpakTarget.js" +import FpmTarget from "./targets/FpmTarget.js" +import { LinuxTargetHelper } from "./targets/LinuxTargetHelper.js" +import SnapTarget from "./targets/snap.js" +import { createCommonTarget } from "./targets/targetFactory.js" export class LinuxPackager extends PlatformPackager { readonly executableName: string @@ -42,11 +42,11 @@ export class LinuxPackager extends PlatformPackager { const targetClass: typeof AppImageTarget | typeof SnapTarget | typeof FlatpakTarget | typeof FpmTarget | null = (() => { switch (name) { case "appimage": - return require("./targets/appimage/AppImageTarget").default + return AppImageTarget case "snap": - return require("./targets/snap").default + return SnapTarget case "flatpak": - return require("./targets/FlatpakTarget").default + return FlatpakTarget case "deb": case "rpm": case "sh": @@ -54,7 +54,7 @@ export class LinuxPackager extends PlatformPackager { case "pacman": case "apk": case "p5p": - return require("./targets/FpmTarget").default + return FpmTarget default: return null } diff --git a/packages/app-builder-lib/src/macPackager.ts b/packages/app-builder-lib/src/macPackager.ts index b35fa9a4be0..d8ce52cd025 100644 --- a/packages/app-builder-lib/src/macPackager.ts +++ b/packages/app-builder-lib/src/macPackager.ts @@ -1,7 +1,10 @@ +import { createRequire } from "node:module" import { notarize } from "@electron/notarize" -import { NotarizeOptionsNotaryTool, NotaryToolKeychainCredentials } from "@electron/notarize/lib/types" -import { PerFileSignOptions, SignOptions } from "@electron/osx-sign/dist/cjs/types" -import { Identity } from "@electron/osx-sign/dist/cjs/util-identities" + +const require = createRequire(import.meta.url) +import { NotarizeOptionsNotaryTool, NotaryToolKeychainCredentials } from "@electron/notarize/lib/types.js" +import { PerFileSignOptions, SignOptions } from "@electron/osx-sign/dist/cjs/types.js" +import { Identity } from "@electron/osx-sign/dist/cjs/util-identities.js" import { Arch, AsyncTaskManager, @@ -22,20 +25,21 @@ import * as fs from "fs/promises" import { mkdir, readdir } from "fs/promises" import { Lazy } from "lazy-val" import * as path from "path" -import { AppInfo } from "./appInfo" -import { CertType, CodeSigningInfo, createKeychain, CreateKeychainOptions, findIdentity, isSignAllowed, removeKeychain, reportError, sign } from "./codeSign/macCodeSign" -import { DIR_TARGET, Platform, Target } from "./core" -import { AfterPackContext, ElectronPlatformName } from "./index" -import { MacConfiguration, MasConfiguration } from "./options/macOptions" -import { Packager } from "./packager" -import { chooseNotNull, DoPackOptions, PlatformPackager } from "./platformPackager" -import { ArchiveTarget } from "./targets/ArchiveTarget" -import { PkgTarget, prepareProductBuildArgs } from "./targets/pkg" -import { createCommonTarget, NoOpTarget } from "./targets/targetFactory" -import { isMacOsHighSierra } from "./util/macosVersion" -import { getTemplatePath } from "./util/pathManager" -import { resolveFunction } from "./util/resolve" -import { expandMacro as doExpandMacro } from "./util/macroExpander" +import { AppInfo } from "./appInfo.js" +import { CertType, CodeSigningInfo, createKeychain, CreateKeychainOptions, findIdentity, isSignAllowed, removeKeychain, reportError, sign } from "./codeSign/macCodeSign.js" +import { DIR_TARGET, Platform, Target } from "./core.js" +import { AfterPackContext } from "./configuration.js" +import { ElectronPlatformName } from "./electron/ElectronFramework.js" +import { MacConfiguration, MasConfiguration } from "./options/macOptions.js" +import { Packager } from "./packager.js" +import { chooseNotNull, DoPackOptions, PlatformPackager } from "./platformPackager.js" +import { ArchiveTarget } from "./targets/ArchiveTarget.js" +import { PkgTarget, prepareProductBuildArgs } from "./targets/pkg.js" +import { createCommonTarget, NoOpTarget } from "./targets/targetFactory.js" +import { isMacOsHighSierra } from "./util/macosVersion.js" +import { getTemplatePath } from "./util/pathManager.js" +import { resolveFunction } from "./util/resolve.js" +import { expandMacro as doExpandMacro } from "./util/macroExpander.js" import { makeUniversalApp } from "@electron/universal" export type CustomMacSignOptions = SignOptions diff --git a/packages/app-builder-lib/src/node-module-collector/bunNodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/bunNodeModulesCollector.ts index bbfb15404b6..21c3e42853f 100644 --- a/packages/app-builder-lib/src/node-module-collector/bunNodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/bunNodeModulesCollector.ts @@ -1,7 +1,7 @@ import { log } from "builder-util" -import { PM } from "./packageManager" -import { TraversedDependency } from "./types" -import { TraversalNodeModulesCollector } from "./traversalNodeModulesCollector" +import { PM } from "./packageManager.js" +import { TraversedDependency } from "./types.js" +import { TraversalNodeModulesCollector } from "./traversalNodeModulesCollector.js" export class BunNodeModulesCollector extends TraversalNodeModulesCollector { public readonly installOptions = { manager: PM.BUN, lockfile: "bun.lock" } diff --git a/packages/app-builder-lib/src/node-module-collector/index.ts b/packages/app-builder-lib/src/node-module-collector/index.ts index 43cfea4c6e2..b176598a75b 100644 --- a/packages/app-builder-lib/src/node-module-collector/index.ts +++ b/packages/app-builder-lib/src/node-module-collector/index.ts @@ -1,18 +1,18 @@ import { Nullish } from "builder-util-runtime" import { TmpDir } from "temp-file" -import { NpmNodeModulesCollector } from "./npmNodeModulesCollector" -import { detectPackageManager, getPackageManagerCommand, PM } from "./packageManager" -import { PnpmNodeModulesCollector } from "./pnpmNodeModulesCollector" -import { YarnBerryNodeModulesCollector } from "./yarnBerryNodeModulesCollector" -import { YarnNodeModulesCollector } from "./yarnNodeModulesCollector" -import { BunNodeModulesCollector } from "./bunNodeModulesCollector" +import { NpmNodeModulesCollector } from "./npmNodeModulesCollector.js" +import { detectPackageManager, getPackageManagerCommand, PM } from "./packageManager.js" +import { PnpmNodeModulesCollector } from "./pnpmNodeModulesCollector.js" +import { YarnBerryNodeModulesCollector } from "./yarnBerryNodeModulesCollector.js" +import { YarnNodeModulesCollector } from "./yarnNodeModulesCollector.js" +import { BunNodeModulesCollector } from "./bunNodeModulesCollector.js" import { Lazy } from "lazy-val" import { spawn, log, exists, isEmptyOrSpaces } from "builder-util" -import * as fs from "fs-extra" +import fs from "fs-extra" import * as path from "path" -import { TraversalNodeModulesCollector } from "./traversalNodeModulesCollector" +import { TraversalNodeModulesCollector } from "./traversalNodeModulesCollector.js" -export { getPackageManagerCommand, PM } +export { getPackageManagerCommand, PM, PnpmNodeModulesCollector, YarnNodeModulesCollector, YarnBerryNodeModulesCollector, BunNodeModulesCollector, TraversalNodeModulesCollector } export function getCollectorByPackageManager(pm: PM, rootDir: string, tempDirManager: TmpDir) { switch (pm) { diff --git a/packages/app-builder-lib/src/node-module-collector/moduleManager.ts b/packages/app-builder-lib/src/node-module-collector/moduleManager.ts index 69be7b68dea..481c22a2f9c 100644 --- a/packages/app-builder-lib/src/node-module-collector/moduleManager.ts +++ b/packages/app-builder-lib/src/node-module-collector/moduleManager.ts @@ -1,6 +1,6 @@ import { exists, isEmptyOrSpaces, log, LogLevel } from "builder-util" -import { PackageJson } from "./types" -import * as fs from "fs-extra" +import { PackageJson } from "./types.js" +import fs from "fs-extra" import * as path from "path" import * as semver from "semver" diff --git a/packages/app-builder-lib/src/node-module-collector/nodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/nodeModulesCollector.ts index 90076b6366e..a2375734f24 100644 --- a/packages/app-builder-lib/src/node-module-collector/nodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/nodeModulesCollector.ts @@ -1,13 +1,13 @@ import { exists, log, retry, TmpDir } from "builder-util" import * as childProcess from "child_process" -import * as fs from "fs-extra" -import { createWriteStream } from "fs-extra" +import fs from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" -import { hoist, type HoisterResult, type HoisterTree } from "./hoist" -import { LogMessageByKey, ModuleManager } from "./moduleManager" -import { getPackageManagerCommand, PM } from "./packageManager" -import type { Dependency, DependencyGraph, NodeModuleInfo, PackageJson } from "./types" +import { hoist, type HoisterResult, type HoisterTree } from "./hoist.js" +import { LogMessageByKey, ModuleManager } from "./moduleManager.js" +import { getPackageManagerCommand, PM } from "./packageManager.js" +import type { Dependency, DependencyGraph, NodeModuleInfo, PackageJson } from "./types.js" export abstract class NodeModulesCollector, OptionalDepType> { private readonly nodeModules: NodeModuleInfo[] = [] @@ -373,7 +373,7 @@ export abstract class NodeModulesCollector((resolve, reject) => { - const outStream = createWriteStream(tempOutputFile) + const outStream = fsExtra.createWriteStream(tempOutputFile) const child = childProcess.spawn(command, args, { cwd, diff --git a/packages/app-builder-lib/src/node-module-collector/packageManager.ts b/packages/app-builder-lib/src/node-module-collector/packageManager.ts index 5e8ba6f7082..d3d965b7b5d 100644 --- a/packages/app-builder-lib/src/node-module-collector/packageManager.ts +++ b/packages/app-builder-lib/src/node-module-collector/packageManager.ts @@ -1,5 +1,5 @@ import { exists, log } from "builder-util" -import * as fs from "fs-extra" +import fs from "fs-extra" import * as path from "path" import * as which from "which" diff --git a/packages/app-builder-lib/src/node-module-collector/pnpmNodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/pnpmNodeModulesCollector.ts index 46cc12a4b53..9379e26d00f 100644 --- a/packages/app-builder-lib/src/node-module-collector/pnpmNodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/pnpmNodeModulesCollector.ts @@ -1,7 +1,7 @@ -import { LogMessageByKey } from "./moduleManager" -import { NodeModulesCollector } from "./nodeModulesCollector" -import { PM } from "./packageManager" -import { PnpmDependency } from "./types" +import { LogMessageByKey } from "./moduleManager.js" +import { NodeModulesCollector } from "./nodeModulesCollector.js" +import { PM } from "./packageManager.js" +import { PnpmDependency } from "./types.js" export class PnpmNodeModulesCollector extends NodeModulesCollector { public readonly installOptions = { diff --git a/packages/app-builder-lib/src/node-module-collector/traversalNodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/traversalNodeModulesCollector.ts index eef5dd98700..b375829d3d0 100644 --- a/packages/app-builder-lib/src/node-module-collector/traversalNodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/traversalNodeModulesCollector.ts @@ -1,7 +1,7 @@ import { log } from "builder-util" import * as path from "path" -import { LogMessageByKey } from "./moduleManager" -import { NodeModulesCollector } from "./nodeModulesCollector" +import { LogMessageByKey } from "./moduleManager.js" +import { NodeModulesCollector } from "./nodeModulesCollector.js" import { PM } from "./packageManager.js" import { TraversedDependency } from "./types.js" diff --git a/packages/app-builder-lib/src/node-module-collector/yarnBerryNodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/yarnBerryNodeModulesCollector.ts index d952c85501e..ba141f38f68 100644 --- a/packages/app-builder-lib/src/node-module-collector/yarnBerryNodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/yarnBerryNodeModulesCollector.ts @@ -1,8 +1,8 @@ import { log } from "builder-util" import { Lazy } from "lazy-val" -import { NpmNodeModulesCollector } from "./npmNodeModulesCollector" -import { PM } from "./packageManager" -import { NpmDependency } from "./types" +import { NpmNodeModulesCollector } from "./npmNodeModulesCollector.js" +import { PM } from "./packageManager.js" +import { NpmDependency } from "./types.js" type YarnSetupInfo = { yarnVersion: string | null diff --git a/packages/app-builder-lib/src/node-module-collector/yarnNodeModulesCollector.ts b/packages/app-builder-lib/src/node-module-collector/yarnNodeModulesCollector.ts index ed2cbdb4453..6054208553a 100644 --- a/packages/app-builder-lib/src/node-module-collector/yarnNodeModulesCollector.ts +++ b/packages/app-builder-lib/src/node-module-collector/yarnNodeModulesCollector.ts @@ -1,6 +1,6 @@ -import { NpmNodeModulesCollector } from "./npmNodeModulesCollector" -import { PM } from "./packageManager" -import { NpmDependency } from "./types" +import { NpmNodeModulesCollector } from "./npmNodeModulesCollector.js" +import { PM } from "./packageManager.js" +import { NpmDependency } from "./types.js" // Yarn Classic (v1) produces a hoisted node_modules structure similar to npm. // Instead of parsing Yarn's custom NDJSON output, we leverage npm's list command diff --git a/packages/app-builder-lib/src/options/AppXOptions.ts b/packages/app-builder-lib/src/options/AppXOptions.ts index 5551f189f12..db90f7049db 100644 --- a/packages/app-builder-lib/src/options/AppXOptions.ts +++ b/packages/app-builder-lib/src/options/AppXOptions.ts @@ -1,4 +1,4 @@ -import { TargetSpecificOptions } from "../core" +import { TargetSpecificOptions } from "../core.js" export interface AppXOptions extends TargetSpecificOptions { /** diff --git a/packages/app-builder-lib/src/options/CommonWindowsInstallerConfiguration.ts b/packages/app-builder-lib/src/options/CommonWindowsInstallerConfiguration.ts index af503c8ae0d..cc82cf100c6 100644 --- a/packages/app-builder-lib/src/options/CommonWindowsInstallerConfiguration.ts +++ b/packages/app-builder-lib/src/options/CommonWindowsInstallerConfiguration.ts @@ -1,6 +1,6 @@ import { InvalidConfigurationError, isEmptyOrSpaces } from "builder-util" -import { sanitizeFileName } from "builder-util/out/filename" -import { WinPackager } from "../winPackager" +import { sanitizeFileName } from "builder-util/internal" +import { WinPackager } from "../winPackager.js" export interface CommonWindowsInstallerConfiguration { readonly oneClick?: boolean diff --git a/packages/app-builder-lib/src/options/MsiOptions.ts b/packages/app-builder-lib/src/options/MsiOptions.ts index 3b905847941..1a18b784fdc 100644 --- a/packages/app-builder-lib/src/options/MsiOptions.ts +++ b/packages/app-builder-lib/src/options/MsiOptions.ts @@ -1,5 +1,5 @@ -import { TargetSpecificOptions } from "../core" -import { CommonWindowsInstallerConfiguration } from "./CommonWindowsInstallerConfiguration" +import { TargetSpecificOptions } from "../core.js" +import { CommonWindowsInstallerConfiguration } from "./CommonWindowsInstallerConfiguration.js" export interface MsiOptions extends CommonWindowsInstallerConfiguration, TargetSpecificOptions { /** diff --git a/packages/app-builder-lib/src/options/MsiWrappedOptions.ts b/packages/app-builder-lib/src/options/MsiWrappedOptions.ts index 282693f775b..e937333b53b 100644 --- a/packages/app-builder-lib/src/options/MsiWrappedOptions.ts +++ b/packages/app-builder-lib/src/options/MsiWrappedOptions.ts @@ -1,5 +1,5 @@ -import { TargetSpecificOptions } from "../core" -import { CommonWindowsInstallerConfiguration } from "./CommonWindowsInstallerConfiguration" +import { TargetSpecificOptions } from "../core.js" +import { CommonWindowsInstallerConfiguration } from "./CommonWindowsInstallerConfiguration.js" export interface MsiWrappedOptions extends CommonWindowsInstallerConfiguration, TargetSpecificOptions { /** diff --git a/packages/app-builder-lib/src/options/PlatformSpecificBuildOptions.ts b/packages/app-builder-lib/src/options/PlatformSpecificBuildOptions.ts index 9017928eac8..3e7d399f95b 100644 --- a/packages/app-builder-lib/src/options/PlatformSpecificBuildOptions.ts +++ b/packages/app-builder-lib/src/options/PlatformSpecificBuildOptions.ts @@ -1,5 +1,5 @@ -import { CompressionLevel, Publish, TargetConfiguration, TargetSpecificOptions } from "../core" -import { FileAssociation } from "./FileAssociation" +import { CompressionLevel, Publish, TargetConfiguration, TargetSpecificOptions } from "../core.js" +import { FileAssociation } from "./FileAssociation.js" export interface FileSet { /** diff --git a/packages/app-builder-lib/src/options/SnapOptions.ts b/packages/app-builder-lib/src/options/SnapOptions.ts index 1ea3fbcb59a..930e676d52a 100644 --- a/packages/app-builder-lib/src/options/SnapOptions.ts +++ b/packages/app-builder-lib/src/options/SnapOptions.ts @@ -1,5 +1,5 @@ -import { TargetSpecificOptions } from "../core" -import { CommonLinuxOptions } from "./linuxOptions" +import { TargetSpecificOptions } from "../core.js" +import { CommonLinuxOptions } from "./linuxOptions.js" export interface SnapOptions extends CommonLinuxOptions, TargetSpecificOptions { /** diff --git a/packages/app-builder-lib/src/options/SquirrelWindowsOptions.ts b/packages/app-builder-lib/src/options/SquirrelWindowsOptions.ts index 9bb97db6e3e..c9176c70e7f 100644 --- a/packages/app-builder-lib/src/options/SquirrelWindowsOptions.ts +++ b/packages/app-builder-lib/src/options/SquirrelWindowsOptions.ts @@ -1,7 +1,7 @@ /** * Squirrel.Windows options. */ -import { TargetSpecificOptions } from "../core" +import { TargetSpecificOptions } from "../core.js" export interface SquirrelWindowsOptions extends TargetSpecificOptions { /** diff --git a/packages/app-builder-lib/src/options/linuxOptions.ts b/packages/app-builder-lib/src/options/linuxOptions.ts index ef9fbd16637..f5989c8e3f2 100644 --- a/packages/app-builder-lib/src/options/linuxOptions.ts +++ b/packages/app-builder-lib/src/options/linuxOptions.ts @@ -1,4 +1,5 @@ -import { PlatformSpecificBuildOptions, TargetConfigType, TargetSpecificOptions } from "../index" +import { TargetConfigType, TargetSpecificOptions } from "../core.js" +import { PlatformSpecificBuildOptions } from "./PlatformSpecificBuildOptions.js" /** * Example Spec: https://specifications.freedesktop.org/desktop-entry-spec/latest/example.html diff --git a/packages/app-builder-lib/src/options/macOptions.ts b/packages/app-builder-lib/src/options/macOptions.ts index a8754081ed6..46739297edc 100644 --- a/packages/app-builder-lib/src/options/macOptions.ts +++ b/packages/app-builder-lib/src/options/macOptions.ts @@ -1,5 +1,6 @@ -import { PlatformSpecificBuildOptions, TargetConfiguration, TargetSpecificOptions } from "../index" -import { CustomMacSign } from "../macPackager" +import { TargetConfiguration, TargetSpecificOptions } from "../core.js" +import { PlatformSpecificBuildOptions } from "./PlatformSpecificBuildOptions.js" +import { CustomMacSign } from "../macPackager.js" export type MacOsTargetName = "default" | "dmg" | "mas" | "mas-dev" | "pkg" | "7z" | "zip" | "tar.xz" | "tar.lz" | "tar.gz" | "tar.bz2" | "dir" diff --git a/packages/app-builder-lib/src/options/metadata.ts b/packages/app-builder-lib/src/options/metadata.ts index 223362255a7..24d1b93e301 100644 --- a/packages/app-builder-lib/src/options/metadata.ts +++ b/packages/app-builder-lib/src/options/metadata.ts @@ -1,4 +1,4 @@ -import { Configuration } from "../configuration" +import { Configuration } from "../configuration.js" export interface Metadata { /** diff --git a/packages/app-builder-lib/src/options/pkgOptions.ts b/packages/app-builder-lib/src/options/pkgOptions.ts index 4c6f0079e99..de0fedb1320 100644 --- a/packages/app-builder-lib/src/options/pkgOptions.ts +++ b/packages/app-builder-lib/src/options/pkgOptions.ts @@ -1,4 +1,4 @@ -import { TargetSpecificOptions } from "../core" +import { TargetSpecificOptions } from "../core.js" // noinspection SpellCheckingInspection export type BackgroundAlignment = "center" | "left" | "right" | "top" | "bottom" | "topleft" | "topright" | "bottomleft" | "bottomright" diff --git a/packages/app-builder-lib/src/options/winOptions.ts b/packages/app-builder-lib/src/options/winOptions.ts index 6f4568b9b41..ed71472a2d1 100644 --- a/packages/app-builder-lib/src/options/winOptions.ts +++ b/packages/app-builder-lib/src/options/winOptions.ts @@ -1,6 +1,7 @@ import { Nullish } from "builder-util-runtime" -import { CustomWindowsSign } from "../codeSign/windowsSignToolManager" -import { PlatformSpecificBuildOptions, TargetConfigType } from "../index" +import { CustomWindowsSign } from "../codeSign/windowsSignToolManager.js" +import { TargetConfigType } from "../core.js" +import { PlatformSpecificBuildOptions } from "./PlatformSpecificBuildOptions.js" export interface WindowsConfiguration extends PlatformSpecificBuildOptions { /** diff --git a/packages/app-builder-lib/src/packager.ts b/packages/app-builder-lib/src/packager.ts index 3ac71478643..08d23e8a2c7 100644 --- a/packages/app-builder-lib/src/packager.ts +++ b/packages/app-builder-lib/src/packager.ts @@ -16,34 +16,34 @@ import { TmpDir, } from "builder-util" import { CancellationToken, retry } from "builder-util-runtime" -import { chmod, mkdirs, outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { isCI } from "ci-info" import { Lazy } from "lazy-val" import { release as getOsRelease } from "os" import * as path from "path" -import { AppInfo } from "./appInfo" -import { readAsarJson } from "./asar/asar" -import { AfterExtractContext, AfterPackContext, BeforePackContext, Configuration, Hook } from "./configuration" -import { Platform, SourceRepositoryInfo, Target } from "./core" -import { createElectronFrameworkSupport } from "./electron/ElectronFramework" -import { Framework } from "./Framework" -import { LibUiFramework } from "./frameworks/LibUiFramework" -import { Metadata } from "./options/metadata" -import { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from "./packagerApi" -import { PlatformPackager } from "./platformPackager" -import { ProtonFramework } from "./ProtonFramework" -import { computeArchToTargetNamesMap, createTargets, NoOpTarget } from "./targets/targetFactory" -import { computeDefaultAppDirectory, getConfig, validateConfiguration } from "./util/config/config" -import { expandMacro } from "./util/macroExpander" -import { createLazyProductionDeps, NodeModuleDirInfo, NodeModuleInfo } from "./util/packageDependencies" -import { checkMetadata, readPackageJson } from "./util/packageMetadata" -import { getRepositoryInfo } from "./util/repositoryInfo" -import { resolveFunction } from "./util/resolve" -import { installOrRebuild, nodeGypRebuild } from "./util/yarn" -import { PACKAGE_VERSION } from "./version" -import { AsyncEventEmitter, HandlerType } from "./util/asyncEventEmitter" +import { AppInfo } from "./appInfo.js" +import { readAsarJson } from "./asar/asar.js" +import { AfterExtractContext, AfterPackContext, BeforePackContext, Configuration, Hook } from "./configuration.js" +import { Platform, SourceRepositoryInfo, Target } from "./core.js" +import { createElectronFrameworkSupport } from "./electron/ElectronFramework.js" +import { Framework } from "./Framework.js" +import { LibUiFramework } from "./frameworks/LibUiFramework.js" +import { Metadata } from "./options/metadata.js" +import { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from "./packagerApi.js" +import { PlatformPackager } from "./platformPackager.js" +import { ProtonFramework } from "./ProtonFramework.js" +import { computeArchToTargetNamesMap, createTargets, NoOpTarget } from "./targets/targetFactory.js" +import { computeDefaultAppDirectory, getConfig, validateConfiguration } from "./util/config/config.js" +import { expandMacro } from "./util/macroExpander.js" +import { createLazyProductionDeps, NodeModuleDirInfo, NodeModuleInfo } from "./util/packageDependencies.js" +import { checkMetadata, readPackageJson } from "./util/packageMetadata.js" +import { getRepositoryInfo } from "./util/repositoryInfo.js" +import { resolveFunction } from "./util/resolve.js" +import { installOrRebuild, nodeGypRebuild } from "./util/yarn.js" +import { PACKAGE_VERSION } from "./version.js" +import { AsyncEventEmitter, HandlerType } from "./util/asyncEventEmitter.js" import asyncPool from "tiny-async-pool" -import { determinePackageManagerEnv, PM } from "./node-module-collector" +import { determinePackageManagerEnv, PM } from "./node-module-collector/index.js" async function createFrameworkInfo(configuration: Configuration, packager: Packager): Promise { let framework = configuration.framework @@ -437,7 +437,7 @@ export class Packager { if (!isCI && (process.stdout as any).isTTY) { const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, "builder-effective-config.yaml") log.info({ file: log.filePath(effectiveConfigFile) }, "writing effective config") - await outputFile(effectiveConfigFile, getSafeEffectiveConfig(this.config)) + await fsExtra.outputFile(effectiveConfigFile, getSafeEffectiveConfig(this.config)) } // because artifact event maybe dispatched several times for different publish providers @@ -592,17 +592,17 @@ export class Packager { switch (platform) { case Platform.MAC: { - const helperClass = (await import("./macPackager")).MacPackager + const helperClass = (await import("./macPackager.js")).MacPackager return new helperClass(this) } case Platform.WINDOWS: { - const helperClass = (await import("./winPackager")).WinPackager + const helperClass = (await import("./winPackager.js")).WinPackager return new helperClass(this) } case Platform.LINUX: - return new (await import("./linuxPackager")).LinuxPackager(this) + return new (await import("./linuxPackager.js")).LinuxPackager(this) default: throw new Error(`Unknown platform: ${platform}`) @@ -682,8 +682,9 @@ function createOutDirIfNeed(targetList: Array, createdOutDirs: Set { - return mkdirs(dir) - .then(() => chmod(dir, 0o755) /* set explicitly */) + return fsExtra + .mkdirs(dir) + .then(() => fsExtra.chmod(dir, 0o755) /* set explicitly */) .then(() => createdOutDirs.add(dir)) }) ) diff --git a/packages/app-builder-lib/src/packagerApi.ts b/packages/app-builder-lib/src/packagerApi.ts index 28a490c146a..16c5a42a9ba 100644 --- a/packages/app-builder-lib/src/packagerApi.ts +++ b/packages/app-builder-lib/src/packagerApi.ts @@ -1,10 +1,10 @@ import { Arch } from "builder-util" import { PublishConfiguration } from "builder-util-runtime" import { UploadTask } from "electron-publish" -import { Configuration } from "./configuration" -import { Platform, Target } from "./core" -import { Packager } from "./packager" -import { PlatformPackager } from "./platformPackager" +import { Configuration } from "./configuration.js" +import { Platform, Target } from "./core.js" +import { Packager } from "./packager.js" +import { PlatformPackager } from "./platformPackager.js" export interface PackagerOptions { targets?: Map>> diff --git a/packages/app-builder-lib/src/platformPackager.ts b/packages/app-builder-lib/src/platformPackager.ts index 792328fe1cc..15471c95213 100644 --- a/packages/app-builder-lib/src/platformPackager.ts +++ b/packages/app-builder-lib/src/platformPackager.ts @@ -22,33 +22,24 @@ import { Minimatch } from "minimatch" import * as path from "path" import * as fs from "fs/promises" import * as os from "os" -import { AppInfo } from "./appInfo" -import { checkFileInArchive } from "./asar/asarFileChecker" -import { AsarPackager } from "./asar/asarUtil" -import { AsarIntegrity, computeData } from "./asar/integrity" -import { FuseOptionsV1 } from "./configuration" -import { copyFiles, FileMatcher, getFileMatchers, GetFileMatchersOptions, getMainFileMatchers, getNodeModuleFileMatcher } from "./fileMatcher" -import { createTransformer, isElectronCompileUsed } from "./fileTransformer" -import { Framework, isElectronBased } from "./Framework" -import { - AfterPackContext, - AsarOptions, - CompressionLevel, - Configuration, - ElectronPlatformName, - FileAssociation, - LinuxPackager, - Packager, - PackagerOptions, - Platform, - PlatformSpecificBuildOptions, - Target, - TargetSpecificOptions, -} from "./index" -import { executeAppBuilderAsJson } from "./util/appBuilder" -import { computeFileSets, computeNodeModuleFileSets, copyAppFiles, ELECTRON_COMPILE_SHIM_FILENAME, transformFiles } from "./util/appFileCopier" -import { expandMacro as doExpandMacro } from "./util/macroExpander" -import { AssetCatalogResult, generateAssetCatalogForIcon } from "./util/macosIconComposer" +import { AppInfo } from "./appInfo.js" +import { checkFileInArchive } from "./asar/asarFileChecker.js" +import { AsarPackager } from "./asar/asarUtil.js" +import { AsarIntegrity, computeData } from "./asar/integrity.js" +import { AfterPackContext, Configuration, FuseOptionsV1 } from "./configuration.js" +import { CompressionLevel, Platform, Target, TargetSpecificOptions } from "./core.js" +import { ElectronPlatformName } from "./electron/ElectronFramework.js" +import { copyFiles, FileMatcher, getFileMatchers, GetFileMatchersOptions, getMainFileMatchers, getNodeModuleFileMatcher } from "./fileMatcher.js" +import { createTransformer, isElectronCompileUsed } from "./fileTransformer.js" +import { Framework, isElectronBased } from "./Framework.js" +import { FileAssociation } from "./options/FileAssociation.js" +import { AsarOptions, PlatformSpecificBuildOptions } from "./options/PlatformSpecificBuildOptions.js" +import { Packager } from "./packager.js" +import { PackagerOptions } from "./packagerApi.js" +import { executeAppBuilderAsJson } from "./util/appBuilder.js" +import { computeFileSets, computeNodeModuleFileSets, copyAppFiles, ELECTRON_COMPILE_SHIM_FILENAME, transformFiles } from "./util/appFileCopier.js" +import { expandMacro as doExpandMacro } from "./util/macroExpander.js" +import { AssetCatalogResult, generateAssetCatalogForIcon } from "./util/macosIconComposer.js" export type DoPackOptions = { outDir: string @@ -420,7 +411,7 @@ export abstract class PlatformPackager linux: "", }[electronPlatformName] - const executableName = this instanceof LinuxPackager ? this.executableName : this.appInfo.productFilename + const executableName = electronPlatformName === "linux" ? (this as any).executableName : this.appInfo.productFilename const electronBinaryPath = path.join(appOutDir, `${executableName}${ext}`) log.info({ electronPath: log.filePath(electronBinaryPath) }, "executing @electron/fuses") diff --git a/packages/app-builder-lib/src/presets/rectCra.ts b/packages/app-builder-lib/src/presets/rectCra.ts index 5d610cf64e6..311a17f9076 100644 --- a/packages/app-builder-lib/src/presets/rectCra.ts +++ b/packages/app-builder-lib/src/presets/rectCra.ts @@ -1,6 +1,6 @@ import { log, statOrNull } from "builder-util" import * as path from "path" -import { Configuration } from "../configuration" +import { Configuration } from "../configuration.js" /** @internal */ export async function reactCra(projectDir: string): Promise { diff --git a/packages/app-builder-lib/src/publish/PublishManager.ts b/packages/app-builder-lib/src/publish/PublishManager.ts index 9128c189573..81b3c7605f6 100644 --- a/packages/app-builder-lib/src/publish/PublishManager.ts +++ b/packages/app-builder-lib/src/publish/PublishManager.ts @@ -29,20 +29,24 @@ import { SpacesPublisher, UploadTask, } from "electron-publish" -import { MultiProgress } from "electron-publish/out/multiProgress" +import { MultiProgress } from "electron-publish/internal" import { readFile, writeFile } from "fs/promises" import { isCI } from "ci-info" import * as path from "path" import { WriteStream as TtyWriteStream } from "tty" import * as url from "url" -import { AppInfo, ArtifactCreated, Configuration, Platform, PlatformSpecificBuildOptions, Target, TargetSpecificOptions } from "../index" -import { Packager } from "../packager" -import { PlatformPackager } from "../platformPackager" -import { expandMacro } from "../util/macroExpander" -import { WinPackager } from "../winPackager" -import { createUpdateInfoTasks, UpdateInfoFileTask, writeUpdateInfoFiles } from "./updateInfoBuilder" -import { resolveModule } from "../util/resolve" -import { parseUrl } from "../util/pathManager" +import { AppInfo } from "../appInfo.js" +import { Configuration } from "../configuration.js" +import { Platform, Target, TargetSpecificOptions } from "../core.js" +import { ArtifactCreated } from "../packagerApi.js" +import { PlatformSpecificBuildOptions } from "../options/PlatformSpecificBuildOptions.js" +import { Packager } from "../packager.js" +import { PlatformPackager } from "../platformPackager.js" +import { expandMacro } from "../util/macroExpander.js" +import { WinPackager } from "../winPackager.js" +import { createUpdateInfoTasks, UpdateInfoFileTask, writeUpdateInfoFiles } from "./updateInfoBuilder.js" +import { resolveModule } from "../util/resolve.js" +import { parseUrl } from "../util/pathManager.js" const publishForPrWarning = "There are serious security concerns with PUBLISH_FOR_PULL_REQUEST=true (see the CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)" + diff --git a/packages/app-builder-lib/src/publish/updateInfoBuilder.ts b/packages/app-builder-lib/src/publish/updateInfoBuilder.ts index 76f3bce4213..2257dcda417 100644 --- a/packages/app-builder-lib/src/publish/updateInfoBuilder.ts +++ b/packages/app-builder-lib/src/publish/updateInfoBuilder.ts @@ -1,17 +1,17 @@ import asyncPool from "tiny-async-pool" import { Arch, log, safeStringifyJson, serializeToYaml } from "builder-util" import { GenericServerOptions, PublishConfiguration, UpdateInfo, WindowsUpdateInfo } from "builder-util-runtime" -import { outputFile, outputJson, readFile } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" import * as semver from "semver" -import { Platform } from "../core" -import { ReleaseInfo } from "../options/PlatformSpecificBuildOptions" -import { Packager } from "../packager" -import { ArtifactCreated } from "../packagerApi" -import { PlatformPackager } from "../platformPackager" -import { hashFile } from "../util/hash" -import { computeDownloadUrl, getPublishConfigsForUpdateInfo } from "./PublishManager" +import { Platform } from "../core.js" +import { ReleaseInfo } from "../options/PlatformSpecificBuildOptions.js" +import { Packager } from "../packager.js" +import { ArtifactCreated } from "../packagerApi.js" +import { PlatformPackager } from "../platformPackager.js" +import { hashFile } from "../util/hash.js" +import { computeDownloadUrl, getPublishConfigsForUpdateInfo } from "./PublishManager.js" async function getReleaseInfo(packager: PlatformPackager) { const releaseInfo: ReleaseInfo = { ...(packager.platformSpecificBuildOptions.releaseInfo || packager.config.releaseInfo) } @@ -23,7 +23,7 @@ async function getReleaseInfo(packager: PlatformPackager) { `release-notes-${packager.platform.nodeName}.md`, "release-notes.md" ) - const releaseNotes = releaseNotesFile == null ? null : await readFile(releaseNotesFile, "utf-8") + const releaseNotes = releaseNotesFile == null ? null : await fsExtra.readFile(releaseNotesFile, "utf-8") // to avoid undefined in the file, check for null if (releaseNotes != null) { releaseInfo.releaseNotes = releaseNotes @@ -227,7 +227,7 @@ export async function writeUpdateInfoFiles(updateInfoFileTasks: Array + + constructor( + ignored: string, + private readonly packager: LinuxPackager, + private readonly helper: LinuxTargetHelper, + readonly outDir: string + ) { + super("appImage") + this.options = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } + + this.desktopEntry = new Lazy(() => { + const args = this.options.executableArgs?.join(" ") || "--no-sandbox" + return helper.computeDesktopEntry(this.options, `AppRun ${args} %U`, { + "X-AppImage-Version": `${packager.appInfo.buildVersion}`, + }) + }) + } + + async build(appOutDir: string, arch: Arch): Promise { + const packager = this.packager + const options = this.options + // https://github.com/electron-userland/electron-builder/issues/775 + // https://github.com/electron-userland/electron-builder/issues/1726 + // tslint:disable-next-line:no-invalid-template-strings + const artifactName = packager.expandArtifactNamePattern(options, "AppImage", arch) + const artifactPath = path.join(this.outDir, artifactName) + await packager.info.emitArtifactBuildStarted({ + targetPresentableName: "AppImage", + file: artifactPath, + arch, + }) + + const c = await Promise.all([ + this.desktopEntry.value, + this.helper.icons, + getAppUpdatePublishConfiguration(packager, options, arch, false /* in any case validation will be done on publish */), + getNotLocalizedLicenseFile(options.license, this.packager, ["txt", "html"]), + createStageDir(this, packager, arch), + ]) + const license = c[3] + const stageDir = c[4] + + const publishConfig = c[2] + if (publishConfig != null) { + await fsExtra.outputFile(path.join(packager.getResourcesDir(stageDir.dir), "app-update.yml"), serializeToYaml(publishConfig)) + } + + if ( + this.packager.packagerOptions.effectiveOptionComputed != null && + (await this.packager.packagerOptions.effectiveOptionComputed({ desktop: await this.desktopEntry.value })) + ) { + return + } + + const args = [ + "appimage", + "--stage", + stageDir.dir, + "--arch", + Arch[arch], + "--output", + artifactPath, + "--app", + appOutDir, + "--configuration", + JSON.stringify({ + productName: this.packager.appInfo.productName, + productFilename: this.packager.appInfo.productFilename, + desktopEntry: c[0], + executableName: this.packager.executableName, + icons: c[1], + fileAssociations: this.packager.fileAssociations, + ...options, + }), + ] + objectToArgs(args, { + license, + }) + if (packager.compression === "maximum") { + args.push("--compression", "xz") + } + + await packager.info.emitArtifactBuildCompleted({ + file: artifactPath, + safeArtifactName: packager.computeSafeArtifactName(artifactName, "AppImage", arch, false), + target: this, + arch, + packager, + isWriteUpdateInfo: true, + updateInfo: await executeAppBuilderAsJson(args), + }) + } +} diff --git a/packages/app-builder-lib/src/targets/AppxTarget.ts b/packages/app-builder-lib/src/targets/AppxTarget.ts index 234a95d66a8..acfd92a0ab6 100644 --- a/packages/app-builder-lib/src/targets/AppxTarget.ts +++ b/packages/app-builder-lib/src/targets/AppxTarget.ts @@ -1,16 +1,16 @@ import { Arch, asArray, copyOrLinkFile, deepAssign, InvalidConfigurationError, log, walk } from "builder-util" import { Nullish } from "builder-util-runtime" -import { emptyDir, readdir, readFile, writeFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { AppXOptions } from "../" -import { getWindowsKitsBundle } from "../toolsets/windows" -import { Target } from "../core" -import { getTemplatePath } from "../util/pathManager" -import { VmManager } from "../vm/vm" -import { WinPackager } from "../winPackager" -import { createStageDir } from "./targetUtil" -import { isOldWin6 } from "../toolsets/windows" -import { CAPABILITIES, isValidCapabilityName } from "./AppxCapabilities" +import { AppXOptions } from "../options/AppXOptions.js" +import { getWindowsKitsBundle } from "../toolsets/windows.js" +import { Target } from "../core.js" +import { getTemplatePath } from "../util/pathManager.js" +import { VmManager } from "../vm/vm.js" +import { WinPackager } from "../winPackager.js" +import { createStageDir } from "./targetUtil.js" +import { isOldWin6 } from "../toolsets/windows.js" +import { CAPABILITIES, isValidCapabilityName } from "./AppxCapabilities.js" const APPX_ASSETS_DIR_NAME = "appx" @@ -49,7 +49,7 @@ const restrictedApplicationIdValues = [ const DEFAULT_RESOURCE_LANG = "en-US" export default class AppXTarget extends Target { - readonly options: AppXOptions = deepAssign({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx) + readonly options: AppXOptions isAsyncSupported = false @@ -58,6 +58,7 @@ export default class AppXTarget extends Target { readonly outDir: string ) { super("appx") + this.options = deepAssign({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx) if (process.platform !== "darwin" && (process.platform !== "win32" || isOldWin6())) { throw new Error("AppX is supported only on Windows 10 or Windows Server 2012 R2 (version number 6.3+)") @@ -115,7 +116,7 @@ export default class AppXTarget extends Target { const makePriPath = vm.toVmFile(path.join(vendorPath.kit, "makepri.exe")) const assetRoot = stageDir.getTempFile("appx/assets") - await emptyDir(assetRoot) + await fsExtra.emptyDir(assetRoot) await Promise.all(assetInfo.allAssets.map(it => copyOrLinkFile(it, path.join(assetRoot, path.basename(it))))) await vm.exec(makePriPath, [ @@ -132,7 +133,7 @@ export default class AppXTarget extends Target { ]) // in addition to resources.pri, resources.scale-140.pri and other such files will be generated - for (const resourceFile of (await readdir(stageDir.dir)).filter(it => it.startsWith("resources.")).sort()) { + for (const resourceFile of (await fsExtra.readdir(stageDir.dir)).filter(it => it.startsWith("resources.")).sort()) { mappingList.push([`"${vm.toVmFile(stageDir.getTempFile(resourceFile))}" "${resourceFile}"`]) } makeAppXArgs.push("/l") @@ -142,7 +143,7 @@ export default class AppXTarget extends Target { for (const list of mappingList) { mapping += "\r\n" + list.join("\r\n") } - await writeFile(mappingFile, mapping) + await fsExtra.writeFile(mappingFile, mapping) packager.debugLogger.add("appx.mapping", mapping) if (this.options.makeappxArgs != null) { @@ -172,7 +173,7 @@ export default class AppXTarget extends Target { if (userAssetDir == null) { userAssets = [] } else { - userAssets = (await readdir(userAssetDir)).filter(it => !it.startsWith(".") && !it.endsWith(".db") && it.includes(".")) + userAssets = (await fsExtra.readdir(userAssetDir)).filter(it => !it.startsWith(".") && !it.endsWith(".db") && it.includes(".")) for (const name of userAssets) { mappings.push(`"${vm.toVmFile(userAssetDir)}${vm.pathSep}${name}" "assets\\${name}"`) allAssets.push(path.join(userAssetDir, name)) @@ -210,7 +211,7 @@ export default class AppXTarget extends Target { if (customManifestPath) { log.info({ manifestPath: log.filePath(customManifestPath) }, "custom appx manifest found") } - const manifestFileContent = await readFile(customManifestPath || path.join(getTemplatePath("appx"), "appxmanifest.xml"), "utf8") + const manifestFileContent = await fsExtra.readFile(customManifestPath || path.join(getTemplatePath("appx"), "appxmanifest.xml"), "utf8") const manifest = manifestFileContent.replace(/\${([a-zA-Z0-9]+)}/g, (match, p1): string => { switch (p1) { case "publisher": @@ -334,7 +335,7 @@ export default class AppXTarget extends Target { throw new Error(`Macro ${p1} is not defined`) } }) - await writeFile(outFile, manifest) + await fsExtra.writeFile(outFile, manifest) } private getCapabilities(): string { @@ -406,7 +407,7 @@ export default class AppXTarget extends Target { if (this.options.customExtensionsPath !== undefined) { const extensionsPath = path.resolve(this.packager.info.appDir, this.options.customExtensionsPath) - extensions += await readFile(extensionsPath, "utf8") + extensions += await fsExtra.readFile(extensionsPath, "utf8") } extensions += "" diff --git a/packages/app-builder-lib/src/targets/ArchiveTarget.ts b/packages/app-builder-lib/src/targets/ArchiveTarget.ts index 272c25fc76d..581c40645e2 100644 --- a/packages/app-builder-lib/src/targets/ArchiveTarget.ts +++ b/packages/app-builder-lib/src/targets/ArchiveTarget.ts @@ -1,13 +1,13 @@ import { Arch, defaultArchFromString } from "builder-util" import * as path from "path" -import { Platform, Target, TargetSpecificOptions } from "../core" -import { copyFiles, getFileMatchers } from "../fileMatcher" -import { PlatformPackager } from "../platformPackager" -import { archive, tar } from "./archive" -import { appendBlockmap, createBlockmap } from "./differentialUpdateInfoBuilder" +import { Platform, Target, TargetSpecificOptions } from "../core.js" +import { copyFiles, getFileMatchers } from "../fileMatcher.js" +import { PlatformPackager } from "../platformPackager.js" +import { archive, tar } from "./archive.js" +import { appendBlockmap, createBlockmap } from "./differentialUpdateInfoBuilder.js" export class ArchiveTarget extends Target { - readonly options: TargetSpecificOptions = (this.packager.config as any)[this.name] + readonly options: TargetSpecificOptions constructor( name: string, @@ -16,6 +16,7 @@ export class ArchiveTarget extends Target { private readonly isWriteUpdateInfo = false ) { super(name) + this.options = (this.packager.config as any)[this.name] } async build(appOutDir: string, arch: Arch): Promise { diff --git a/packages/app-builder-lib/src/targets/FlatpakTarget.ts b/packages/app-builder-lib/src/targets/FlatpakTarget.ts index 5d7eea68043..e87b4b5ef08 100644 --- a/packages/app-builder-lib/src/targets/FlatpakTarget.ts +++ b/packages/app-builder-lib/src/targets/FlatpakTarget.ts @@ -1,20 +1,17 @@ import { bundle as bundleFlatpak, FlatpakBundlerBuildOptions, FlatpakManifest } from "@malept/flatpak-bundler" import { Arch, copyFile, toLinuxArchString } from "builder-util" -import { chmod, outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { Target } from "../core" -import { LinuxPackager } from "../linuxPackager" -import { FlatpakOptions } from "../options/linuxOptions" -import { getNotLocalizedLicenseFile } from "../util/license" -import { LinuxTargetHelper } from "./LinuxTargetHelper" -import { createStageDir, StageDir } from "./targetUtil" +import { Target } from "../core.js" +import { LinuxPackager } from "../linuxPackager.js" +import { FlatpakOptions } from "../options/linuxOptions.js" +import { getNotLocalizedLicenseFile } from "../util/license.js" +import { LinuxTargetHelper } from "./LinuxTargetHelper.js" +import { createStageDir, StageDir } from "./targetUtil.js" import { Nullish } from "builder-util-runtime" export default class FlatpakTarget extends Target { - readonly options: FlatpakOptions = { - ...this.packager.platformSpecificBuildOptions, - ...(this.packager.config as any)[this.name], - } + readonly options: FlatpakOptions constructor( name: string, @@ -23,6 +20,10 @@ export default class FlatpakTarget extends Target { readonly outDir: string ) { super(name) + this.options = { + ...this.packager.platformSpecificBuildOptions, + ...(this.packager.config as any)[this.name], + } } get appId(): string { @@ -67,8 +68,8 @@ export default class FlatpakTarget extends Target { private async createSandboxBinWrapper(stageDir: StageDir) { const useWaylandFlags = !!this.options.useWaylandFlags const electronWrapperPath = stageDir.getTempFile(path.join("bin", "electron-wrapper")) - await outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags)) - await chmod(electronWrapperPath, 0o755) + await fsExtra.outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags)) + await fsExtra.chmod(electronWrapperPath, 0o755) } private async createDesktopFile(stageDir: StageDir) { diff --git a/packages/app-builder-lib/src/targets/FpmTarget.ts b/packages/app-builder-lib/src/targets/FpmTarget.ts index a77508614ab..9957f88ea79 100644 --- a/packages/app-builder-lib/src/targets/FpmTarget.ts +++ b/packages/app-builder-lib/src/targets/FpmTarget.ts @@ -1,22 +1,22 @@ import { Arch, asArray, exec, getArchSuffix, log, serializeToYaml, TmpDir, toLinuxArchString, unlinkIfExists, use } from "builder-util" import { Nullish } from "builder-util-runtime" -import { copyFile, outputFile, stat } from "fs-extra" +import fsExtra from "fs-extra" import { mkdir, readFile } from "fs/promises" import * as path from "path" -import { smarten } from "../appInfo" -import { Target } from "../core" -import * as errorMessages from "../errorMessages" -import { LinuxPackager } from "../linuxPackager" -import { DebOptions, LinuxTargetSpecificOptions } from "../options/linuxOptions" -import { ArtifactCreated } from "../packagerApi" -import { getAppUpdatePublishConfiguration } from "../publish/PublishManager" -import { objectToArgs } from "../util/appBuilder" -import { computeEnv } from "../util/bundledTool" -import { hashFile } from "../util/hash" -import { isMacOsSierra } from "../util/macosVersion" -import { getTemplatePath } from "../util/pathManager" -import { installPrefix, LinuxTargetHelper } from "./LinuxTargetHelper" -import { getFpmPath, getLinuxToolsPath } from "../toolsets/linux" +import { smarten } from "../appInfo.js" +import { Target } from "../core.js" +import * as errorMessages from "../errorMessages.js" +import { LinuxPackager } from "../linuxPackager.js" +import { DebOptions, LinuxTargetSpecificOptions } from "../options/linuxOptions.js" +import { ArtifactCreated } from "../packagerApi.js" +import { getAppUpdatePublishConfiguration } from "../publish/PublishManager.js" +import { objectToArgs } from "../util/appBuilder.js" +import { computeEnv } from "../util/bundledTool.js" +import { hashFile } from "../util/hash.js" +import { isMacOsSierra } from "../util/macosVersion.js" +import { getTemplatePath } from "../util/pathManager.js" +import { installPrefix, LinuxTargetHelper } from "./LinuxTargetHelper.js" +import { getFpmPath, getLinuxToolsPath } from "../toolsets/linux.js" interface FpmOptions { name: string @@ -32,7 +32,7 @@ interface ScriptFiles { } export default class FpmTarget extends Target { - readonly options: LinuxTargetSpecificOptions = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } + readonly options: LinuxTargetSpecificOptions private readonly scriptFiles: Promise @@ -43,7 +43,7 @@ export default class FpmTarget extends Target { readonly outDir: string ) { super(name, false) - + this.options = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } this.scriptFiles = this.createScripts() } @@ -144,16 +144,16 @@ export default class FpmTarget extends Target { : null if (publishConfig != null) { log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`) - await outputFile(path.join(resourceDir, "app-update.yml"), serializeToYaml(publishConfig)) + await fsExtra.outputFile(path.join(resourceDir, "app-update.yml"), serializeToYaml(publishConfig)) // Extra file needed for auto-updater to detect installation method - await outputFile(path.join(resourceDir, "package-type"), target) + await fsExtra.outputFile(path.join(resourceDir, "package-type"), target) } const scripts = await this.scriptFiles // Install AppArmor support for ubuntu 24+ // https://github.com/electron-userland/electron-builder/issues/8635 - await copyFile(scripts.appArmor, path.join(resourceDir, "apparmor-profile")) + await fsExtra.copyFile(scripts.appArmor, path.join(resourceDir, "apparmor-profile")) const appInfo = packager.appInfo const options = this.options @@ -280,7 +280,7 @@ export default class FpmTarget extends Target { isWriteUpdateInfo: true, updateInfo: { sha512: await hashFile(artifactPath), - size: (await stat(artifactPath)).size, + size: (await fsExtra.stat(artifactPath)).size, }, } } @@ -411,6 +411,6 @@ async function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: an }) const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, ".tpl") }) - await outputFile(outputPath, config) + await fsExtra.outputFile(outputPath, config) return outputPath } diff --git a/packages/app-builder-lib/src/targets/LinuxTargetHelper.ts b/packages/app-builder-lib/src/targets/LinuxTargetHelper.ts index 14f24257c71..0f00a64438d 100644 --- a/packages/app-builder-lib/src/targets/LinuxTargetHelper.ts +++ b/packages/app-builder-lib/src/targets/LinuxTargetHelper.ts @@ -1,10 +1,10 @@ import { asArray, exists, isEmptyOrSpaces, log } from "builder-util" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import { join } from "path" -import { LinuxPackager } from "../linuxPackager" -import { LinuxTargetSpecificOptions } from "../options/linuxOptions" -import { IconInfo } from "../platformPackager" +import { LinuxPackager } from "../linuxPackager.js" +import { LinuxTargetSpecificOptions } from "../options/linuxOptions.js" +import { IconInfo } from "../platformPackager.js" export const installPrefix = "/opt" @@ -45,7 +45,7 @@ export class LinuxTargetHelper { } const file = await this.packager.getTempFile(".xml") - await outputFile( + await fsExtra.outputFile( file, '\n\n' + items.join("\n") + "\n" ) @@ -96,7 +96,7 @@ export class LinuxTargetHelper { async writeDesktopEntry(targetSpecificOptions: LinuxTargetSpecificOptions, exec?: string, destination?: string | null, extra?: Record): Promise { const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra) const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`)) - await outputFile(file, data) + await fsExtra.outputFile(file, data) return file } diff --git a/packages/app-builder-lib/src/targets/MsiTarget.ts b/packages/app-builder-lib/src/targets/MsiTarget.ts index cc323a020f2..73a60cdf3b1 100644 --- a/packages/app-builder-lib/src/targets/MsiTarget.ts +++ b/packages/app-builder-lib/src/targets/MsiTarget.ts @@ -5,16 +5,16 @@ import * as ejs from "ejs" import { readFile, writeFile } from "fs/promises" import { Lazy } from "lazy-val" import * as path from "path" -import { MsiOptions } from "../" -import { getBinFromUrl } from "../binDownload" -import { Target } from "../core" -import { DesktopShortcutCreationPolicy, FinalCommonWindowsInstallerOptions, getEffectiveOptions } from "../options/CommonWindowsInstallerConfiguration" -import { normalizeExt } from "../platformPackager" -import { getTemplatePath } from "../util/pathManager" -import { VmManager } from "../vm/vm" -import { WineVmManager } from "../vm/WineVm" -import { WinPackager } from "../winPackager" -import { createStageDir, getWindowsInstallationDirName } from "./targetUtil" +import { MsiOptions } from "../options/MsiOptions.js" +import { getBinFromUrl } from "../binDownload.js" +import { Target } from "../core.js" +import { DesktopShortcutCreationPolicy, FinalCommonWindowsInstallerOptions, getEffectiveOptions } from "../options/CommonWindowsInstallerConfiguration.js" +import { normalizeExt } from "../platformPackager.js" +import { getTemplatePath } from "../util/pathManager.js" +import { VmManager } from "../vm/vm.js" +import { WineVmManager } from "../vm/WineVm.js" +import { WinPackager } from "../winPackager.js" +import { createStageDir, getWindowsInstallationDirName } from "./targetUtil.js" const ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID = UUID.parse("d752fe43-5d44-44d5-9fc9-6dd1bf19d5cc") const ROOT_DIR_ID = "APPLICATIONFOLDER" @@ -23,7 +23,7 @@ const ROOT_DIR_ID = "APPLICATIONFOLDER" export default class MsiTarget extends Target { protected readonly vm = process.platform === "win32" ? new VmManager() : new WineVmManager() - readonly options: MsiOptions = deepAssign(this.packager.platformSpecificBuildOptions, this.packager.config.msi) + readonly options: MsiOptions constructor( protected readonly packager: WinPackager, @@ -32,6 +32,7 @@ export default class MsiTarget extends Target { isAsyncSupported = true ) { super(name, isAsyncSupported) + this.options = deepAssign(this.packager.platformSpecificBuildOptions, this.packager.config.msi) } protected projectTemplate = new Lazy<(data: any) => string>(async () => { diff --git a/packages/app-builder-lib/src/targets/MsiWrappedTarget.ts b/packages/app-builder-lib/src/targets/MsiWrappedTarget.ts index b2e2a8b4d9f..718a1b6919a 100644 --- a/packages/app-builder-lib/src/targets/MsiWrappedTarget.ts +++ b/packages/app-builder-lib/src/targets/MsiWrappedTarget.ts @@ -1,11 +1,11 @@ import { Arch, deepAssign, exists, InvalidConfigurationError } from "builder-util" import { UUID } from "builder-util-runtime" import * as path from "path" -import { MsiWrappedOptions } from "../" -import { TargetConfiguration } from "../core" -import { FinalCommonWindowsInstallerOptions } from "../options/CommonWindowsInstallerConfiguration" -import { WinPackager } from "../winPackager" -import MsiTarget from "./MsiTarget" +import { MsiWrappedOptions } from "../options/MsiWrappedOptions.js" +import { TargetConfiguration } from "../core.js" +import { FinalCommonWindowsInstallerOptions } from "../options/CommonWindowsInstallerConfiguration.js" +import { WinPackager } from "../winPackager.js" +import MsiTarget from "./MsiTarget.js" const ELECTRON_MSI_WRAPPED_NS_UUID = UUID.parse("467f7bb2-a83c-442f-b776-394d316e8e53") diff --git a/packages/app-builder-lib/src/targets/appimage/AppImageTarget.ts b/packages/app-builder-lib/src/targets/appimage/AppImageTarget.ts index d8840fd71a5..a1a977af8c7 100644 --- a/packages/app-builder-lib/src/targets/appimage/AppImageTarget.ts +++ b/packages/app-builder-lib/src/targets/appimage/AppImageTarget.ts @@ -1,17 +1,17 @@ -import { IconInfo } from "../../platformPackager" +import { IconInfo } from "../../platformPackager.js" import { Arch, log, serializeToYaml } from "builder-util" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" -import { Target } from "../../core" -import { LinuxPackager } from "../../linuxPackager" -import { AppImageOptions } from "../../options/linuxOptions" -import { getAppUpdatePublishConfiguration } from "../../publish/PublishManager" -import { executeAppBuilderAsJson, objectToArgs } from "../../util/appBuilder" -import { getNotLocalizedLicenseFile } from "../../util/license" -import { LinuxTargetHelper } from "../LinuxTargetHelper" -import { createStageDir, StageDir } from "../targetUtil" -import { buildAppImage } from "./appImageUtil" +import { Target } from "../../core.js" +import { LinuxPackager } from "../../linuxPackager.js" +import { AppImageOptions } from "../../options/linuxOptions.js" +import { getAppUpdatePublishConfiguration } from "../../publish/PublishManager.js" +import { executeAppBuilderAsJson, objectToArgs } from "../../util/appBuilder.js" +import { getNotLocalizedLicenseFile } from "../../util/license.js" +import { LinuxTargetHelper } from "../LinuxTargetHelper.js" +import { createStageDir, StageDir } from "../targetUtil.js" +import { buildAppImage } from "./appImageUtil.js" import { BlockMapDataHolder } from "builder-util-runtime" // https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file @@ -19,7 +19,7 @@ import { BlockMapDataHolder } from "builder-util-runtime" export const APP_RUN_ENTRYPOINT = "AppRun" export default class AppImageTarget extends Target { - readonly options: AppImageOptions = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } + readonly options: AppImageOptions private readonly desktopEntry: Lazy @@ -30,6 +30,7 @@ export default class AppImageTarget extends Target { readonly outDir: string ) { super("appImage") + this.options = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } this.desktopEntry = new Lazy(() => { const appimageTool = packager.config.toolsets?.appimage @@ -67,7 +68,7 @@ export default class AppImageTarget extends Target { ]) if (publishConfig != null) { - await outputFile(path.join(packager.getResourcesDir(appOutDir), "app-update.yml"), serializeToYaml(publishConfig)) + await fsExtra.outputFile(path.join(packager.getResourcesDir(appOutDir), "app-update.yml"), serializeToYaml(publishConfig)) } if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ desktop: desktopEntry }))) { diff --git a/packages/app-builder-lib/src/targets/appimage/appImageUtil.ts b/packages/app-builder-lib/src/targets/appimage/appImageUtil.ts index b6433e98a9d..1916792dde0 100644 --- a/packages/app-builder-lib/src/targets/appimage/appImageUtil.ts +++ b/packages/app-builder-lib/src/targets/appimage/appImageUtil.ts @@ -1,14 +1,14 @@ import { Arch, copyDir, copyFile, exec, exists, InvalidConfigurationError, log } from "builder-util" import * as fs from "fs-extra" import * as path from "path" -import { FileAssociation } from "../../options/FileAssociation" -import { IconInfo } from "../../platformPackager" -import { getAppImageTools } from "../../toolsets/linux" -import { copyIcons, copyMimeTypes } from "./appLauncher" -import { appendBlockmap } from "../differentialUpdateInfoBuilder" +import { FileAssociation } from "../../options/FileAssociation.js" +import { IconInfo } from "../../platformPackager.js" +import { getAppImageTools } from "../../toolsets/linux.js" +import { copyIcons, copyMimeTypes } from "./appLauncher.js" +import { appendBlockmap } from "../differentialUpdateInfoBuilder.js" import { BlockMapDataHolder } from "builder-util-runtime" -import { APP_RUN_ENTRYPOINT } from "./AppImageTarget" -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { APP_RUN_ENTRYPOINT } from "./AppImageTarget.js" +import { ToolsetConfig } from "../../configuration.js" interface Options { productName: string diff --git a/packages/app-builder-lib/src/targets/appimage/appLauncher.ts b/packages/app-builder-lib/src/targets/appimage/appLauncher.ts index 9b900c2b826..fdea0bfd11a 100644 --- a/packages/app-builder-lib/src/targets/appimage/appLauncher.ts +++ b/packages/app-builder-lib/src/targets/appimage/appLauncher.ts @@ -1,7 +1,7 @@ import * as path from "path" -import * as fs from "fs-extra" +import fs from "fs-extra" import { copyOrLinkFile, log } from "builder-util" -import { AppImageBuilderOptions } from "./appImageUtil" +import { AppImageBuilderOptions } from "./appImageUtil.js" const ICON_DIR_RELATIVE_PATH = "usr/share/icons/hicolor" const MIME_TYPE_DIR_RELATIVE_PATH = "usr/share/mime/packages" diff --git a/packages/app-builder-lib/src/targets/archive.ts b/packages/app-builder-lib/src/targets/archive.ts index 88782e9cebb..f3936f65c52 100644 --- a/packages/app-builder-lib/src/targets/archive.ts +++ b/packages/app-builder-lib/src/targets/archive.ts @@ -1,11 +1,11 @@ import { debug7z, exec, exists, getPath7za, log, statOrNull, unlinkIfExists } from "builder-util" -import { move } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" import { create } from "tar" import { TmpDir } from "temp-file" -import { CompressionLevel } from "../core" -import { getLinuxToolsPath } from "../toolsets/linux" -import { TarOptionsWithAliasesAsync } from "tar/dist/commonjs/options" +import { CompressionLevel } from "../core.js" +import { getLinuxToolsPath } from "../toolsets/linux.js" +import { TarOptionsWithAliasesAsync } from "tar" /** @internal */ export async function tar(compression: CompressionLevel | any, format: string, outFile: string, dirToArchive: string, isMacApp: boolean, tempDirManager: TmpDir): Promise { @@ -37,7 +37,7 @@ export async function tar(compression: CompressionLevel | any, format: string, o } await exec(lzipPath, [compression === "store" ? "-1" : "-9", "--keep" /* keep (don't delete) input files */, tarFile]) // bloody lzip creates file in the same dir where input file with postfix `.lz`, option --output doesn't work - await move(`${tarFile}.lz`, outFile) + await fsExtra.move(`${tarFile}.lz`, outFile) return } diff --git a/packages/app-builder-lib/src/targets/differentialUpdateInfoBuilder.ts b/packages/app-builder-lib/src/targets/differentialUpdateInfoBuilder.ts index b5c71541367..a06ed91e8aa 100644 --- a/packages/app-builder-lib/src/targets/differentialUpdateInfoBuilder.ts +++ b/packages/app-builder-lib/src/targets/differentialUpdateInfoBuilder.ts @@ -1,10 +1,10 @@ import { log } from "builder-util" import { BlockMapDataHolder, PackageFileInfo } from "builder-util-runtime" import * as path from "path" -import { Target } from "../core" -import { PlatformPackager } from "../platformPackager" -import { executeAppBuilderAsJson } from "../util/appBuilder" -import { ArchiveOptions } from "./archive" +import { Target } from "../core.js" +import { PlatformPackager } from "../platformPackager.js" +import { executeAppBuilderAsJson } from "../util/appBuilder.js" +import { ArchiveOptions } from "./archive.js" export const BLOCK_MAP_FILE_SUFFIX = ".blockmap" diff --git a/packages/app-builder-lib/src/targets/nsis/Defines.ts b/packages/app-builder-lib/src/targets/nsis/Defines.ts index 912f07993f7..fcad4e185ff 100644 --- a/packages/app-builder-lib/src/targets/nsis/Defines.ts +++ b/packages/app-builder-lib/src/targets/nsis/Defines.ts @@ -1,4 +1,4 @@ -import { PortableOptions } from "./nsisOptions" +import { PortableOptions } from "./nsisOptions.js" /** * Parameters declared as environment variables in NSIS scripts. * The documentation vaguely explains "All other electron-builder specific flags (e.g. ONE_CLICK) are still defined." diff --git a/packages/app-builder-lib/src/targets/nsis/NsisTarget.ts b/packages/app-builder-lib/src/targets/nsis/NsisTarget.ts index d95633edaf2..b0ea75570c0 100644 --- a/packages/app-builder-lib/src/targets/nsis/NsisTarget.ts +++ b/packages/app-builder-lib/src/targets/nsis/NsisTarget.ts @@ -18,26 +18,26 @@ import { import { CURRENT_APP_INSTALLER_FILE_NAME, CURRENT_APP_PACKAGE_FILE_NAME, PackageFileInfo, UUID } from "builder-util-runtime" import _debug from "debug" import * as fs from "fs" -import { readFile, stat, unlink } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { Target } from "../../core" -import { DesktopShortcutCreationPolicy, getEffectiveOptions } from "../../options/CommonWindowsInstallerConfiguration" -import { chooseNotNull, computeSafeArtifactNameIfNeeded, normalizeExt } from "../../platformPackager" -import { hashFile } from "../../util/hash" -import { isMacOsCatalina } from "../../util/macosVersion" -import { time } from "../../util/timer" -import { execWine } from "../../wine" -import { WinPackager } from "../../winPackager" -import { archive, ArchiveOptions } from "../archive" -import { appendBlockmap, configureDifferentialAwareArchiveOptions, createBlockmap, createNsisWebDifferentialUpdateInfo } from "../differentialUpdateInfoBuilder" -import { getWindowsInstallationAppPackageName, getWindowsInstallationDirName } from "../targetUtil" -import { Commands } from "./Commands" -import { Defines } from "./Defines" -import { addCustomMessageFileInclude, createAddLangsMacro, LangConfigurator } from "./nsisLang" -import { computeLicensePage } from "./nsisLicense" -import { NsisOptions, PortableOptions } from "./nsisOptions" -import { NsisScriptGenerator } from "./nsisScriptGenerator" -import { AppPackageHelper, NSIS_PATH, NSIS_RESOURCES_PATH, NsisTargetOptions, nsisTemplatesDir, UninstallerReader } from "./nsisUtil" +import { Target } from "../../core.js" +import { DesktopShortcutCreationPolicy, getEffectiveOptions } from "../../options/CommonWindowsInstallerConfiguration.js" +import { chooseNotNull, computeSafeArtifactNameIfNeeded, normalizeExt } from "../../platformPackager.js" +import { hashFile } from "../../util/hash.js" +import { isMacOsCatalina } from "../../util/macosVersion.js" +import { time } from "../../util/timer.js" +import { execWine } from "../../wine.js" +import { WinPackager } from "../../winPackager.js" +import { archive, ArchiveOptions } from "../archive.js" +import { appendBlockmap, configureDifferentialAwareArchiveOptions, createBlockmap, createNsisWebDifferentialUpdateInfo } from "../differentialUpdateInfoBuilder.js" +import { getWindowsInstallationAppPackageName, getWindowsInstallationDirName } from "../targetUtil.js" +import { Commands } from "./Commands.js" +import { Defines } from "./Defines.js" +import { addCustomMessageFileInclude, createAddLangsMacro, LangConfigurator } from "./nsisLang.js" +import { computeLicensePage } from "./nsisLicense.js" +import { NsisOptions, PortableOptions } from "./nsisOptions.js" +import { NsisScriptGenerator } from "./nsisScriptGenerator.js" +import { AppPackageHelper, NSIS_PATH, NSIS_RESOURCES_PATH, NsisTargetOptions, nsisTemplatesDir, UninstallerReader } from "./nsisUtil.js" const debug = _debug("electron-builder:nsis") @@ -352,14 +352,14 @@ export class NsisTarget extends Target { this.buildQueueManager.add(async () => { const sharedHeader = await this.computeCommonInstallerScriptHeader() const script = isPortable - ? await readFile(path.join(nsisTemplatesDir, "portable.nsi"), "utf8") + ? await fsExtra.readFile(path.join(nsisTemplatesDir, "portable.nsi"), "utf8") : await this.computeScriptAndSignUninstaller(definesUninstaller, commandsUninstaller, installerPath, sharedHeader, archs) // copy outfile name into main options, as the computeScriptAndSignUninstaller function was kind enough to add important data to temporary defines. defines.UNINSTALLER_OUT_FILE = definesUninstaller.UNINSTALLER_OUT_FILE await this.executeMakensis(defines, commands, sharedHeader + (await this.computeFinalScript(script, true, archs))) - await Promise.all([packager.signIf(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : unlink(defines.UNINSTALLER_OUT_FILE)]) + await Promise.all([packager.signIf(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : fsExtra.unlink(defines.UNINSTALLER_OUT_FILE)]) const safeArtifactName = computeSafeArtifactNameIfNeeded(installerFilename, () => this.generateGitHubInstallerName(primaryArch, defaultArch)) let updateInfo: any @@ -403,7 +403,7 @@ export class NsisTarget extends Target { private async computeScriptAndSignUninstaller(defines: Defines, commands: Commands, installerPath: string, sharedHeader: string, archs: Map): Promise { const packager = this.packager const customScriptPath = await packager.getResource(this.options.script, "installer.nsi") - const script = await readFile(customScriptPath || path.join(nsisTemplatesDir, "installer.nsi"), "utf8") + const script = await fsExtra.readFile(customScriptPath || path.join(nsisTemplatesDir, "installer.nsi"), "utf8") if (customScriptPath != null) { log.info({ reason: "custom NSIS script is used" }, "uninstaller is not signed by electron-builder") @@ -821,7 +821,7 @@ async function ensureNotBusy(outFile: string): Promise { async function createPackageFileInfo(file: string): Promise { return { path: file, - size: (await stat(file)).size, + size: (await fsExtra.stat(file)).size, sha512: await hashFile(file), } } diff --git a/packages/app-builder-lib/src/targets/nsis/WebInstallerTarget.ts b/packages/app-builder-lib/src/targets/nsis/WebInstallerTarget.ts index cad495bdc36..235c00fc6ca 100644 --- a/packages/app-builder-lib/src/targets/nsis/WebInstallerTarget.ts +++ b/packages/app-builder-lib/src/targets/nsis/WebInstallerTarget.ts @@ -1,9 +1,9 @@ import { Arch, log } from "builder-util" -import { computeDownloadUrl, getPublishConfigs, getPublishConfigsForUpdateInfo } from "../../publish/PublishManager" -import { WinPackager } from "../../winPackager" -import { NsisWebOptions } from "./nsisOptions" -import { NsisTarget } from "./NsisTarget" -import { AppPackageHelper } from "./nsisUtil" +import { computeDownloadUrl, getPublishConfigs, getPublishConfigsForUpdateInfo } from "../../publish/PublishManager.js" +import { WinPackager } from "../../winPackager.js" +import { NsisWebOptions } from "./nsisOptions.js" +import { NsisTarget } from "./NsisTarget.js" +import { AppPackageHelper } from "./nsisUtil.js" /** @private */ export class WebInstallerTarget extends NsisTarget { diff --git a/packages/app-builder-lib/src/targets/nsis/nsisLang.ts b/packages/app-builder-lib/src/targets/nsis/nsisLang.ts index c93779eb350..0e2dc7a27dd 100644 --- a/packages/app-builder-lib/src/targets/nsis/nsisLang.ts +++ b/packages/app-builder-lib/src/targets/nsis/nsisLang.ts @@ -1,13 +1,13 @@ import { asArray } from "builder-util" import _debug from "debug" -import { outputFile, readFile } from "fs-extra" +import fsExtra from "fs-extra" import { load } from "js-yaml" import * as path from "path" -import { PlatformPackager } from "../../platformPackager" -import { bundledLanguages, langIdToName, lcid, toLangWithRegion } from "../../util/langs" -import { NsisOptions } from "./nsisOptions" -import { NsisScriptGenerator } from "./nsisScriptGenerator" -import { nsisTemplatesDir } from "./nsisUtil" +import { PlatformPackager } from "../../platformPackager.js" +import { bundledLanguages, langIdToName, lcid, toLangWithRegion } from "../../util/langs.js" +import { NsisOptions } from "./nsisOptions.js" +import { NsisScriptGenerator } from "./nsisScriptGenerator.js" +import { nsisTemplatesDir } from "./nsisUtil.js" const debug = _debug("electron-builder:nsis") @@ -63,12 +63,12 @@ export function createAddLangsMacro(scriptGenerator: NsisScriptGenerator, langCo async function writeCustomLangFile(data: string, packager: PlatformPackager) { const file = await packager.getTempFile("messages.nsh") - await outputFile(file, data) + await fsExtra.outputFile(file, data) return file } export async function addCustomMessageFileInclude(input: string, packager: PlatformPackager, scriptGenerator: NsisScriptGenerator, langConfigurator: LangConfigurator) { - const data = load(await readFile(path.join(nsisTemplatesDir, input), "utf-8")) + const data = load(await fsExtra.readFile(path.join(nsisTemplatesDir, input), "utf-8")) const instructions = computeCustomMessageTranslations(data, langConfigurator).join("\n") debug(instructions) scriptGenerator.include(await writeCustomLangFile(instructions, packager)) diff --git a/packages/app-builder-lib/src/targets/nsis/nsisLicense.ts b/packages/app-builder-lib/src/targets/nsis/nsisLicense.ts index a5cfaf799cd..436689606ef 100644 --- a/packages/app-builder-lib/src/targets/nsis/nsisLicense.ts +++ b/packages/app-builder-lib/src/targets/nsis/nsisLicense.ts @@ -1,12 +1,12 @@ import { log } from "builder-util" import * as fs from "fs" import * as path from "path" -import { lcid } from "../../util/langs" -import { getLicenseFiles, getNotLocalizedLicenseFile } from "../../util/license" -import { WinPackager } from "../../winPackager" -import { NsisOptions } from "./nsisOptions" -import { NsisScriptGenerator } from "./nsisScriptGenerator" -import { nsisTemplatesDir } from "./nsisUtil" +import { lcid } from "../../util/langs.js" +import { getLicenseFiles, getNotLocalizedLicenseFile } from "../../util/license.js" +import { WinPackager } from "../../winPackager.js" +import { NsisOptions } from "./nsisOptions.js" +import { NsisScriptGenerator } from "./nsisScriptGenerator.js" +import { nsisTemplatesDir } from "./nsisUtil.js" function convertFileToUtf8WithBOMSync(filePath: string): boolean { try { diff --git a/packages/app-builder-lib/src/targets/nsis/nsisOptions.ts b/packages/app-builder-lib/src/targets/nsis/nsisOptions.ts index f6c17f655a4..4540a65d61d 100644 --- a/packages/app-builder-lib/src/targets/nsis/nsisOptions.ts +++ b/packages/app-builder-lib/src/targets/nsis/nsisOptions.ts @@ -1,5 +1,5 @@ -import { CommonWindowsInstallerConfiguration } from "../.." -import { TargetSpecificOptions } from "../../core" +import { CommonWindowsInstallerConfiguration } from "../../options/CommonWindowsInstallerConfiguration.js" +import { TargetSpecificOptions } from "../../core.js" export interface CustomNsisBinary { /** diff --git a/packages/app-builder-lib/src/targets/nsis/nsisUtil.ts b/packages/app-builder-lib/src/targets/nsis/nsisUtil.ts index c0efb72cd61..9e741a60d19 100644 --- a/packages/app-builder-lib/src/targets/nsis/nsisUtil.ts +++ b/packages/app-builder-lib/src/targets/nsis/nsisUtil.ts @@ -3,10 +3,10 @@ import { PackageFileInfo } from "builder-util-runtime" import * as fs from "fs/promises" import * as path from "path" import * as zlib from "zlib" -import { getBinFromCustomLoc, getBinFromUrl } from "../../binDownload" -import { getTemplatePath } from "../../util/pathManager" -import { NsisOptions } from "./nsisOptions" -import { NsisTarget } from "./NsisTarget" +import { getBinFromCustomLoc, getBinFromUrl } from "../../binDownload.js" +import { getTemplatePath } from "../../util/pathManager.js" +import { NsisOptions } from "./nsisOptions.js" +import { NsisTarget } from "./NsisTarget.js" export const nsisTemplatesDir = getTemplatePath("nsis") diff --git a/packages/app-builder-lib/src/targets/pkg.ts b/packages/app-builder-lib/src/targets/pkg.ts index 8bf509e41fb..d78d9e0edeb 100644 --- a/packages/app-builder-lib/src/targets/pkg.ts +++ b/packages/app-builder-lib/src/targets/pkg.ts @@ -3,13 +3,13 @@ import { Nullish } from "builder-util-runtime" import { readdirSync } from "fs" import { readFile, unlink, writeFile } from "fs/promises" import * as path from "path" -import { filterCFBundleIdentifier } from "../appInfo" -import { findIdentity, Identity } from "../codeSign/macCodeSign" -import { Target } from "../core" -import { MacPackager } from "../macPackager" -import { PkgOptions } from "../options/pkgOptions" -import { savePlistFile, parsePlistFile, PlistObject } from "../util/plist" -import { getNotLocalizedLicenseFile } from "../util/license" +import { filterCFBundleIdentifier } from "../appInfo.js" +import { findIdentity, Identity } from "../codeSign/macCodeSign.js" +import { Target } from "../core.js" +import { MacPackager } from "../macPackager.js" +import { PkgOptions } from "../options/pkgOptions.js" +import { savePlistFile, parsePlistFile, PlistObject } from "../util/plist.js" +import { getNotLocalizedLicenseFile } from "../util/license.js" const certType = "Developer ID Installer" @@ -39,18 +39,19 @@ type ExtraPackages = { // productbuild --scripts doesn't work (because scripts in this case not added to our package) // https://github.com/electron-userland/@electron/osx-sign/issues/96#issuecomment-274986942 export class PkgTarget extends Target { - readonly options: PkgOptions = { - allowAnywhere: true, - allowCurrentUserHome: true, - allowRootDirectory: true, - ...this.packager.config.pkg, - } + readonly options: PkgOptions constructor( private readonly packager: MacPackager, readonly outDir: string ) { super("pkg") + this.options = { + allowAnywhere: true, + allowCurrentUserHome: true, + allowRootDirectory: true, + ...this.packager.config.pkg, + } } async build(appPath: string, arch: Arch): Promise { diff --git a/packages/app-builder-lib/src/targets/snap.ts b/packages/app-builder-lib/src/targets/snap.ts index 6dfc35a1552..265f979bc71 100644 --- a/packages/app-builder-lib/src/targets/snap.ts +++ b/packages/app-builder-lib/src/targets/snap.ts @@ -1,21 +1,21 @@ import { replaceDefault as _replaceDefault, Arch, deepAssign, executeAppBuilder, InvalidConfigurationError, log, serializeToYaml, toLinuxArchString } from "builder-util" import { asArray, Nullish, SnapStoreOptions } from "builder-util-runtime" -import { outputFile, readFile } from "fs-extra" +import fsExtra from "fs-extra" import { load } from "js-yaml" import * as path from "path" import * as semver from "semver" -import { Configuration } from "../configuration" -import { Publish, Target } from "../core" -import { LinuxPackager } from "../linuxPackager" -import { PlugDescriptor, SnapOptions } from "../options/SnapOptions" -import { getTemplatePath } from "../util/pathManager" -import { LinuxTargetHelper } from "./LinuxTargetHelper" -import { createStageDirPath } from "./targetUtil" +import { Configuration } from "../configuration.js" +import { Publish, Target } from "../core.js" +import { LinuxPackager } from "../linuxPackager.js" +import { PlugDescriptor, SnapOptions } from "../options/SnapOptions.js" +import { getTemplatePath } from "../util/pathManager.js" +import { LinuxTargetHelper } from "./LinuxTargetHelper.js" +import { createStageDirPath } from "./targetUtil.js" const defaultPlugs = ["desktop", "desktop-legacy", "home", "x11", "wayland", "unity7", "browser-support", "network", "gsettings", "audio-playback", "pulseaudio", "opengl"] export default class SnapTarget extends Target { - readonly options: SnapOptions = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } + readonly options: SnapOptions public isUseTemplateApp = false @@ -26,6 +26,7 @@ export default class SnapTarget extends Target { readonly outDir: string ) { super(name) + this.options = { ...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name] } } private replaceDefault(inList: Array | Nullish, defaultList: Array) { @@ -71,7 +72,7 @@ export default class SnapTarget extends Target { adapter: "none", } - const snap: any = load(await readFile(path.join(getTemplatePath("snap"), "snapcraft.yaml"), "utf-8")) + const snap: any = load(await fsExtra.readFile(path.join(getTemplatePath("snap"), "snapcraft.yaml"), "utf-8")) if (this.isUseTemplateApp) { delete appDescriptor.adapter } @@ -251,7 +252,7 @@ export default class SnapTarget extends Target { return } - await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? "snap.yaml" : "snapcraft.yaml"), serializeToYaml(snap)) + await fsExtra.outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? "snap.yaml" : "snapcraft.yaml"), serializeToYaml(snap)) const hooksDir = await packager.getResource(options.hooks, "snap-hooks") if (hooksDir != null) { diff --git a/packages/app-builder-lib/src/targets/targetFactory.ts b/packages/app-builder-lib/src/targets/targetFactory.ts index 744d13a1f3a..8d1cf37b542 100644 --- a/packages/app-builder-lib/src/targets/targetFactory.ts +++ b/packages/app-builder-lib/src/targets/targetFactory.ts @@ -1,7 +1,7 @@ import { addValue, Arch, archFromString, ArchType, asArray } from "builder-util" -import { DEFAULT_TARGET, DIR_TARGET, Platform, Target, TargetConfiguration } from "../core" -import { PlatformPackager } from "../platformPackager" -import { ArchiveTarget } from "./ArchiveTarget" +import { DEFAULT_TARGET, DIR_TARGET, Platform, Target, TargetConfiguration } from "../core.js" +import { PlatformPackager } from "../platformPackager.js" +import { ArchiveTarget } from "./ArchiveTarget.js" const archiveTargets = new Set(["zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]) diff --git a/packages/app-builder-lib/src/targets/targetUtil.ts b/packages/app-builder-lib/src/targets/targetUtil.ts index cb7fb2a8cff..b07b29ef001 100644 --- a/packages/app-builder-lib/src/targets/targetUtil.ts +++ b/packages/app-builder-lib/src/targets/targetUtil.ts @@ -1,8 +1,9 @@ import { Arch, debug } from "builder-util" import * as fs from "fs/promises" import * as path from "path" -import { AppInfo, Target } from "../" -import { PlatformPackager } from "../platformPackager" +import { AppInfo } from "../appInfo.js" +import { Target } from "../core.js" +import { PlatformPackager } from "../platformPackager.js" export class StageDir { constructor(readonly dir: string) {} diff --git a/packages/app-builder-lib/src/targets/tools.ts b/packages/app-builder-lib/src/targets/tools.ts new file mode 100644 index 00000000000..089df14cf95 --- /dev/null +++ b/packages/app-builder-lib/src/targets/tools.ts @@ -0,0 +1,44 @@ +import * as path from "path" +import { getBinFromUrl } from "../binDownload.js" + +export function getLinuxToolsPath() { + return getBinFromUrl("linux-tools-mac-10.12.3", "linux-tools-mac-10.12.3.7z", "SQ8fqIRVXuQVWnVgaMTDWyf2TLAJjJYw3tRSqQJECmgF6qdM7Kogfa6KD49RbGzzMYIFca9Uw3MdsxzOPRWcYw==") +} + +export async function getFpmPath() { + // It's just easier to copy the map of checksums here rather then adding them to within each if-statement. Also, easy copy-paste from the releases page + const fpmChecksumMap = { + "fpm-1.17.0-ruby-3.4.3-darwin-arm64.7z": "0n3BG/Xz1T5YIsoNNTG1bBege9E8A7rym5e3mfzHSHbiSiTS44v6GIHW4amDQk1Y5dtKtWXVq7FwjdmAf3kmMg==", + "fpm-1.17.0-ruby-3.4.3-darwin-x86_64.7z": "wPX3UheBznIlAXduM22W/d27i+DZVIB/MYnY5eh/qLeEEASZqHJWgN+pIckz3jT0dP37g1SQCikXXfsgxtMSPA==", + "fpm-1.17.0-ruby-3.4.3-linux-amd64.7z": "7miGWr6dfJSzXDD9ALqkwxvGACp7s7GR50NPcU0YwzbJL825H1SLwGJSGME+v57BxDI2xac47gFEkRZf5u9EtA==", + "fpm-1.17.0-ruby-3.4.3-linux-arm64v8.7z": "moRNjg6Q2iSXpkrm5sGNL2F6KilGNPagbefxhtr3VEqvAUSg2k2pMLr5xXUo0L4rZ4V+uETbwmbDCpeO3pmLyQ==", + "fpm-1.17.0-ruby-3.4.3-linux-i386.7z": "UPzsXhkW2T7+oHSKgFsZsFUxxmPC9lNZHsQbT+OeoTbIGsb6+qf3m7c6uP0XvRFnJiu3MM3lE1xAWQOctvajWA==", + } + + if (process.env.CUSTOM_FPM_PATH != null) { + return path.resolve(process.env.CUSTOM_FPM_PATH) + } + const exec = "fpm" + if (process.platform === "win32" || process.env.USE_SYSTEM_FPM === "true") { + return exec + } + const getKey = () => { + if (process.platform === "linux") { + if (process.arch == "x64") { + return "fpm-1.17.0-ruby-3.4.3-linux-amd64.7z" + } else if (process.arch === "arm64") { + return "fpm-1.17.0-ruby-3.4.3-linux-arm64v8.7z" + } + return "fpm-1.17.0-ruby-3.4.3-linux-i386.7z" + } + // darwin arm64 + if (process.arch === "arm64") { + return "fpm-1.17.0-ruby-3.4.3-darwin-arm64.7z" + } + return "fpm-1.17.0-ruby-3.4.3-darwin-x86_64.7z" + } + + const filename = getKey() + const fpmPath = await getBinFromUrl("fpm@2.1.4", filename, fpmChecksumMap[filename]) + return path.join(fpmPath, exec) +} diff --git a/packages/app-builder-lib/src/toolsets/linux.ts b/packages/app-builder-lib/src/toolsets/linux.ts index c8250fac2d6..3055b1e501a 100644 --- a/packages/app-builder-lib/src/toolsets/linux.ts +++ b/packages/app-builder-lib/src/toolsets/linux.ts @@ -1,7 +1,7 @@ import { Arch } from "builder-util" import * as path from "path" -import { downloadArtifact, getBinFromUrl } from "../binDownload" -import { ToolsetConfig } from "../configuration" +import { downloadArtifact, getBinFromUrl } from "../binDownload.js" +import { ToolsetConfig } from "../configuration.js" // It's just easier to copy the map of checksums here rather than adding them to within each if-statement. Also, easy copy-paste from the releases page const fpmChecksums = { diff --git a/packages/app-builder-lib/src/toolsets/windows.ts b/packages/app-builder-lib/src/toolsets/windows.ts index f9aa2f0d04b..327ad5f12c9 100644 --- a/packages/app-builder-lib/src/toolsets/windows.ts +++ b/packages/app-builder-lib/src/toolsets/windows.ts @@ -2,10 +2,10 @@ import { Arch, isEmptyOrSpaces, log } from "builder-util" import { Nullish } from "builder-util-runtime" import * as os from "os" import * as path from "path" -import { getBin, getBinFromUrl } from "../binDownload" -import { ToolsetConfig } from "../configuration" -import { ToolInfo, computeToolEnv } from "../util/bundledTool" -import { isUseSystemSigncode } from "../util/flags" +import { getBin, getBinFromUrl } from "../binDownload.js" +import { ToolsetConfig } from "../configuration.js" +import { ToolInfo, computeToolEnv } from "../util/bundledTool.js" +import { isUseSystemSigncode } from "../util/flags.js" export const wincodesignChecksums = { "0.0.0": { diff --git a/packages/app-builder-lib/src/util/AppFileWalker.ts b/packages/app-builder-lib/src/util/AppFileWalker.ts index c0f5a4c7b2e..fb2ec796228 100644 --- a/packages/app-builder-lib/src/util/AppFileWalker.ts +++ b/packages/app-builder-lib/src/util/AppFileWalker.ts @@ -1,8 +1,8 @@ import { FileConsumer, Filter, FilterStats } from "builder-util" -import { readlink, stat, Stats } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { FileMatcher } from "../fileMatcher" -import { Packager } from "../packager" +import { FileMatcher } from "../fileMatcher.js" +import { Packager } from "../packager.js" function addAllPatternIfNeed(matcher: FileMatcher) { if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) { @@ -12,7 +12,7 @@ function addAllPatternIfNeed(matcher: FileMatcher) { } export abstract class FileCopyHelper { - readonly metadata = new Map() + readonly metadata = new Map() protected constructor( protected readonly matcher: FileMatcher, @@ -20,23 +20,23 @@ export abstract class FileCopyHelper { protected readonly packager: Packager ) {} - protected handleFile(file: string, parent: string, fileStat: Stats): Promise | null { + protected handleFile(file: string, parent: string, fileStat: fsExtra.Stats): Promise | null { if (!fileStat.isSymbolicLink()) { return null } - return readlink(file).then((linkTarget): any => { + return fsExtra.readlink(file).then((linkTarget): any => { // http://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh return this.handleSymlink(fileStat, file, parent, linkTarget) }) } - private handleSymlink(fileStat: Stats, file: string, parent: string, linkTarget: string): Promise | null { + private handleSymlink(fileStat: fsExtra.Stats, file: string, parent: string, linkTarget: string): Promise | null { const resolvedLinkTarget = path.resolve(parent, linkTarget) const link = path.relative(this.matcher.from, resolvedLinkTarget) if (link.startsWith("..")) { // outside of project, linked module (https://github.com/electron-userland/electron-builder/issues/675) - return stat(resolvedLinkTarget).then(targetFileStat => { + return fsExtra.stat(resolvedLinkTarget).then(targetFileStat => { this.metadata.set(file, targetFileStat) return targetFileStat }) @@ -66,7 +66,7 @@ export class AppFileWalker extends FileCopyHelper implements FileConsumer { // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-unused-vars - consume(file: string, fileStat: Stats, parent: string, siblingNames: Array): any { + consume(file: string, fileStat: fsExtra.Stats, parent: string, siblingNames: Array): any { if (fileStat.isDirectory()) { const matchesFilter = this.matcherFilter(file, fileStat) return !matchesFilter diff --git a/packages/app-builder-lib/src/util/NodeModuleCopyHelper.ts b/packages/app-builder-lib/src/util/NodeModuleCopyHelper.ts index 2d1b8333a5b..7be83e57865 100644 --- a/packages/app-builder-lib/src/util/NodeModuleCopyHelper.ts +++ b/packages/app-builder-lib/src/util/NodeModuleCopyHelper.ts @@ -1,13 +1,13 @@ import { FilterStats, MAX_FILE_REQUESTS } from "builder-util" import { realpathSync } from "fs" -import { lstat, lstatSync, readdir } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" import asyncPool from "tiny-async-pool" -import { excludedNames, FileMatcher } from "../fileMatcher" -import { Packager } from "../packager" -import { FileCopyHelper } from "./AppFileWalker" -import { NodeModuleInfo } from "./packageDependencies" -import { resolveFunction } from "./resolve" +import { excludedNames, FileMatcher } from "../fileMatcher.js" +import { Packager } from "../packager.js" +import { FileCopyHelper } from "./AppFileWalker.js" +import { NodeModuleInfo } from "./packageDependencies.js" +import { resolveFunction } from "./resolve.js" const excludedFiles = new Set( [ @@ -69,7 +69,7 @@ export class NodeModuleCopyHelper extends FileCopyHelper { while (queue.length > 0) { const dirPath = queue.pop()! - const childNames = await readdir(dirPath) + const childNames = await fsExtra.readdir(dirPath) childNames.sort() const isTopLevel = dirPath === depPath @@ -85,7 +85,7 @@ export class NodeModuleCopyHelper extends FileCopyHelper { } // check if filematcher matches the files array as more important than the default excluded files. - const fileMatched = filter != null && filter(dirPath, lstatSync(dirPath)) + const fileMatched = filter != null && filter(dirPath, fsExtra.lstatSync(dirPath)) if (!fileMatched || !forceIncluded || !!this.packager.config.disableDefaultIgnoredFiles) { for (const ext of nodeModuleExcludedExts) { if (name.endsWith(ext)) { @@ -111,7 +111,7 @@ export class NodeModuleCopyHelper extends FileCopyHelper { } } - return lstat(filePath).then((stat: FilterStats) => { + return fsExtra.lstat(filePath).then((stat: FilterStats) => { stat.moduleName = moduleName stat.moduleRootPath = destination stat.moduleFullFilePath = path.join(destination, path.relative(depPath, filePath)) diff --git a/packages/app-builder-lib/src/util/appFileCopier.ts b/packages/app-builder-lib/src/util/appFileCopier.ts index 60806a6f7de..48d38f7d5be 100644 --- a/packages/app-builder-lib/src/util/appFileCopier.ts +++ b/packages/app-builder-lib/src/util/appFileCopier.ts @@ -1,20 +1,20 @@ import { AsyncTaskManager, FileCopier, FileTransformer, isEmptyOrSpaces, Link, log, MAX_FILE_REQUESTS, statOrNull, walk } from "builder-util" import { Stats } from "fs" -import { ensureSymlink } from "fs-extra" +import fsExtra from "fs-extra" import { mkdir, readlink } from "fs/promises" import * as path from "path" import asyncPool from "tiny-async-pool" -import { isLibOrExe } from "../asar/unpackDetector" -import { Platform } from "../core" -import { excludedExts, FileMatcher } from "../fileMatcher" -import { createElectronCompilerHost, NODE_MODULES_PATTERN } from "../fileTransformer" -import { getCollectorByPackageManager, PM } from "../node-module-collector" -import { LogMessageByKey, logMessageLevelByKey, ModuleManager } from "../node-module-collector/moduleManager" -import { Packager } from "../packager" -import { PlatformPackager } from "../platformPackager" -import { AppFileWalker } from "./AppFileWalker" -import { NodeModuleCopyHelper } from "./NodeModuleCopyHelper" -import { NodeModuleInfo } from "./packageDependencies" +import { isLibOrExe } from "../asar/unpackDetector.js" +import { Platform } from "../core.js" +import { excludedExts, FileMatcher } from "../fileMatcher.js" +import { createElectronCompilerHost, NODE_MODULES_PATTERN } from "../fileTransformer.js" +import { getCollectorByPackageManager, PM } from "../node-module-collector/index.js" +import { LogMessageByKey, logMessageLevelByKey, ModuleManager } from "../node-module-collector/moduleManager.js" +import { Packager } from "../packager.js" +import { PlatformPackager } from "../platformPackager.js" +import { AppFileWalker } from "./AppFileWalker.js" +import { NodeModuleCopyHelper } from "./NodeModuleCopyHelper.js" +import { NodeModuleInfo } from "./packageDependencies.js" const BOWER_COMPONENTS_PATTERN = `${path.sep}bower_components${path.sep}` /** @internal */ @@ -74,7 +74,7 @@ export async function copyAppFiles(fileSet: ResolvedFileSet, packager: Packager, await taskManager.awaitTasks() } - await asyncPool(MAX_FILE_REQUESTS, links, it => ensureSymlink(it.link, it.file)) + await asyncPool(MAX_FILE_REQUESTS, links, it => fsExtra.ensureSymlink(it.link, it.file)) } // os path separator is used @@ -295,7 +295,7 @@ async function compileUsingElectronCompile(mainFileSet: ResolvedFileSet, package mainFileSet.files.length - 1, ` 'use strict'; -require('electron-compile').init(__dirname, require('path').resolve(__dirname, '${packager.metadata.main || "index"}'), true); +require('electron-compile').init(import.meta.dirname, require('path').resolve(import.meta.dirname, '${packager.metadata.main || "index"}'), true); ` ) return { src: electronCompileCache, files: cacheFiles, metadata, destination: mainFileSet.destination } diff --git a/packages/app-builder-lib/src/util/cacheManager.ts b/packages/app-builder-lib/src/util/cacheManager.ts index 7d7b0c894b8..5ea787aac90 100644 --- a/packages/app-builder-lib/src/util/cacheManager.ts +++ b/packages/app-builder-lib/src/util/cacheManager.ts @@ -1,6 +1,6 @@ import { Arch, copyFile, log, orNullIfFileNotExist } from "builder-util" import { Hash } from "crypto" -import { readJson, writeJson } from "fs-extra" +import fsExtra from "fs-extra" import { mkdir, readFile } from "fs/promises" import * as path from "path" @@ -32,7 +32,7 @@ export class BuildCacheManager { async copyIfValid(digest: string): Promise { this.newDigest = digest - this.cacheInfo = await orNullIfFileNotExist(readJson(this.cacheInfoFile)) + this.cacheInfo = await orNullIfFileNotExist(fsExtra.readJson(this.cacheInfoFile)) const oldDigest = this.cacheInfo == null ? null : this.cacheInfo.executableDigest if (oldDigest !== digest) { log.debug({ oldDigest, newDigest: digest }, "no valid cached executable found") @@ -66,7 +66,7 @@ export class BuildCacheManager { try { await mkdir(this.cacheDir, { recursive: true }) - await Promise.all([writeJson(this.cacheInfoFile, this.cacheInfo), copyFile(this.executableFile, this.cacheFile, false)]) + await Promise.all([fsExtra.writeJson(this.cacheInfoFile, this.cacheInfo), copyFile(this.executableFile, this.cacheFile, false)]) } catch (e: any) { log.warn({ error: e.stack || e }, `cannot save build cache`) } diff --git a/packages/app-builder-lib/src/util/config/config.ts b/packages/app-builder-lib/src/util/config/config.ts index 4bcefb9b9c3..aab3a0a7a3a 100644 --- a/packages/app-builder-lib/src/util/config/config.ts +++ b/packages/app-builder-lib/src/util/config/config.ts @@ -1,14 +1,14 @@ import { DebugLogger, deepAssign, InvalidConfigurationError, log, safeStringifyJson, statOrNull } from "builder-util" import { Nullish } from "builder-util-runtime" -import { readJson } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" -import { Configuration } from "../../configuration" -import { FileSet } from "../../options/PlatformSpecificBuildOptions" -import { reactCra } from "../../presets/rectCra" -import { PACKAGE_VERSION } from "../../version" -import { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from "./load" -const validateSchema = require("@develar/schema-utils") +import { Configuration } from "../../configuration.js" +import { FileSet } from "../../options/PlatformSpecificBuildOptions.js" +import { reactCra } from "../../presets/rectCra.js" +import { PACKAGE_VERSION } from "../../version.js" +import { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from "./load.js" +import validateSchema from "@develar/schema-utils" // https://github.com/electron-userland/electron-builder/issues/1847 function mergePublish(config: Configuration, configFromOptions: Configuration) { @@ -37,7 +37,7 @@ export async function getConfig( projectDir: string, configPath: string | null, configFromOptions: Configuration | Nullish, - packageMetadata: Lazy | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, "package.json")))) + packageMetadata: Lazy | null> = new Lazy(() => orNullIfFileNotExist(fsExtra.readJson(path.join(projectDir, "package.json")))) ): Promise { const configRequest: ReadConfigRequest = { packageKey: "build", configFilename: "electron-builder", projectDir, packageMetadata } const configAndEffectiveFile = await _getConfig(configRequest, configPath) @@ -57,7 +57,7 @@ export async function getConfig( if ((dependencies != null && "react-scripts" in dependencies) || (devDependencies != null && "react-scripts" in devDependencies)) { config.extends = "react-cra" } else if (devDependencies != null && "electron-webpack" in devDependencies) { - let file = "electron-webpack/out/electron-builder.js" + let file = "electron-webpack/src/electron-builder.js" try { file = require.resolve(file) } catch (_ignore) { @@ -214,7 +214,7 @@ function getDefaultConfig(): Configuration { } } -const schemeDataPromise = new Lazy(() => readJson(path.join(__dirname, "..", "..", "..", "scheme.json"))) +const schemeDataPromise = new Lazy(() => fsExtra.readJson(path.join(import.meta.dirname, "..", "..", "..", "scheme.json"))) export async function validateConfiguration(config: Configuration, debugLogger: DebugLogger) { const extraMetadata = config.extraMetadata diff --git a/packages/app-builder-lib/src/util/config/load.ts b/packages/app-builder-lib/src/util/config/load.ts index 2c398084dd4..ecbfa7ed1d6 100644 --- a/packages/app-builder-lib/src/util/config/load.ts +++ b/packages/app-builder-lib/src/util/config/load.ts @@ -1,4 +1,7 @@ +import { createRequire } from "node:module" import { log } from "builder-util" + +const require = createRequire(import.meta.url) import { parse as parseEnv } from "dotenv" import { DotenvParseInput, expand } from "dotenv-expand" import { promises as fs } from "fs" @@ -6,9 +9,9 @@ import { createJiti } from "jiti" import { load } from "js-yaml" import { Lazy } from "lazy-val" import * as path from "path" -import { resolveModule } from "../resolve" +import { resolveModule } from "../resolve.js" -const jiti = createJiti(__filename) +const jiti = createJiti(import.meta.filename) export interface ReadConfigResult { readonly result: T diff --git a/packages/app-builder-lib/src/util/license.ts b/packages/app-builder-lib/src/util/license.ts index 7b9f06eeee6..da20e4dd392 100644 --- a/packages/app-builder-lib/src/util/license.ts +++ b/packages/app-builder-lib/src/util/license.ts @@ -1,7 +1,7 @@ import { Nullish } from "builder-util-runtime" import * as path from "path" -import { PlatformPackager } from "../platformPackager" -import { langIdToName, toLangWithRegion } from "./langs" +import { PlatformPackager } from "../platformPackager.js" +import { langIdToName, toLangWithRegion } from "./langs.js" export function getLicenseAssets(fileNames: Array, packager: PlatformPackager) { return fileNames diff --git a/packages/app-builder-lib/src/util/macosVersion.ts b/packages/app-builder-lib/src/util/macosVersion.ts index 62156f9e70d..c10ba42f597 100644 --- a/packages/app-builder-lib/src/util/macosVersion.ts +++ b/packages/app-builder-lib/src/util/macosVersion.ts @@ -1,11 +1,11 @@ import { log } from "builder-util" -import { readFile } from "fs-extra" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import { release as osRelease } from "os" import * as semver from "semver" const macOsVersion = new Lazy(async () => { - const file = await readFile("/System/Library/CoreServices/SystemVersion.plist", "utf8") + const file = await fsExtra.readFile("/System/Library/CoreServices/SystemVersion.plist", "utf8") const matches = /ProductVersion<\/key>[\s\S]*([\d.]+)<\/string>/.exec(file) if (!matches) { throw new Error("Couldn't find the macOS version") diff --git a/packages/app-builder-lib/src/util/macroExpander.ts b/packages/app-builder-lib/src/util/macroExpander.ts index 33e9109e92c..8ae9a4baccf 100644 --- a/packages/app-builder-lib/src/util/macroExpander.ts +++ b/packages/app-builder-lib/src/util/macroExpander.ts @@ -1,6 +1,6 @@ import { InvalidConfigurationError } from "builder-util" import { Nullish } from "builder-util-runtime" -import { AppInfo } from "../appInfo" +import { AppInfo } from "../appInfo.js" export function expandMacro(pattern: string, arch: string | Nullish, appInfo: AppInfo, extra: any = {}, isProductNameSanitized = true): string { if (arch == null) { diff --git a/packages/app-builder-lib/src/util/normalizePackageData.ts b/packages/app-builder-lib/src/util/normalizePackageData.ts index 43e56ab711f..d58b81a16ff 100644 --- a/packages/app-builder-lib/src/util/normalizePackageData.ts +++ b/packages/app-builder-lib/src/util/normalizePackageData.ts @@ -1,6 +1,6 @@ import { fromUrl } from "hosted-git-info" import * as semver from "semver" -import { parseUrl } from "./pathManager" +import { parseUrl } from "./pathManager.js" export function normalizePackageData(data: any) { for (const it of check) { diff --git a/packages/app-builder-lib/src/util/packageDependencies.ts b/packages/app-builder-lib/src/util/packageDependencies.ts index 36262e396aa..009d1771780 100644 --- a/packages/app-builder-lib/src/util/packageDependencies.ts +++ b/packages/app-builder-lib/src/util/packageDependencies.ts @@ -1,5 +1,5 @@ import { Lazy } from "lazy-val" -import { executeAppBuilderAsJson } from "./appBuilder" +import { executeAppBuilderAsJson } from "./appBuilder.js" export function createLazyProductionDeps(projectDir: string, excludedDependencies: Array | null, flatten: T) { return new Lazy(async () => { diff --git a/packages/app-builder-lib/src/util/packageMetadata.ts b/packages/app-builder-lib/src/util/packageMetadata.ts index 378d2aba36b..c57213817e7 100644 --- a/packages/app-builder-lib/src/util/packageMetadata.ts +++ b/packages/app-builder-lib/src/util/packageMetadata.ts @@ -1,14 +1,14 @@ import { InvalidConfigurationError, isEmptyOrSpaces, log } from "builder-util" import { Nullish } from "builder-util-runtime" -import { readFile, readJson, readJsonSync } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" import * as semver from "semver" -import { Metadata } from "../options/metadata" -import { normalizePackageData } from "./normalizePackageData" +import { Metadata } from "../options/metadata.js" +import { normalizePackageData } from "./normalizePackageData.js" /** @internal */ export async function readPackageJson(file: string): Promise { - const data = await readJson(file) + const data = await fsExtra.readJson(file) await authors(file, data) // remove not required fields because can be used for remote build delete data.scripts @@ -24,7 +24,7 @@ async function authors(file: string, data: any) { let authorData try { - authorData = await readFile(path.resolve(path.dirname(file), "AUTHORS"), "utf8") + authorData = await fsExtra.readFile(path.resolve(path.dirname(file), "AUTHORS"), "utf8") } catch (_ignored) { return } @@ -114,8 +114,8 @@ function checkDependencies(dependencies: Record | Nullish, error for (const prefix of prefixes) { if (updaterVersion.startsWith(prefix)) { const normalized = path.normalize(updaterVersion.substring(prefix.length)) - const packageJsonPath = path.isAbsolute(normalized) ? normalized : path.resolve(__dirname, normalized) - const json = readJsonSync(path.join(packageJsonPath, "package.json")) + const packageJsonPath = path.isAbsolute(normalized) ? normalized : path.resolve(import.meta.dirname, normalized) + const json = fsExtra.readJsonSync(path.join(packageJsonPath, "package.json")) updaterVersion = json.version break } diff --git a/packages/app-builder-lib/src/util/pathManager.ts b/packages/app-builder-lib/src/util/pathManager.ts index a80c0cdeee8..8f7ca31f0d0 100644 --- a/packages/app-builder-lib/src/util/pathManager.ts +++ b/packages/app-builder-lib/src/util/pathManager.ts @@ -1,6 +1,6 @@ import * as path from "path" -const root = path.join(__dirname, "..", "..") +const root = path.join(import.meta.dirname, "..", "..") export function getTemplatePath(file: string) { return path.join(root, "templates", file) diff --git a/packages/app-builder-lib/src/util/plist.ts b/packages/app-builder-lib/src/util/plist.ts index 2f2e31aecbf..ae4dd82ba1c 100644 --- a/packages/app-builder-lib/src/util/plist.ts +++ b/packages/app-builder-lib/src/util/plist.ts @@ -1,4 +1,4 @@ -import { build, parse } from "plist" +import * as plist_1 from "plist" import * as fs from "fs/promises" type PlistValue = string | number | boolean | Date | PlistObject | PlistValue[] @@ -27,13 +27,13 @@ function sortObjectKeys(obj: PlistValue): PlistValue { export async function savePlistFile(path: string, data: PlistValue): Promise { const sortedData = sortObjectKeys(data) - const plist = build(sortedData) + const plist = plist_1.build(sortedData) await fs.writeFile(path, plist) } export async function parsePlistFile(file: string): Promise { const data = await fs.readFile(file, "utf8") - return parse(data) as T + return plist_1.parse(data) as T } export type { PlistValue, PlistObject } diff --git a/packages/app-builder-lib/src/util/rebuild.ts b/packages/app-builder-lib/src/util/rebuild.ts index 481de04fde8..28a47563a70 100644 --- a/packages/app-builder-lib/src/util/rebuild.ts +++ b/packages/app-builder-lib/src/util/rebuild.ts @@ -7,7 +7,7 @@ export const rebuild = async (options: RebuildOptions): Promise => { const { arch } = options log.info({ arch }, `installing native dependencies`) - const child = cp.fork(path.resolve(__dirname, "../../helpers/remote-rebuild.js"), [JSON.stringify(options)], { + const child = cp.fork(path.resolve(import.meta.dirname, "../../helpers/remote-rebuild.js"), [JSON.stringify(options)], { stdio: ["pipe", "pipe", "pipe", "ipc"], }) diff --git a/packages/app-builder-lib/src/util/repositoryInfo.ts b/packages/app-builder-lib/src/util/repositoryInfo.ts index 2a24592f259..61f1365d77f 100644 --- a/packages/app-builder-lib/src/util/repositoryInfo.ts +++ b/packages/app-builder-lib/src/util/repositoryInfo.ts @@ -1,16 +1,16 @@ import { orNullIfFileNotExist } from "builder-util" -import { readFile } from "fs-extra" +import fsExtra from "fs-extra" import GitHost, { fromUrl } from "hosted-git-info" import * as path from "path" -import { SourceRepositoryInfo } from "../core" -import { Metadata, RepositoryInfo } from "../options/metadata" +import { SourceRepositoryInfo } from "../core.js" +import { Metadata, RepositoryInfo } from "../options/metadata.js" export function getRepositoryInfo(projectDir: string, metadata?: Metadata, devMetadata?: Metadata | null): Promise { return _getInfo(projectDir, (devMetadata == null ? null : devMetadata.repository) || (metadata == null ? null : metadata.repository)) } async function getGitUrlFromGitConfig(projectDir: string): Promise { - const data = await orNullIfFileNotExist(readFile(path.join(projectDir, ".git", "config"), "utf8")) + const data = await orNullIfFileNotExist(fsExtra.readFile(path.join(projectDir, ".git", "config"), "utf8")) if (data == null) { return null } diff --git a/packages/app-builder-lib/src/util/resolve.ts b/packages/app-builder-lib/src/util/resolve.ts index 6fabf84197f..39c35c6d9f7 100644 --- a/packages/app-builder-lib/src/util/resolve.ts +++ b/packages/app-builder-lib/src/util/resolve.ts @@ -1,7 +1,10 @@ -import { log } from "builder-util/out/log" +import { createRequire } from "node:module" +import { log } from "builder-util" import debug from "debug" import * as path from "path" -import * as requireMaybe from "../../helpers/dynamic-import" +import * as requireMaybe from "../../helpers/dynamic-import.js" + +const require = createRequire(import.meta.url) export async function resolveModule(type: string | undefined, name: string): Promise { try { diff --git a/packages/app-builder-lib/src/util/yarn.ts b/packages/app-builder-lib/src/util/yarn.ts index 21ef18c147a..c0cfc181c99 100644 --- a/packages/app-builder-lib/src/util/yarn.ts +++ b/packages/app-builder-lib/src/util/yarn.ts @@ -3,12 +3,12 @@ import { pathExists } from "fs-extra" import { Lazy } from "lazy-val" import { homedir } from "os" import * as path from "path" -import { Configuration } from "../configuration" -import { executeAppBuilderAndWriteJson } from "./appBuilder" -import { PM, getPackageManagerCommand } from "../node-module-collector" -import { detectPackageManager } from "../node-module-collector/packageManager" -import { NodeModuleDirInfo } from "./packageDependencies" -import { rebuild as remoteRebuild } from "./rebuild" +import { Configuration } from "../configuration.js" +import { executeAppBuilderAndWriteJson } from "./appBuilder.js" +import { PM, getPackageManagerCommand } from "../node-module-collector/index.js" +import { detectPackageManager } from "../node-module-collector/packageManager.js" +import { NodeModuleDirInfo } from "./packageDependencies.js" +import { rebuild as remoteRebuild } from "./rebuild.js" import * as which from "which" import { RebuildOptions as ElectronRebuildOptions } from "@electron/rebuild" import { Nullish } from "builder-util-runtime" diff --git a/packages/app-builder-lib/src/vm/MonoVm.ts b/packages/app-builder-lib/src/vm/MonoVm.ts index fc97d8361fb..ad354bfb3a9 100644 --- a/packages/app-builder-lib/src/vm/MonoVm.ts +++ b/packages/app-builder-lib/src/vm/MonoVm.ts @@ -1,6 +1,6 @@ import { exec, ExtraSpawnOptions, spawn } from "builder-util" import { ExecFileOptions, SpawnOptions } from "child_process" -import { VmManager } from "./vm" +import { VmManager } from "./vm.js" export class MonoVmManager extends VmManager { constructor() { diff --git a/packages/app-builder-lib/src/vm/ParallelsVm.ts b/packages/app-builder-lib/src/vm/ParallelsVm.ts index 58c25190221..2e33498adfc 100644 --- a/packages/app-builder-lib/src/vm/ParallelsVm.ts +++ b/packages/app-builder-lib/src/vm/ParallelsVm.ts @@ -1,6 +1,9 @@ +import { createRequire } from "node:module" import { DebugLogger, ExtraSpawnOptions, exec, log, spawn } from "builder-util" + +const require = createRequire(import.meta.url) import { ExecFileOptions, SpawnOptions, execFileSync } from "child_process" -import { VmManager } from "./vm" +import { VmManager } from "./vm.js" /** @internal */ export async function parseVmList(debugLogger: DebugLogger) { diff --git a/packages/app-builder-lib/src/vm/PwshVm.ts b/packages/app-builder-lib/src/vm/PwshVm.ts index 17a73e774ed..2f8df53f949 100644 --- a/packages/app-builder-lib/src/vm/PwshVm.ts +++ b/packages/app-builder-lib/src/vm/PwshVm.ts @@ -1,6 +1,6 @@ import { log } from "builder-util" import { Lazy } from "lazy-val" -import { isPwshAvailable, VmManager } from "./vm" +import { isPwshAvailable, VmManager } from "./vm.js" export class PwshVmManager extends VmManager { constructor() { diff --git a/packages/app-builder-lib/src/vm/WineVm.ts b/packages/app-builder-lib/src/vm/WineVm.ts index 2158ba865bd..f0a6a974948 100644 --- a/packages/app-builder-lib/src/vm/WineVm.ts +++ b/packages/app-builder-lib/src/vm/WineVm.ts @@ -1,8 +1,8 @@ import { ExtraSpawnOptions } from "builder-util" import { ExecFileOptions, SpawnOptions } from "child_process" import * as path from "path" -import { execWine } from "../wine" -import { VmManager } from "./vm" +import { execWine } from "../wine.js" +import { VmManager } from "./vm.js" export class WineVmManager extends VmManager { constructor() { diff --git a/packages/app-builder-lib/src/vm/vm.ts b/packages/app-builder-lib/src/vm/vm.ts index fd59430fa4a..0a8c3bc3e28 100644 --- a/packages/app-builder-lib/src/vm/vm.ts +++ b/packages/app-builder-lib/src/vm/vm.ts @@ -2,7 +2,7 @@ import { DebugLogger, exec, ExtraSpawnOptions, InvalidConfigurationError, log, s import { ExecFileOptions, SpawnOptions } from "child_process" import { Lazy } from "lazy-val" import * as path from "path" -import { ParallelsVm } from "./ParallelsVm" +import { ParallelsVm } from "./ParallelsVm.js" export class VmManager { get pathSep(): string { return path.sep @@ -34,13 +34,13 @@ export class VmManager { } export async function getWindowsVm(debugLogger: DebugLogger): Promise { - const parallelsVmModule = await import("./ParallelsVm") + const parallelsVmModule = await import("./ParallelsVm.js") let vmList: ParallelsVm[] = [] try { vmList = (await parallelsVmModule.parseVmList(debugLogger)).filter(it => ["win-10", "win-11"].includes(it.os)) } catch (_error) { if ((await isPwshAvailable.value) && (await isWineAvailable.value)) { - const vmModule = await import("./PwshVm") + const vmModule = await import("./PwshVm.js") return new vmModule.PwshVmManager() } } diff --git a/packages/app-builder-lib/src/winPackager.ts b/packages/app-builder-lib/src/winPackager.ts index 61fe2a410b3..8cf581e4048 100644 --- a/packages/app-builder-lib/src/winPackager.ts +++ b/packages/app-builder-lib/src/winPackager.ts @@ -1,33 +1,36 @@ +import { createRequire } from "node:module" import { Arch, CopyFileTransformer, executeAppBuilder, exists, FileTransformer, InvalidConfigurationError, log, use, walk } from "builder-util" + +const require = createRequire(import.meta.url) import { Nullish } from "builder-util-runtime" import { isCI } from "ci-info" import { createHash } from "crypto" import { readdir } from "fs/promises" import { Lazy } from "lazy-val" import * as path from "path" -import { readAsarHeader } from "./asar/asar" -import { SignManager } from "./codeSign/signManager" -import { signWindows, WindowsSignOptions } from "./codeSign/windowsCodeSign" -import { WindowsSignAzureManager } from "./codeSign/windowsSignAzureManager" -import { FileCodeSigningInfo, WindowsSignToolManager } from "./codeSign/windowsSignToolManager" -import { AfterPackContext } from "./configuration" -import { DIR_TARGET, Platform, Target } from "./core" -import { RequestedExecutionLevel, WindowsConfiguration } from "./options/winOptions" -import { Packager } from "./packager" -import { chooseNotNull, PlatformPackager } from "./platformPackager" -import AppXTarget from "./targets/AppxTarget" -import MsiTarget from "./targets/MsiTarget" -import MsiWrappedTarget from "./targets/MsiWrappedTarget" -import { NsisTarget } from "./targets/nsis/NsisTarget" -import { AppPackageHelper, CopyElevateHelper } from "./targets/nsis/nsisUtil" -import { WebInstallerTarget } from "./targets/nsis/WebInstallerTarget" -import { createCommonTarget } from "./targets/targetFactory" -import { getRceditBundle } from "./toolsets/windows" -import { BuildCacheManager, digest } from "./util/cacheManager" -import { isBuildCacheEnabled } from "./util/flags" -import { time } from "./util/timer" -import { getWindowsVm, VmManager } from "./vm/vm" -import { execWine } from "./wine" +import { readAsarHeader } from "./asar/asar.js" +import { SignManager } from "./codeSign/signManager.js" +import { signWindows, WindowsSignOptions } from "./codeSign/windowsCodeSign.js" +import { WindowsSignAzureManager } from "./codeSign/windowsSignAzureManager.js" +import { FileCodeSigningInfo, WindowsSignToolManager } from "./codeSign/windowsSignToolManager.js" +import { AfterPackContext } from "./configuration.js" +import { DIR_TARGET, Platform, Target } from "./core.js" +import { RequestedExecutionLevel, WindowsConfiguration } from "./options/winOptions.js" +import { Packager } from "./packager.js" +import { chooseNotNull, PlatformPackager } from "./platformPackager.js" +import AppXTarget from "./targets/AppxTarget.js" +import MsiTarget from "./targets/MsiTarget.js" +import MsiWrappedTarget from "./targets/MsiWrappedTarget.js" +import { NsisTarget } from "./targets/nsis/NsisTarget.js" +import { AppPackageHelper, CopyElevateHelper } from "./targets/nsis/nsisUtil.js" +import { WebInstallerTarget } from "./targets/nsis/WebInstallerTarget.js" +import { createCommonTarget } from "./targets/targetFactory.js" +import { getRceditBundle } from "./toolsets/windows.js" +import { BuildCacheManager, digest } from "./util/cacheManager.js" +import { isBuildCacheEnabled } from "./util/flags.js" +import { time } from "./util/timer.js" +import { getWindowsVm, VmManager } from "./vm/vm.js" +import { execWine } from "./wine.js" export class WinPackager extends PlatformPackager { _iconPath = new Lazy(() => this.getOrConvertIcon("ico")) @@ -96,13 +99,13 @@ export class WinPackager extends PlatformPackager { } case "appx": - return require("./targets/AppxTarget").default + return AppXTarget case "msi": - return require("./targets/MsiTarget").default + return MsiTarget case "msiwrapped": - return require("./targets/MsiWrappedTarget").default + return MsiWrappedTarget default: return null diff --git a/packages/app-builder-lib/tsconfig-scheme.json b/packages/app-builder-lib/tsconfig-scheme.json index 7c1ea20d7aa..e6f1af42b9f 100644 --- a/packages/app-builder-lib/tsconfig-scheme.json +++ b/packages/app-builder-lib/tsconfig-scheme.json @@ -8,6 +8,4 @@ "src/**/*.ts", "../../typings/*.d.ts" ], - "exclude": [ - ] } \ No newline at end of file diff --git a/packages/app-builder-lib/tsconfig.json b/packages/app-builder-lib/tsconfig.json index 9c8c13598e0..162e4b06d22 100644 --- a/packages/app-builder-lib/tsconfig.json +++ b/packages/app-builder-lib/tsconfig.json @@ -1,10 +1,5 @@ { "extends": "./tsconfig-scheme.json", - "jsdoc": { - "out": "../../scripts/jsdoc/out/builder-lib", - "examples": "../../scripts/jsdoc/examples", - "access": "public" - }, "compilerOptions": { "outDir": "out", "rootDir": "src", @@ -13,8 +8,6 @@ "src/**/*.ts", "../../typings/*.d.ts" ], - "exclude": [ - ], "references": [ { "path": "../builder-util" diff --git a/packages/builder-util-runtime/package.json b/packages/builder-util-runtime/package.json index 9dd0b7c5efa..92ba21cc2cf 100644 --- a/packages/builder-util-runtime/package.json +++ b/packages/builder-util-runtime/package.json @@ -1,7 +1,11 @@ { "name": "builder-util-runtime", - "version": "9.6.0", - "main": "out/index.js", + "version": "9.5.1", + "type": "module", + "exports": { + ".": "./out/index.js", + "./internal": "./out/indexInternal.js" + }, "author": "Vladimir Krivosheev", "license": "MIT", "repository": { @@ -15,7 +19,7 @@ "out" ], "engines": { - "node": ">=12.0.0" + "node": ">=22.12.0" }, "dependencies": { "debug": "^4.3.4", diff --git a/packages/builder-util-runtime/src/ProgressCallbackTransform.ts b/packages/builder-util-runtime/src/ProgressCallbackTransform.ts index 39fd25ea75a..1e9e8562232 100644 --- a/packages/builder-util-runtime/src/ProgressCallbackTransform.ts +++ b/packages/builder-util-runtime/src/ProgressCallbackTransform.ts @@ -1,5 +1,5 @@ import { Transform } from "stream" -import { CancellationToken } from "./CancellationToken" +import { CancellationToken } from "./CancellationToken.js" export interface ProgressInfo { total: number diff --git a/packages/builder-util-runtime/src/httpExecutor.ts b/packages/builder-util-runtime/src/httpExecutor.ts index 3502ac33351..0dfd2d290f4 100644 --- a/packages/builder-util-runtime/src/httpExecutor.ts +++ b/packages/builder-util-runtime/src/httpExecutor.ts @@ -5,10 +5,10 @@ import { IncomingMessage, OutgoingHttpHeader, OutgoingHttpHeaders, RequestOption import { Socket } from "net" import { Transform } from "stream" import { URL } from "url" -import { Nullish } from "." -import { CancellationToken } from "./CancellationToken" -import { newError } from "./error" -import { ProgressCallbackTransform, ProgressInfo } from "./ProgressCallbackTransform" +import { Nullish } from "./index.js" +import { CancellationToken } from "./CancellationToken.js" +import { newError } from "./error.js" +import { ProgressCallbackTransform, ProgressInfo } from "./ProgressCallbackTransform.js" const debug = _debug("electron-builder") diff --git a/packages/builder-util-runtime/src/index.ts b/packages/builder-util-runtime/src/index.ts index 4f1fd21686f..3ff2a6930f4 100644 --- a/packages/builder-util-runtime/src/index.ts +++ b/packages/builder-util-runtime/src/index.ts @@ -1,6 +1,6 @@ -export { BlockMap } from "./blockMapApi" -export { CancellationError, CancellationToken } from "./CancellationToken" -export { newError } from "./error" +export { BlockMap } from "./blockMapApi.js" +export { CancellationError, CancellationToken } from "./CancellationToken.js" +export { newError } from "./error.js" export { configureRequestOptions, configureRequestOptionsFromUrl, @@ -14,9 +14,9 @@ export { RequestHeaders, safeGetHeader, safeStringifyJson, -} from "./httpExecutor" -export { MemoLazy } from "./MemoLazy" -export { ProgressCallbackTransform, ProgressInfo } from "./ProgressCallbackTransform" +} from "./httpExecutor.js" +export { MemoLazy } from "./MemoLazy.js" +export { ProgressCallbackTransform, ProgressInfo } from "./ProgressCallbackTransform.js" export { AllPublishOptions, BaseS3Options, @@ -36,12 +36,12 @@ export { SpacesOptions, GitlabReleaseInfo, GitlabReleaseAsset, -} from "./publishOptions" -export { retry } from "./retry" -export { parseDn } from "./rfc2253Parser" -export { BlockMapDataHolder, PackageFileInfo, ReleaseNoteInfo, UpdateFileInfo, UpdateInfo, WindowsUpdateInfo } from "./updateInfo" -export { UUID } from "./uuid" -export { parseXml, XElement } from "./xml" +} from "./publishOptions.js" +export { retry } from "./retry.js" +export { parseDn } from "./rfc2253Parser.js" +export { BlockMapDataHolder, PackageFileInfo, ReleaseNoteInfo, UpdateFileInfo, UpdateInfo, WindowsUpdateInfo } from "./updateInfo.js" +export { UUID } from "./uuid.js" +export { parseXml, XElement } from "./xml.js" // nsis export const CURRENT_APP_INSTALLER_FILE_NAME = "installer.exe" diff --git a/packages/builder-util-runtime/src/indexInternal.ts b/packages/builder-util-runtime/src/indexInternal.ts new file mode 100644 index 00000000000..7a09717e60b --- /dev/null +++ b/packages/builder-util-runtime/src/indexInternal.ts @@ -0,0 +1 @@ +export { BlockMapFile } from "./blockMapApi.js" diff --git a/packages/builder-util-runtime/src/publishOptions.ts b/packages/builder-util-runtime/src/publishOptions.ts index c2a366fd158..02c86ba07ee 100644 --- a/packages/builder-util-runtime/src/publishOptions.ts +++ b/packages/builder-util-runtime/src/publishOptions.ts @@ -1,5 +1,5 @@ import { OutgoingHttpHeaders } from "http" -import { Nullish } from "." +import { Nullish } from "./index.js" export type PublishProvider = "github" | "gitlab" | "s3" | "spaces" | "generic" | "custom" | "snapStore" | "keygen" | "bitbucket" diff --git a/packages/builder-util-runtime/src/retry.ts b/packages/builder-util-runtime/src/retry.ts index d55dc5fa986..041262eaf9f 100644 --- a/packages/builder-util-runtime/src/retry.ts +++ b/packages/builder-util-runtime/src/retry.ts @@ -1,4 +1,4 @@ -import { CancellationToken } from "./CancellationToken" +import { CancellationToken } from "./CancellationToken.js" export async function retry( task: () => Promise, diff --git a/packages/builder-util-runtime/src/uuid.ts b/packages/builder-util-runtime/src/uuid.ts index 74d5f6f1ca2..224ce9fe6aa 100644 --- a/packages/builder-util-runtime/src/uuid.ts +++ b/packages/builder-util-runtime/src/uuid.ts @@ -1,5 +1,5 @@ import { createHash, randomBytes } from "crypto" -import { newError } from "./error" +import { newError } from "./error.js" const invalidName = "options.name must be either a string or a Buffer" diff --git a/packages/builder-util-runtime/src/xml.ts b/packages/builder-util-runtime/src/xml.ts index d172124e0f4..6985419c24e 100644 --- a/packages/builder-util-runtime/src/xml.ts +++ b/packages/builder-util-runtime/src/xml.ts @@ -1,5 +1,5 @@ import * as sax from "sax" -import { newError } from "./error" +import { newError } from "./error.js" export class XElement { value = "" diff --git a/packages/builder-util-runtime/tsconfig.json b/packages/builder-util-runtime/tsconfig.json index ccba996ab8d..71504d14a7b 100644 --- a/packages/builder-util-runtime/tsconfig.json +++ b/packages/builder-util-runtime/tsconfig.json @@ -5,11 +5,6 @@ "outDir": "out", "rootDir": "src" }, - "jsdoc": { - "out": "../../scripts/jsdoc/out/builder-util-runtime", - "examples": "../../scripts/jsdoc/examples", - "access": "public" - }, "include": [ "src/**/*.ts" ] diff --git a/packages/builder-util/package.json b/packages/builder-util/package.json index 20c4b1e8a1b..6c21fb40d5e 100644 --- a/packages/builder-util/package.json +++ b/packages/builder-util/package.json @@ -1,7 +1,11 @@ { "name": "builder-util", - "version": "26.9.0", - "main": "out/util.js", + "version": "26.8.1", + "type": "module", + "exports": { + ".": "./out/util.js", + "./internal": "./out/indexInternal.js" + }, "author": "Vladimir Krivosheev", "license": "MIT", "repository": { @@ -16,13 +20,12 @@ ], "dependencies": { "7zip-bin": "~5.2.0", - "@types/debug": "^4.1.6", "app-builder-bin": "5.0.0-alpha.12", "builder-util-runtime": "workspace:*", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", @@ -32,9 +35,10 @@ "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" }, - "typings": "./out/util.d.ts", + "types": "./out/util.d.ts", "devDependencies": { "@types/cross-spawn": "6.0.6", + "@types/debug": "^4.1.6", "@types/fs-extra": "^9.0.11", "@types/js-yaml": "4.0.3", "@types/source-map-support": "0.5.4", diff --git a/packages/builder-util/src/7za.ts b/packages/builder-util/src/7za.ts index c3323a49ac0..ef0582909bd 100644 --- a/packages/builder-util/src/7za.ts +++ b/packages/builder-util/src/7za.ts @@ -1,15 +1,15 @@ import { path7x, path7za } from "7zip-bin" import * as fs from "fs" -import { chmod } from "fs-extra" +import fsExtra from "fs-extra" export async function getPath7za(): Promise { if (fs.existsSync(path7za)) { - await chmod(path7za, 0o755) + await fsExtra.chmod(path7za, 0o755) } return path7za } export async function getPath7x(): Promise { - await chmod(path7x, 0o755) + await fsExtra.chmod(path7x, 0o755) return path7x } diff --git a/packages/builder-util/src/DebugLogger.ts b/packages/builder-util/src/DebugLogger.ts index 52517934f76..a37dfe5e1b9 100644 --- a/packages/builder-util/src/DebugLogger.ts +++ b/packages/builder-util/src/DebugLogger.ts @@ -1,6 +1,6 @@ -import { outputFile } from "fs-extra" -import { serializeToYaml } from "./util" -import { mapToObject } from "./mapper" +import fsExtra from "fs-extra" +import { serializeToYaml } from "./util.js" +import { mapToObject } from "./mapper.js" export class DebugLogger { readonly data = new Map() @@ -40,7 +40,7 @@ export class DebugLogger { const data = mapToObject(this.data) // toml and json doesn't correctly output multiline string as multiline if (this.isEnabled && Object.keys(data).length > 0) { - return outputFile(file, serializeToYaml(data)) + return fsExtra.outputFile(file, serializeToYaml(data)) } else { return Promise.resolve() } diff --git a/packages/builder-util/src/asyncTaskManager.ts b/packages/builder-util/src/asyncTaskManager.ts index f27ca28b8d7..b02467c3b45 100644 --- a/packages/builder-util/src/asyncTaskManager.ts +++ b/packages/builder-util/src/asyncTaskManager.ts @@ -1,6 +1,6 @@ import { CancellationToken } from "builder-util-runtime" -import { log } from "./log" -import { NestedError } from "./promise" +import { log } from "./log.js" +import { NestedError } from "./promise.js" export class AsyncTaskManager { readonly tasks: Array> = [] diff --git a/packages/builder-util/src/deepAssign.ts b/packages/builder-util/src/deepAssign.ts index 478b1842043..0e00591cee7 100644 --- a/packages/builder-util/src/deepAssign.ts +++ b/packages/builder-util/src/deepAssign.ts @@ -1,4 +1,4 @@ -import { isValidKey } from "./mapper" +import { isValidKey } from "./mapper.js" function isObject(x: any) { if (Array.isArray(x)) { diff --git a/packages/builder-util/src/filename.ts b/packages/builder-util/src/filename.ts index 623a0e1c34a..3144af6046c 100644 --- a/packages/builder-util/src/filename.ts +++ b/packages/builder-util/src/filename.ts @@ -1,6 +1,5 @@ import * as path from "path" -// @ts-ignore -import * as _sanitizeFileName from "sanitize-filename" +import _sanitizeFileName from "sanitize-filename" export function sanitizeFileName(s: string, normalizeNfd = false): string { const sanitized = _sanitizeFileName(s) diff --git a/packages/builder-util/src/fs.ts b/packages/builder-util/src/fs.ts index 40c4498fe2f..aac7f52a0b6 100644 --- a/packages/builder-util/src/fs.ts +++ b/packages/builder-util/src/fs.ts @@ -1,13 +1,13 @@ import { Nullish } from "builder-util-runtime" import { Stats } from "fs" -import { copyFile as _nodeCopyFile } from "fs-extra" +import fsExtra from "fs-extra" import { access, chmod, link, lstat, mkdir, readdir, readlink, stat, symlink, unlink, writeFile } from "fs/promises" import { platform } from "os" import * as path from "path" -import { Mode } from "stat-mode" +import statMode from "stat-mode" import asyncPool from "tiny-async-pool" -import { log } from "./log" -import { orIfFileNotExist, orNullIfFileNotExist } from "./promise" +import { log } from "./log.js" +import { orIfFileNotExist, orNullIfFileNotExist } from "./promise.js" export const MAX_FILE_REQUESTS = 8 @@ -170,7 +170,7 @@ export function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, if (stats != null) { const originalModeNumber = stats.mode - const mode = new Mode(stats) + const mode = new statMode.Mode(stats) if (mode.owner.execute) { mode.group.execute = true mode.others.execute = true @@ -184,7 +184,7 @@ export function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, if (originalModeNumber !== stats.mode) { if (log.isDebugEnabled) { - const oldMode = new Mode({ mode: originalModeNumber }) + const oldMode = new statMode.Mode({ mode: originalModeNumber }) log.debug({ file: dest, oldMode, mode }, "permissions fixed from") } @@ -215,7 +215,7 @@ export function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, } function doCopyFile(src: string, dest: string, stats: Stats | Nullish): Promise { - const promise = _nodeCopyFile(src, dest) + const promise = fsExtra.copyFile(src, dest) if (stats == null) { return promise } diff --git a/packages/builder-util/src/indexInternal.ts b/packages/builder-util/src/indexInternal.ts new file mode 100644 index 00000000000..e51ad83abed --- /dev/null +++ b/packages/builder-util/src/indexInternal.ts @@ -0,0 +1 @@ +export { getCompleteExtname, sanitizeFileName } from "./filename.js" diff --git a/packages/builder-util/src/log.ts b/packages/builder-util/src/log.ts index 6ec024875f7..1fd6219f212 100644 --- a/packages/builder-util/src/log.ts +++ b/packages/builder-util/src/log.ts @@ -1,4 +1,4 @@ -import * as chalk from "chalk" +import chalk from "chalk" import { Chalk } from "chalk" import _debug from "debug" import WritableStream = NodeJS.WritableStream diff --git a/packages/builder-util/src/promise.ts b/packages/builder-util/src/promise.ts index 24e737df262..7e38a024ba1 100644 --- a/packages/builder-util/src/promise.ts +++ b/packages/builder-util/src/promise.ts @@ -1,4 +1,4 @@ -import * as chalk from "chalk" +import chalk from "chalk" export function printErrorAndExit(error: Error) { console.error(chalk.red((error.stack || error).toString())) diff --git a/packages/builder-util/src/util.ts b/packages/builder-util/src/util.ts index 360631a4266..26f57967c8a 100644 --- a/packages/builder-util/src/util.ts +++ b/packages/builder-util/src/util.ts @@ -1,6 +1,6 @@ import { appBuilderPath } from "app-builder-bin" import { retry, Nullish, safeStringifyJson } from "builder-util-runtime" -import * as chalk from "chalk" +import chalk from "chalk" import { ChildProcess, execFile, ExecFileOptions, SpawnOptions } from "child_process" import { spawn as _spawn } from "cross-spawn" import { createHash } from "crypto" @@ -8,8 +8,8 @@ import _debug from "debug" import { dump } from "js-yaml" import * as path from "path" import { install as installSourceMap } from "source-map-support" -import { getPath7za } from "./7za" -import { debug, log } from "./log" +import { getPath7za } from "./7za.js" +import { debug, log } from "./log.js" if (process.env.JEST_WORKER_ID == null) { installSourceMap() @@ -17,20 +17,19 @@ if (process.env.JEST_WORKER_ID == null) { export { safeStringifyJson, retry } from "builder-util-runtime" export { TmpDir } from "temp-file" -export * from "./arch" -export { Arch, archFromString, ArchType, defaultArchFromString, getArchCliNames, getArchSuffix, toLinuxArchString } from "./arch" -export { AsyncTaskManager } from "./asyncTaskManager" -export { DebugLogger } from "./DebugLogger" -export * from "./log" -export { httpExecutor, NodeHttpExecutor } from "./nodeHttpExecutor" -export * from "./promise" - +export * from "./arch.js" +export { Arch, archFromString, ArchType, defaultArchFromString, getArchCliNames, getArchSuffix, toLinuxArchString } from "./arch.js" +export { AsyncTaskManager } from "./asyncTaskManager.js" +export { DebugLogger } from "./DebugLogger.js" +export * from "./log.js" +export { httpExecutor, NodeHttpExecutor } from "./nodeHttpExecutor.js" +export * from "./promise.js" export { asArray } from "builder-util-runtime" -export * from "./fs" +export * from "./fs.js" -export { deepAssign } from "./deepAssign" +export { deepAssign } from "./deepAssign.js" -export { getPath7x, getPath7za } from "./7za" +export { getPath7x, getPath7za } from "./7za.js" export const debug7z = _debug("electron-builder:7z") diff --git a/packages/builder-util/tsconfig.json b/packages/builder-util/tsconfig.json index 0b6f6190a3b..8e94f1ec546 100644 --- a/packages/builder-util/tsconfig.json +++ b/packages/builder-util/tsconfig.json @@ -11,9 +11,5 @@ { "path": "../builder-util-runtime" } - ], - "jsdoc": { - "out": "../../scripts/jsdoc/out/util", - "access": "public" - } + ] } \ No newline at end of file diff --git a/packages/dmg-builder/package.json b/packages/dmg-builder/package.json index 5de2b39731f..b88adbf4947 100644 --- a/packages/dmg-builder/package.json +++ b/packages/dmg-builder/package.json @@ -1,7 +1,11 @@ { "name": "dmg-builder", - "version": "26.9.0", - "main": "out/dmgUtil.js", + "version": "26.8.2", + "type": "module", + "exports": { + ".": "./out/dmgUtil.js" + }, + "description": "dmg builder for electron-builder", "author": "Vladimir Krivosheev", "license": "MIT", "repository": { @@ -18,7 +22,7 @@ "dependencies": { "app-builder-lib": "workspace:*", "builder-util": "workspace:*", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, @@ -30,5 +34,5 @@ "@types/js-yaml": "4.0.3", "temp-file": "3.4.0" }, - "typings": "./out/dmg.d.ts" + "types": "./out/dmg.d.ts" } diff --git a/packages/dmg-builder/src/dmg.ts b/packages/dmg-builder/src/dmg.ts index 9366636f922..578a0778e97 100644 --- a/packages/dmg-builder/src/dmg.ts +++ b/packages/dmg-builder/src/dmg.ts @@ -1,14 +1,14 @@ -import { DmgOptions, Target } from "app-builder-lib" -import { findIdentity, isSignAllowed } from "app-builder-lib/out/codeSign/macCodeSign" -import { MacPackager } from "app-builder-lib/out/macPackager" -import { createBlockmap } from "app-builder-lib/out/targets/differentialUpdateInfoBuilder" +import { DmgOptions, MacPackager, Target } from "app-builder-lib" +import { createBlockmap, findIdentity, isSignAllowed } from "app-builder-lib/internal" import { Arch, exec, getArchSuffix, InvalidConfigurationError, isEmptyOrSpaces } from "builder-util" -import { sanitizeFileName } from "builder-util/out/filename" +import { sanitizeFileName } from "builder-util/internal" import { release as getOsRelease } from "os" import * as path from "path" -import { addLicenseToDmg } from "./dmgLicense" -import { computeBackground, customizeDmg } from "./dmgUtil" -import { hdiUtil } from "./hdiuil" +import { addLicenseToDmg } from "./dmgLicense.js" +import { computeBackground, customizeDmg } from "./dmgUtil.js" +import { hdiUtil } from "./hdiuil.js" + +export { attachAndExecute, getDmgTemplatePath } from "./dmgUtil.js" export interface DmgBuildConfig { title: string @@ -45,7 +45,7 @@ export interface DmgBuildConfig { }> } export class DmgTarget extends Target { - readonly options: DmgOptions = this.packager.config.dmg || Object.create(null) + readonly options: DmgOptions isAsyncSupported = false @@ -54,6 +54,7 @@ export class DmgTarget extends Target { readonly outDir: string ) { super("dmg") + this.options = this.packager.config.dmg || Object.create(null) } async build(appPath: string, arch: Arch) { diff --git a/packages/dmg-builder/src/dmgLicense.ts b/packages/dmg-builder/src/dmgLicense.ts index 22f99542a73..5ceccccd459 100644 --- a/packages/dmg-builder/src/dmgLicense.ts +++ b/packages/dmg-builder/src/dmgLicense.ts @@ -1,10 +1,10 @@ import { PlatformPackager } from "app-builder-lib" -import { getLicenseFiles } from "app-builder-lib/out/util/license" +import { getLicenseFiles } from "app-builder-lib/internal" import { log } from "builder-util" import { dmgLicenseFromJSON } from "dmg-license" -import { readFile, readJson } from "fs-extra" +import fsExtra from "fs-extra" import { load } from "js-yaml" -import { getLicenseButtonsFile } from "./licenseButtons" +import { getLicenseButtonsFile } from "./licenseButtons.js" // License Specifications // https://github.com/argv-minus-one/dmg-license/blob/HEAD/docs/License%20Specifications.md @@ -40,7 +40,7 @@ export async function addLicenseToDmg(packager: PlatformPackager, dmgPath: for (const button of licenseButtonFiles) { const filepath = button.file - const label = filepath.endsWith(".yml") ? load(await readFile(filepath, "utf-8")) : await readJson(filepath) + const label = filepath.endsWith(".yml") ? load(await fsExtra.readFile(filepath, "utf-8")) : await fsExtra.readJson(filepath) if (label.description) { // to support original button file format label.message = label.description diff --git a/packages/dmg-builder/src/dmgUtil.ts b/packages/dmg-builder/src/dmgUtil.ts index 927aa473f04..63ca38cd2ab 100644 --- a/packages/dmg-builder/src/dmgUtil.ts +++ b/packages/dmg-builder/src/dmgUtil.ts @@ -1,14 +1,14 @@ import { DmgOptions, MacPackager, PlatformPackager } from "app-builder-lib" -import { downloadArtifact } from "app-builder-lib/out/binDownload" +import { downloadArtifact } from "app-builder-lib/internal" import { exec, executeFinally, exists, isEmptyOrSpaces, TmpDir } from "builder-util" -import { writeFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { DmgBuildConfig } from "./dmg" -import { hdiUtil, hdiutilTransientExitCodes } from "./hdiuil" +import { DmgBuildConfig } from "./dmg.js" +import { hdiUtil, hdiutilTransientExitCodes } from "./hdiuil.js" -export { DmgTarget } from "./dmg" +export { DmgTarget } from "./dmg.js" -const root = path.join(__dirname, "..") +const root = path.join(import.meta.dirname, "..") export function getDmgTemplatePath() { return path.join(root, "templates") @@ -183,7 +183,7 @@ export async function customizeDmg({ appPath, artifactPath, volumeName, specific } const settingsFile = await packager.getTempFile(".json") - await writeFile(settingsFile, JSON.stringify(settings, null, 2)) + await fsExtra.writeFile(settingsFile, JSON.stringify(settings, null, 2)) const dmgbuild = await getDmgVendorPath() await exec(dmgbuild, ["-s", settingsFile, path.basename(volumePath), artifactPath], { diff --git a/packages/dmg-builder/src/hdiuil.ts b/packages/dmg-builder/src/hdiuil.ts index 2df92c9eb39..31bf7e36dd6 100644 --- a/packages/dmg-builder/src/hdiuil.ts +++ b/packages/dmg-builder/src/hdiuil.ts @@ -52,7 +52,7 @@ const shouldRetry = (args: string[]) => (error: any) => { } export async function hdiUtil(args: string[]): Promise { - return retry(() => exec("hdiutil", args), { + return await retry(() => exec("hdiutil", args), { retries: 5, interval: 5000, backoff: 2000, diff --git a/packages/dmg-builder/src/licenseButtons.ts b/packages/dmg-builder/src/licenseButtons.ts index aac1ae12c58..91075da7e75 100644 --- a/packages/dmg-builder/src/licenseButtons.ts +++ b/packages/dmg-builder/src/licenseButtons.ts @@ -1,11 +1,11 @@ import { PlatformPackager } from "app-builder-lib" -import { getLicenseAssets } from "app-builder-lib/out/util/license" +import { getLicenseAssets } from "app-builder-lib/internal" import { log } from "builder-util" -import { readFile } from "fs-extra" +import fsExtra from "fs-extra" import * as iconv from "iconv-lite" import { load } from "js-yaml" -import { serializeString } from "./dmgUtil" -import { getDefaultButtons } from "./licenseDefaultButtons" +import { serializeString } from "./dmgUtil.js" +import { getDefaultButtons } from "./licenseDefaultButtons.js" export async function getLicenseButtonsFile(packager: PlatformPackager): Promise> { return getLicenseAssets( @@ -34,7 +34,7 @@ export async function getLicenseButtons(licenseButtonFiles: Array { @@ -159,7 +162,7 @@ export default class SquirrelWindowsTarget extends Target { } private async createNuspecTemplateWithProjectUrl() { - const templatePath = path.resolve(__dirname, "..", "template.nuspectemplate") + const templatePath = path.resolve(import.meta.dirname, "..", "template.nuspectemplate") const projectUrl = await this.packager.appInfo.computePackageUrl() if (projectUrl != null) { const nuspecTemplate = await this.packager.info.tempDirManager.getTempFile({ prefix: "template", suffix: ".nuspectemplate" }) diff --git a/packages/electron-builder-squirrel-windows/tsconfig.json b/packages/electron-builder-squirrel-windows/tsconfig.json index c09a92f11c5..e569ae0df14 100644 --- a/packages/electron-builder-squirrel-windows/tsconfig.json +++ b/packages/electron-builder-squirrel-windows/tsconfig.json @@ -1,10 +1,5 @@ { "extends": "../tsconfig-base.json", - "jsdoc": { - "out": "../../scripts/jsdoc/out/builder-lib", - "examples": "../../scripts/jsdoc/examples", - "access": "public" - }, "compilerOptions": { "outDir": "out", "rootDir": "src" diff --git a/packages/electron-builder/cli.js b/packages/electron-builder/cli.js index 90282b0ce4c..11c9d2f0f67 100755 --- a/packages/electron-builder/cli.js +++ b/packages/electron-builder/cli.js @@ -1,4 +1,3 @@ #!/usr/bin/env node -// https://github.com/pnpm/pnpm/issues/1801 -require("./out/cli/cli") +import("./out/cli/cli") diff --git a/packages/electron-builder/install-app-deps.js b/packages/electron-builder/install-app-deps.js index 65a838b4e18..a616261e554 100755 --- a/packages/electron-builder/install-app-deps.js +++ b/packages/electron-builder/install-app-deps.js @@ -1,4 +1,3 @@ #!/usr/bin/env node -// https://github.com/pnpm/pnpm/issues/1801 -require("./out/cli/install-app-deps") +import("./out/cli/install-app-deps") diff --git a/packages/electron-builder/package.json b/packages/electron-builder/package.json index 88799467e4c..b0b40be1d9f 100644 --- a/packages/electron-builder/package.json +++ b/packages/electron-builder/package.json @@ -1,8 +1,12 @@ { "name": "electron-builder", "description": "A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box", - "version": "26.9.0", - "main": "out/index.js", + "version": "26.8.2", + "type": "module", + "exports": { + ".": "./out/index.js", + "./internal": "./out/indexInternal.js" + }, "files": [ "out" ], @@ -54,10 +58,11 @@ "app-builder-lib": "workspace:*", "builder-util": "workspace:*", "builder-util-runtime": "workspace:*", + "electron-publish": "workspace:*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "workspace:*", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" @@ -66,7 +71,7 @@ "@types/fs-extra": "9.0.13", "@types/yargs": "^17.0.16" }, - "typings": "./out/index.d.ts", + "types": "./out/index.d.ts", "publishConfig": { "tag": "next" } diff --git a/packages/electron-builder/src/builder.ts b/packages/electron-builder/src/builder.ts index 295f480bc9b..80a83501c52 100644 --- a/packages/electron-builder/src/builder.ts +++ b/packages/electron-builder/src/builder.ts @@ -1,11 +1,12 @@ import { build as _build, Configuration, DIR_TARGET, Packager, PackagerOptions, Platform } from "app-builder-lib" import { addValue, Arch, archFromString, deepAssign } from "builder-util" -import * as chalk from "chalk" +import chalk from "chalk" import { PublishOptions } from "electron-publish" -import * as yargs from "yargs" +import yargs, { Argv } from "yargs" +import { hideBin } from "yargs/helpers" -export function createYargs(): yargs.Argv { - return yargs.parserConfiguration({ +export function createYargs(): Argv { + return yargs(hideBin(process.argv)).parserConfiguration({ "camel-case-expansion": false, }) } @@ -215,7 +216,7 @@ export function build(rawOptions?: CliOptions): Promise> { /** * @private */ -export function configureBuildCommand(yargs: yargs.Argv): yargs.Argv { +export function configureBuildCommand(yargs: Argv): Argv { const publishGroup = "Publishing:" const buildGroup = "Building:" return yargs diff --git a/packages/electron-builder/src/cli/cli.ts b/packages/electron-builder/src/cli/cli.ts index 114b9df2380..ee4aac75c2e 100644 --- a/packages/electron-builder/src/cli/cli.ts +++ b/packages/electron-builder/src/cli/cli.ts @@ -1,18 +1,19 @@ #! /usr/bin/env node -import { getElectronVersion } from "app-builder-lib/out/electron/electronVersion" -import { loadEnv } from "app-builder-lib/out/util/config/load" -import { nodeGypRebuild } from "app-builder-lib/out/util/yarn" +import { createRequire } from "node:module" +import { getElectronVersion, loadEnv, nodeGypRebuild } from "app-builder-lib/internal" + +const require = createRequire(import.meta.url) import { ExecError, InvalidConfigurationError, log } from "builder-util" -import * as chalk from "chalk" -import { readJson } from "fs-extra" +import chalk from "chalk" +import fsExtra from "fs-extra" import { isCI } from "ci-info" import * as path from "path" -import { build, configureBuildCommand, createYargs } from "../builder" -import { configurePublishCommand, publish } from "../publish" -import { createSelfSignedCert } from "./create-self-signed-cert" -import { configureInstallAppDepsCommand, installAppDeps } from "./install-app-deps" -import { start } from "./start" +import { build, configureBuildCommand, createYargs } from "../builder.js" +import { configurePublishCommand, publish } from "../publish.js" +import { createSelfSignedCert } from "./create-self-signed-cert.js" +import { configureInstallAppDepsCommand, installAppDeps } from "./install-app-deps.js" +import { start } from "./start.js" // tslint:disable:no-unused-expression void createYargs() @@ -68,7 +69,7 @@ async function checkIsOutdated() { return } - const pkg = await readJson(path.join(__dirname, "..", "..", "package.json")) + const pkg = await fsExtra.readJson(path.join(import.meta.dirname, "..", "..", "package.json")) if (pkg.version === "0.0.0-semantic-release") { return } diff --git a/packages/electron-builder/src/cli/create-self-signed-cert.ts b/packages/electron-builder/src/cli/create-self-signed-cert.ts index 97e0c0b8ca3..278fbdf334c 100644 --- a/packages/electron-builder/src/cli/create-self-signed-cert.ts +++ b/packages/electron-builder/src/cli/create-self-signed-cert.ts @@ -1,7 +1,7 @@ -import { getWindowsKitsBundle } from "app-builder-lib/out/toolsets/windows" +import { getWindowsKitsBundle } from "app-builder-lib/internal" import { archFromString, exec, log, spawn, TmpDir, unlinkIfExists } from "builder-util" -import { sanitizeFileName } from "builder-util/out/filename" -import * as chalk from "chalk" +import { sanitizeFileName } from "builder-util/internal" +import chalk from "chalk" import { mkdir } from "fs/promises" import * as path from "path" diff --git a/packages/electron-builder/src/cli/install-app-deps.ts b/packages/electron-builder/src/cli/install-app-deps.ts index b18f0c7aa5c..6ddbad1938b 100644 --- a/packages/electron-builder/src/cli/install-app-deps.ts +++ b/packages/electron-builder/src/cli/install-app-deps.ts @@ -1,20 +1,23 @@ #! /usr/bin/env node - -import { getElectronVersion } from "app-builder-lib/out/electron/electronVersion" -import { computeDefaultAppDirectory, getConfig } from "app-builder-lib/out/util/config/config" -import { orNullIfFileNotExist } from "app-builder-lib/out/util/config/load" -import { createLazyProductionDeps } from "app-builder-lib/out/util/packageDependencies" -import { installOrRebuild } from "app-builder-lib/out/util/yarn" -import { PACKAGE_VERSION } from "app-builder-lib/out/version" -import { determinePackageManagerEnv } from "app-builder-lib/out/node-module-collector" -import { getArchCliNames, log, printErrorAndExit } from "builder-util" -import { readJson } from "fs-extra" +import { fileURLToPath } from "node:url" +import { + computeDefaultAppDirectory, + createLazyProductionDeps, + determinePackageManagerEnv, + getConfig, + getElectronVersion, + installOrRebuild, + PACKAGE_VERSION, +} from "app-builder-lib/internal" +import { getArchCliNames, log, orNullIfFileNotExist, printErrorAndExit } from "builder-util" +import fsExtra from "fs-extra" import { Lazy } from "lazy-val" import * as path from "path" -import * as yargs from "yargs" +import { Argv } from "yargs" +import { createYargs } from "../builder.js" /** @internal */ -export function configureInstallAppDepsCommand(yargs: yargs.Argv): yargs.Argv { +export function configureInstallAppDepsCommand(yargs: Argv): Argv { // https://github.com/yargs/yargs/issues/760 // demandOption is required to be set return yargs @@ -45,7 +48,7 @@ export async function installAppDeps(args: any) { } const projectDir = process.cwd() - const packageMetadata = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, "package.json")))) + const packageMetadata = new Lazy(() => orNullIfFileNotExist(fsExtra.readJson(path.join(projectDir, "package.json")))) const config = await getConfig(projectDir, null, null, packageMetadata) const [appDir, version] = await Promise.all([computeDefaultAppDirectory(projectDir, config.directories?.app), getElectronVersion(projectDir, config)]) @@ -71,10 +74,10 @@ export async function installAppDeps(args: any) { } function main() { - return installAppDeps(configureInstallAppDepsCommand(yargs).argv) + return installAppDeps(configureInstallAppDepsCommand(createYargs()).argv) } -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { log.warn("please use as subcommand: electron-builder install-app-deps") main().catch(printErrorAndExit) } diff --git a/packages/electron-builder/src/cli/start.ts b/packages/electron-builder/src/cli/start.ts index b54d293f388..40a1cd7cd5f 100644 --- a/packages/electron-builder/src/cli/start.ts +++ b/packages/electron-builder/src/cli/start.ts @@ -1,3 +1,7 @@ +import { createRequire } from "node:module" + +const require = createRequire(import.meta.url) + /** @internal */ export function start() { require("electron-webpack/dev-runner") diff --git a/packages/electron-builder/src/index.ts b/packages/electron-builder/src/index.ts index a50a67e4613..f7812eaa48e 100644 --- a/packages/electron-builder/src/index.ts +++ b/packages/electron-builder/src/index.ts @@ -1,6 +1,6 @@ export { getArchSuffix, Arch, archFromString, log } from "builder-util" -export { build, CliOptions, createTargets } from "./builder" -export { publish, publishArtifactsWithOptions } from "./publish" +export { build, CliOptions, createTargets } from "./builder.js" +export { publish, publishArtifactsWithOptions } from "./publish.js" export { TargetConfiguration, Platform, diff --git a/packages/electron-builder/src/indexInternal.ts b/packages/electron-builder/src/indexInternal.ts new file mode 100644 index 00000000000..d440c7daf38 --- /dev/null +++ b/packages/electron-builder/src/indexInternal.ts @@ -0,0 +1 @@ +export { configureBuildCommand, createYargs, normalizeOptions, coerceTypes } from "./builder.js" diff --git a/packages/electron-builder/src/publish.ts b/packages/electron-builder/src/publish.ts index 626ed6247be..2478ddde130 100644 --- a/packages/electron-builder/src/publish.ts +++ b/packages/electron-builder/src/publish.ts @@ -1,18 +1,17 @@ #! /usr/bin/env node +import { fileURLToPath } from "node:url" import { AppInfo, CancellationToken, Packager, PackagerOptions, PublishManager, PublishOptions, UploadTask, checkBuildRequestOptions } from "app-builder-lib" -import { Publish } from "app-builder-lib/out/core" -import { computeSafeArtifactNameIfNeeded } from "app-builder-lib/out/platformPackager" -import { getConfig } from "app-builder-lib/out/util/config/config" +import { Publish, computeSafeArtifactNameIfNeeded, getConfig } from "app-builder-lib/internal" import { InvalidConfigurationError, archFromString, log, printErrorAndExit } from "builder-util" import { PublishPolicy } from "electron-publish" -import * as chalk from "chalk" +import chalk from "chalk" import * as path from "path" -import * as yargs from "yargs" -import { BuildOptions, normalizeOptions } from "./builder" +import { Argv } from "yargs" +import { BuildOptions, createYargs, normalizeOptions } from "./builder.js" /** @internal */ -export function configurePublishCommand(yargs: yargs.Argv): yargs.Argv { +export function configurePublishCommand(yargs: Argv): Argv { // https://github.com/yargs/yargs/issues/760 // demandOption is required to be set return yargs @@ -121,10 +120,10 @@ async function publishPackageWithTasks( } function main() { - return publish(configurePublishCommand(yargs).argv as any) + return publish(configurePublishCommand(createYargs()).argv as any) } -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { log.warn("please use as subcommand: electron-builder publish") main().catch(printErrorAndExit) } diff --git a/packages/electron-builder/tsconfig.json b/packages/electron-builder/tsconfig.json index 8a55ef2a447..488b8196b73 100644 --- a/packages/electron-builder/tsconfig.json +++ b/packages/electron-builder/tsconfig.json @@ -18,11 +18,6 @@ "path": "../dmg-builder" } ], - "jsdoc": { - "out": "../../scripts/jsdoc/out/builder", - "examples": "../../scripts/jsdoc/examples", - "access": "public" - }, "include": [ "src/**/*.ts", "../../typings/*.d.ts" diff --git a/packages/electron-publish/package.json b/packages/electron-publish/package.json index cdd68178754..be1eeb6beba 100644 --- a/packages/electron-publish/package.json +++ b/packages/electron-publish/package.json @@ -1,7 +1,11 @@ { "name": "electron-publish", - "version": "26.9.0", - "main": "out/index.js", + "version": "26.8.1", + "type": "module", + "exports": { + ".": "./out/index.js", + "./internal": "./out/indexInternal.js" + }, "author": "Vladimir Krivosheev", "license": "MIT", "repository": { @@ -15,17 +19,20 @@ "out" ], "dependencies": { - "@types/fs-extra": "^9.0.11", "builder-util": "workspace:*", "builder-util-runtime": "workspace:*", "chalk": "^4.1.2", "form-data": "^4.0.5", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "lazy-val": "^1.0.5", "mime": "^2.5.2" }, - "typings": "./out/index.d.ts", + "types": "./out/index.d.ts", "devDependencies": { + "@types/fs-extra": "^9.0.11", "@types/mime": "2.0.3" + }, + "scripts": { + "compile": "tsc -b" } } diff --git a/packages/electron-publish/src/bitbucketPublisher.ts b/packages/electron-publish/src/bitbucketPublisher.ts index 5fc1397b234..cb45b36d901 100644 --- a/packages/electron-publish/src/bitbucketPublisher.ts +++ b/packages/electron-publish/src/bitbucketPublisher.ts @@ -1,11 +1,11 @@ import { Arch, httpExecutor, InvalidConfigurationError, isEmptyOrSpaces, log } from "builder-util" import { configureRequestOptions, HttpExecutor } from "builder-util-runtime" -import { BitbucketOptions } from "builder-util-runtime/out/publishOptions" -import * as FormData from "form-data" -import { readFile } from "fs-extra" +import { BitbucketOptions } from "builder-util-runtime" +import FormData from "form-data" +import fsExtra from "fs-extra" import { ClientRequest, RequestOptions } from "http" -import { PublishContext } from "./" -import { HttpPublisher } from "./httpPublisher" +import { PublishContext } from "./index.js" +import { HttpPublisher } from "./httpPublisher.js" export class BitbucketPublisher extends HttpPublisher { readonly providerName = "bitbucket" @@ -42,7 +42,7 @@ export class BitbucketPublisher extends HttpPublisher { file: string ): Promise { return HttpExecutor.retryOnServerError(async () => { - const fileContent = await readFile(file) + const fileContent = await fsExtra.readFile(file) const form = new FormData() form.append("files", fileContent, fileName) const upload: RequestOptions = { diff --git a/packages/electron-publish/src/gitHubPublisher.ts b/packages/electron-publish/src/gitHubPublisher.ts index ea525cb49f8..13ad01f28d5 100644 --- a/packages/electron-publish/src/gitHubPublisher.ts +++ b/packages/electron-publish/src/gitHubPublisher.ts @@ -4,10 +4,10 @@ import { ClientRequest } from "http" import { Lazy } from "lazy-val" import * as mime from "mime" import { parse as parseUrl, UrlWithStringQuery } from "url" -import { HttpPublisher } from "./httpPublisher" -import { PublishContext, PublishOptions } from "./index" -import { getCiTag } from "./publisher" -import { trimStringWithWarn } from "./util" +import { HttpPublisher } from "./httpPublisher.js" +import { PublishContext, PublishOptions } from "./index.js" +import { getCiTag } from "./publisher.js" +import { trimStringWithWarn } from "./util.js" export interface Release { id: number diff --git a/packages/electron-publish/src/gitlabPublisher.ts b/packages/electron-publish/src/gitlabPublisher.ts index ce210a99acf..b42ebf538b4 100644 --- a/packages/electron-publish/src/gitlabPublisher.ts +++ b/packages/electron-publish/src/gitlabPublisher.ts @@ -6,11 +6,11 @@ import { configureRequestOptions, GitlabOptions, GitlabReleaseInfo, parseJson, H import { ClientRequest } from "http" import { Lazy } from "lazy-val" import * as mime from "mime" -import * as FormData from "form-data" +import FormData from "form-data" import { URL } from "url" -import { HttpPublisher } from "./httpPublisher" -import { PublishContext } from "./index" -import { trimStringWithWarn } from "./util" +import { HttpPublisher } from "./httpPublisher.js" +import { PublishContext } from "./index.js" +import { trimStringWithWarn } from "./util.js" type RequestProcessor = (request: ClientRequest, reject: (error: Error) => void) => void diff --git a/packages/electron-publish/src/httpPublisher.ts b/packages/electron-publish/src/httpPublisher.ts index 8c19d036575..549132ee2f1 100644 --- a/packages/electron-publish/src/httpPublisher.ts +++ b/packages/electron-publish/src/httpPublisher.ts @@ -1,9 +1,9 @@ import { Arch } from "builder-util" -import { stat } from "fs-extra" +import fsExtra from "fs-extra" import { ClientRequest } from "http" import { basename } from "path" -import { PublishContext, UploadTask } from "." -import { Publisher } from "./publisher" +import { PublishContext, UploadTask } from "./index.js" +import { Publisher } from "./publisher.js" export abstract class HttpPublisher extends Publisher { protected constructor( @@ -35,7 +35,7 @@ export abstract class HttpPublisher extends Publisher { return } - const fileStat = await stat(task.file) + const fileStat = await fsExtra.stat(task.file) const progressBar = this.createProgressBar(fileName, fileStat.size) return this.doUpload( diff --git a/packages/electron-publish/src/index.ts b/packages/electron-publish/src/index.ts index b2471778988..df244ee8494 100644 --- a/packages/electron-publish/src/index.ts +++ b/packages/electron-publish/src/index.ts @@ -1,25 +1,25 @@ import { Arch } from "builder-util" import { CancellationToken } from "builder-util-runtime" -import { MultiProgress } from "./multiProgress" +import { MultiProgress } from "./multiProgress.js" -export { BitbucketPublisher } from "./bitbucketPublisher" -export { GitHubPublisher } from "./gitHubPublisher" -export { GitlabPublisher } from "./gitlabPublisher" -export { KeygenPublisher } from "./keygenPublisher" -export { S3Publisher } from "./s3/s3Publisher" -export { SpacesPublisher } from "./s3/spacesPublisher" -export { SnapStorePublisher } from "./snapStorePublisher" +export { BitbucketPublisher } from "./bitbucketPublisher.js" +export { GitHubPublisher } from "./gitHubPublisher.js" +export { GitlabPublisher } from "./gitlabPublisher.js" +export { KeygenPublisher } from "./keygenPublisher.js" +export { S3Publisher } from "./s3/s3Publisher.js" +export { SpacesPublisher } from "./s3/spacesPublisher.js" +export { SnapStorePublisher } from "./snapStorePublisher.js" export type PublishPolicy = "onTag" | "onTagOrDraft" | "always" | "never" -export { ProgressCallback } from "./progress" +export { ProgressCallback } from "./progress.js" export interface PublishOptions { publish?: PublishPolicy | null } -export { HttpPublisher } from "./httpPublisher" -export { getCiTag, Publisher } from "./publisher" +export { HttpPublisher } from "./httpPublisher.js" +export { getCiTag, Publisher } from "./publisher.js" export interface PublishContext { readonly cancellationToken: CancellationToken diff --git a/packages/electron-publish/src/indexInternal.ts b/packages/electron-publish/src/indexInternal.ts new file mode 100644 index 00000000000..c3ffd454e98 --- /dev/null +++ b/packages/electron-publish/src/indexInternal.ts @@ -0,0 +1 @@ +export { MultiProgress } from "./multiProgress.js" diff --git a/packages/electron-publish/src/keygenPublisher.ts b/packages/electron-publish/src/keygenPublisher.ts index 9e5a709de53..990e1721de4 100644 --- a/packages/electron-publish/src/keygenPublisher.ts +++ b/packages/electron-publish/src/keygenPublisher.ts @@ -1,10 +1,10 @@ import { Arch, httpExecutor, InvalidConfigurationError, isEmptyOrSpaces, log } from "builder-util" import { configureRequestOptions, HttpExecutor, parseJson } from "builder-util-runtime" -import { KeygenOptions } from "builder-util-runtime/out/publishOptions" -import { getCompleteExtname } from "builder-util/out/filename" +import { KeygenOptions } from "builder-util-runtime" +import { getCompleteExtname } from "builder-util/internal" import { ClientRequest, RequestOptions } from "http" -import { PublishContext } from "./" -import { HttpPublisher } from "./httpPublisher" +import { PublishContext } from "./index.js" +import { HttpPublisher } from "./httpPublisher.js" type RecursivePartial = { [P in keyof T]?: RecursivePartial diff --git a/packages/electron-publish/src/multiProgress.ts b/packages/electron-publish/src/multiProgress.ts index 6321d51141d..7da359a9965 100644 --- a/packages/electron-publish/src/multiProgress.ts +++ b/packages/electron-publish/src/multiProgress.ts @@ -1,5 +1,5 @@ import { setPrinter } from "builder-util" -import { ProgressBar } from "./progress" +import { ProgressBar } from "./progress.js" export class MultiProgress { private readonly stream = process.stdout as any diff --git a/packages/electron-publish/src/publisher.ts b/packages/electron-publish/src/publisher.ts index 57fbd51c3ea..23d0c4390b2 100644 --- a/packages/electron-publish/src/publisher.ts +++ b/packages/electron-publish/src/publisher.ts @@ -1,9 +1,9 @@ import { log, PADDING } from "builder-util" import { ProgressCallbackTransform, PublishProvider } from "builder-util-runtime" -import * as chalk from "chalk" -import { createReadStream, Stats } from "fs-extra" -import { PublishContext, UploadTask } from "." -import { ProgressBar } from "./progress" +import chalk from "chalk" +import fsExtra from "fs-extra" +import { PublishContext, UploadTask } from "./index.js" +import { ProgressBar } from "./progress.js" const progressBarOptions = { incomplete: " ", @@ -28,8 +28,8 @@ export abstract class Publisher { }) } - protected createReadStreamAndProgressBar(file: string, fileStat: Stats, progressBar: ProgressBar | null, reject: (error: Error) => void): NodeJS.ReadableStream { - const fileInputStream = createReadStream(file) + protected createReadStreamAndProgressBar(file: string, fileStat: fsExtra.Stats, progressBar: ProgressBar | null, reject: (error: Error) => void): NodeJS.ReadableStream { + const fileInputStream = fsExtra.createReadStream(file) fileInputStream.on("error", reject) if (progressBar == null) { diff --git a/packages/electron-publish/src/s3/baseS3Publisher.ts b/packages/electron-publish/src/s3/baseS3Publisher.ts index ca4016864a5..7b37c688d8e 100644 --- a/packages/electron-publish/src/s3/baseS3Publisher.ts +++ b/packages/electron-publish/src/s3/baseS3Publisher.ts @@ -2,8 +2,8 @@ import { executeAppBuilder, log } from "builder-util" import { BaseS3Options } from "builder-util-runtime" import { mkdir, symlink } from "fs/promises" import * as path from "path" -import { PublishContext, UploadTask } from ".." -import { Publisher } from "../publisher" +import { PublishContext, UploadTask } from "../index.js" +import { Publisher } from "../publisher.js" export abstract class BaseS3Publisher extends Publisher { protected constructor( diff --git a/packages/electron-publish/src/s3/s3Publisher.ts b/packages/electron-publish/src/s3/s3Publisher.ts index 404805fe6c8..e2c4d4d4747 100644 --- a/packages/electron-publish/src/s3/s3Publisher.ts +++ b/packages/electron-publish/src/s3/s3Publisher.ts @@ -1,7 +1,7 @@ import { executeAppBuilder, InvalidConfigurationError, log } from "builder-util" import { S3Options } from "builder-util-runtime" -import { PublishContext } from ".." -import { BaseS3Publisher } from "./baseS3Publisher" +import { PublishContext } from "../index.js" +import { BaseS3Publisher } from "./baseS3Publisher.js" export class S3Publisher extends BaseS3Publisher { readonly providerName = "s3" diff --git a/packages/electron-publish/src/s3/spacesPublisher.ts b/packages/electron-publish/src/s3/spacesPublisher.ts index d5149602910..b39cfab82ff 100644 --- a/packages/electron-publish/src/s3/spacesPublisher.ts +++ b/packages/electron-publish/src/s3/spacesPublisher.ts @@ -1,7 +1,7 @@ import { InvalidConfigurationError, isEmptyOrSpaces } from "builder-util" import { SpacesOptions } from "builder-util-runtime" -import { PublishContext } from "../" -import { BaseS3Publisher } from "./baseS3Publisher" +import { PublishContext } from "../index.js" +import { BaseS3Publisher } from "./baseS3Publisher.js" export class SpacesPublisher extends BaseS3Publisher { readonly providerName = "spaces" diff --git a/packages/electron-publish/src/snapStorePublisher.ts b/packages/electron-publish/src/snapStorePublisher.ts index 52a31c9f54e..313cca391fe 100644 --- a/packages/electron-publish/src/snapStorePublisher.ts +++ b/packages/electron-publish/src/snapStorePublisher.ts @@ -1,8 +1,8 @@ import { executeAppBuilder } from "builder-util" -import { SnapStoreOptions } from "builder-util-runtime/out/publishOptions" +import { SnapStoreOptions } from "builder-util-runtime" import * as path from "path" -import { PublishContext, UploadTask } from "." -import { Publisher } from "./publisher" +import { PublishContext, UploadTask } from "./index.js" +import { Publisher } from "./publisher.js" export class SnapStorePublisher extends Publisher { readonly providerName = "snapStore" diff --git a/packages/electron-publish/tsconfig.json b/packages/electron-publish/tsconfig.json index 1d0ee3793fa..d76d5d6e7b5 100644 --- a/packages/electron-publish/tsconfig.json +++ b/packages/electron-publish/tsconfig.json @@ -12,12 +12,7 @@ "path": "../builder-util-runtime" } ], - "jsdoc": { - "out": "../../scripts/jsdoc/out/index", - "access": "public" - }, "include": [ - "src/**/*.ts", - "../../typings/mime.d.ts" + "src/**/*.ts" ] } \ No newline at end of file diff --git a/packages/electron-updater/package.json b/packages/electron-updater/package.json index 7c2689f2965..ea21ec32e8c 100644 --- a/packages/electron-updater/package.json +++ b/packages/electron-updater/package.json @@ -2,7 +2,11 @@ "name": "electron-updater", "version": "6.8.4", "description": "Cross platform updater for electron applications", - "main": "out/main.js", + "type": "module", + "exports": { + ".": "./out/index.js", + "./internal": "./out/indexInternal.js" + }, "author": "Vladimir Krivosheev", "license": "MIT", "repository": { @@ -17,7 +21,7 @@ ], "dependencies": { "builder-util-runtime": "workspace:*", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", @@ -33,8 +37,14 @@ "@types/semver": "7.7.1", "electron": "35.7.5" }, - "typings": "./out/main.d.ts", + "types": "./out/main.d.ts", "publishConfig": { "tag": "next" + }, + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "compile": "tsc" } } diff --git a/packages/electron-updater/src/AppImageUpdater.ts b/packages/electron-updater/src/AppImageUpdater.ts index 15c95a71e66..895a78bc145 100644 --- a/packages/electron-updater/src/AppImageUpdater.ts +++ b/packages/electron-updater/src/AppImageUpdater.ts @@ -1,14 +1,14 @@ import { AllPublishOptions, newError } from "builder-util-runtime" import { execFileSync } from "child_process" -import { chmod } from "fs-extra" +import fsExtra from "fs-extra" import { unlinkSync } from "fs" import * as path from "path" -import { DownloadUpdateOptions } from "./AppUpdater" -import { BaseUpdater, InstallOptions } from "./BaseUpdater" -import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader" -import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader" -import { findFile, Provider } from "./providers/Provider" -import { DOWNLOAD_PROGRESS, ResolvedUpdateFileInfo } from "./types" +import { DownloadUpdateOptions } from "./AppUpdater.js" +import { BaseUpdater, InstallOptions } from "./BaseUpdater.js" +import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader.js" +import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js" +import { findFile, Provider } from "./providers/Provider.js" +import { DOWNLOAD_PROGRESS, ResolvedUpdateFileInfo } from "./types.js" export class AppImageUpdater extends BaseUpdater { constructor(options?: AllPublishOptions | null, app?: any) { @@ -45,7 +45,7 @@ export class AppImageUpdater extends BaseUpdater { await this.httpExecutor.download(fileInfo.url, updateFile, downloadOptions) } - await chmod(updateFile, 0o755) + await fsExtra.chmod(updateFile, 0o755) }, }) } diff --git a/packages/electron-updater/src/AppUpdater.ts b/packages/electron-updater/src/AppUpdater.ts index e69afe62d35..f03bd8fb5d1 100644 --- a/packages/electron-updater/src/AppUpdater.ts +++ b/packages/electron-updater/src/AppUpdater.ts @@ -1,3 +1,4 @@ +import { createRequire } from "node:module" import { AllPublishOptions, asArray, @@ -15,27 +16,29 @@ import { import { randomBytes } from "crypto" import { release } from "os" import { EventEmitter } from "events" -import { mkdir, outputFile, readFile, rename, unlink, copyFile, pathExists } from "fs-extra" +import fsExtra from "fs-extra" import { OutgoingHttpHeaders } from "http" import { load } from "js-yaml" import { Lazy } from "lazy-val" import * as path from "path" import { eq as isVersionsEqual, gt as isVersionGreaterThan, lt as isVersionLessThan, parse as parseVersion, prerelease as getVersionPreleaseComponents, SemVer } from "semver" -import { AppAdapter } from "./AppAdapter" -import { createTempUpdateFile, DownloadedUpdateHelper } from "./DownloadedUpdateHelper" -import { ElectronAppAdapter } from "./ElectronAppAdapter" -import { ElectronHttpExecutor, getNetSession, LoginCallback } from "./electronHttpExecutor" -import { GenericProvider } from "./providers/GenericProvider" -import { createClient, isUrlProbablySupportMultiRangeRequests } from "./providerFactory" -import { Provider, ProviderPlatform } from "./providers/Provider" +import { AppAdapter } from "./AppAdapter.js" +import { createTempUpdateFile, DownloadedUpdateHelper } from "./DownloadedUpdateHelper.js" +import { ElectronAppAdapter } from "./ElectronAppAdapter.js" +import { ElectronHttpExecutor, getNetSession, LoginCallback } from "./electronHttpExecutor.js" +import { GenericProvider } from "./providers/GenericProvider.js" +import { createClient, isUrlProbablySupportMultiRangeRequests } from "./providerFactory.js" +import { Provider, ProviderPlatform } from "./providers/Provider.js" import type { TypedEmitter } from "tiny-typed-emitter" import Session = Electron.Session import type { AuthInfo } from "electron" import { gunzipSync, gzipSync } from "zlib" -import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader" -import { GenericDifferentialDownloader } from "./differentialDownloader/GenericDifferentialDownloader" -import { DOWNLOAD_PROGRESS, Logger, ResolvedUpdateFileInfo, UPDATE_DOWNLOADED, UpdateCheckResult, UpdateDownloadedEvent, UpdaterSignal } from "./types" -import { VerifyUpdateSupport } from "./main" +import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader.js" +import { GenericDifferentialDownloader } from "./differentialDownloader/GenericDifferentialDownloader.js" +import { DOWNLOAD_PROGRESS, Logger, ResolvedUpdateFileInfo, UPDATE_DOWNLOADED, UpdateCheckResult, UpdateDownloadedEvent, UpdaterSignal } from "./types.js" +import { VerifyUpdateSupport } from "./index.js" + +const require = createRequire(import.meta.url) export type AppUpdaterEvents = { error: (error: Error, message?: string) => void @@ -622,7 +625,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter if (this._appUpdateConfigPath == null) { this._appUpdateConfigPath = this.app.appUpdateConfigPath } - return load(await readFile(this._appUpdateConfigPath, "utf-8")) + return load(await fsExtra.readFile(this._appUpdateConfigPath, "utf-8")) } private computeRequestHeaders(provider: Provider): OutgoingHttpHeaders { @@ -642,7 +645,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter private async getOrCreateStagingUserId(): Promise { const file = path.join(this.app.userDataPath, ".updaterId") try { - const id = await readFile(file, "utf-8") + const id = await fsExtra.readFile(file, "utf-8") if (UUID.check(id)) { return id } else { @@ -657,7 +660,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter const id = UUID.v5(randomBytes(4096), UUID.OID) this._logger.info(`Generated new staging user ID: ${id}`) try { - await outputFile(file, id) + await fsExtra.outputFile(file, id) } catch (e: any) { this._logger.warn(`Couldn't write out staging user ID: ${e}`) } @@ -736,7 +739,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter const downloadedUpdateHelper = await this.getOrCreateDownloadHelper() const cacheDir = downloadedUpdateHelper.cacheDirForPendingUpdate - await mkdir(cacheDir, { recursive: true }) + await fsExtra.mkdir(cacheDir, { recursive: true }) const updateFileName = getCacheUpdateFileName() let updateFile = path.join(cacheDir, updateFileName) const packageFile = packageInfo == null ? null : path.join(cacheDir, `package-${version}${path.extname(packageInfo.path) || ".7z"}`) @@ -748,8 +751,8 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter downloadedFile: updateFile, }) const currentBlockMapFile = path.join(cacheDir, "current.blockmap") - if (await pathExists(currentBlockMapFile)) { - await copyFile(currentBlockMapFile, path.join(downloadedUpdateHelper.cacheDir, "current.blockmap")) + if (await fsExtra.pathExists(currentBlockMapFile)) { + await fsExtra.copyFile(currentBlockMapFile, path.join(downloadedUpdateHelper.cacheDir, "current.blockmap")) } return packageFile == null ? [updateFile] : [updateFile, packageFile] } @@ -765,7 +768,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter await downloadedUpdateHelper.clear().catch(() => { // ignore }) - return await unlink(updateFile).catch(() => { + return await fsExtra.unlink(updateFile).catch(() => { // ignore }) } @@ -773,7 +776,7 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter const tempUpdateFile = await createTempUpdateFile(`temp-${updateFileName}`, cacheDir, log) try { await taskOptions.task(tempUpdateFile, downloadOptions, packageFile, removeFileIfAny) - await retry(() => rename(tempUpdateFile, updateFile), { + await retry(() => fsExtra.rename(tempUpdateFile, updateFile), { retries: 60, interval: 500, shouldRetry: (error: Error) => { @@ -850,14 +853,14 @@ export abstract class AppUpdater extends (EventEmitter as new () => TypedEmitter const saveBlockMapToCacheDir = async (blockMapData: BlockMap, cacheDir: string) => { const blockMapFile = path.join(cacheDir, "current.blockmap") - await outputFile(blockMapFile, gzipSync(JSON.stringify(blockMapData))) + await fsExtra.outputFile(blockMapFile, gzipSync(JSON.stringify(blockMapData))) } const getBlockMapFromCacheDir = async (cacheDir: string) => { const blockMapFile = path.join(cacheDir, "current.blockmap") try { - if (await pathExists(blockMapFile)) { - return JSON.parse(gunzipSync(await readFile(blockMapFile)).toString()) + if (await fsExtra.pathExists(blockMapFile)) { + return JSON.parse(gunzipSync(await fsExtra.readFile(blockMapFile)).toString()) } } catch (e: any) { this._logger.warn(`Cannot parse blockmap "${blockMapFile}", error: ${e}`) diff --git a/packages/electron-updater/src/BaseUpdater.ts b/packages/electron-updater/src/BaseUpdater.ts index f8fc13964aa..ef118136d89 100644 --- a/packages/electron-updater/src/BaseUpdater.ts +++ b/packages/electron-updater/src/BaseUpdater.ts @@ -1,7 +1,10 @@ +import { createRequire } from "node:module" import { AllPublishOptions } from "builder-util-runtime" + +const require = createRequire(import.meta.url) import { spawn, SpawnOptions, spawnSync, StdioOptions } from "child_process" -import { AppAdapter } from "./AppAdapter" -import { AppUpdater, DownloadExecutorTask } from "./AppUpdater" +import { AppAdapter } from "./AppAdapter.js" +import { AppUpdater, DownloadExecutorTask } from "./AppUpdater.js" export abstract class BaseUpdater extends AppUpdater { protected quitAndInstallCalled = false diff --git a/packages/electron-updater/src/DebUpdater.ts b/packages/electron-updater/src/DebUpdater.ts index c3512c8f72e..9c0d537af3b 100644 --- a/packages/electron-updater/src/DebUpdater.ts +++ b/packages/electron-updater/src/DebUpdater.ts @@ -1,10 +1,10 @@ import { AllPublishOptions } from "builder-util-runtime" -import { AppAdapter } from "./AppAdapter" -import { DownloadUpdateOptions } from "./AppUpdater" -import { InstallOptions } from "./BaseUpdater" -import { findFile } from "./providers/Provider" -import { DOWNLOAD_PROGRESS, Logger } from "./types" -import { LinuxUpdater } from "./LinuxUpdater" +import { AppAdapter } from "./AppAdapter.js" +import { DownloadUpdateOptions } from "./AppUpdater.js" +import { InstallOptions } from "./BaseUpdater.js" +import { findFile } from "./providers/Provider.js" +import { DOWNLOAD_PROGRESS, Logger } from "./types.js" +import { LinuxUpdater } from "./LinuxUpdater.js" export class DebUpdater extends LinuxUpdater { constructor(options?: AllPublishOptions | null, app?: AppAdapter) { diff --git a/packages/electron-updater/src/DownloadedUpdateHelper.ts b/packages/electron-updater/src/DownloadedUpdateHelper.ts index c032d790892..414a0ac7d20 100644 --- a/packages/electron-updater/src/DownloadedUpdateHelper.ts +++ b/packages/electron-updater/src/DownloadedUpdateHelper.ts @@ -1,11 +1,10 @@ import { UpdateInfo } from "builder-util-runtime" import { createHash } from "crypto" import { createReadStream } from "fs" -// @ts-ignore -import * as isEqual from "lodash.isequal" -import { ResolvedUpdateFileInfo } from "./types" -import { Logger } from "./types" -import { pathExists, readJson, emptyDir, outputJson, unlink } from "fs-extra" +import isEqual from "lodash.isequal" +import { ResolvedUpdateFileInfo } from "./types.js" +import { Logger } from "./types.js" +import fsExtra from "fs-extra" import * as path from "path" /** @private **/ @@ -39,7 +38,7 @@ export class DownloadedUpdateHelper { if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) { // update has already been downloaded from this running instance // check here only existence, not checksum - if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) { + if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await fsExtra.pathExists(updateFile))) { return updateFile } else { return null @@ -75,7 +74,7 @@ export class DownloadedUpdateHelper { } if (isSaveCache) { - await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo) + await fsExtra.outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo) } } @@ -90,7 +89,7 @@ export class DownloadedUpdateHelper { private async cleanCacheDirForPendingUpdate(): Promise { try { // remove stale data - await emptyDir(this.cacheDirForPendingUpdate) + await fsExtra.emptyDir(this.cacheDirForPendingUpdate) } catch (_ignore) { // ignore } @@ -104,14 +103,14 @@ export class DownloadedUpdateHelper { private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise { const updateInfoFilePath: string = this.getUpdateInfoFile() - const doesUpdateInfoFileExist = await pathExists(updateInfoFilePath) + const doesUpdateInfoFileExist = await fsExtra.pathExists(updateInfoFilePath) if (!doesUpdateInfoFileExist) { return null } let cachedInfo: CachedUpdateInfo try { - cachedInfo = await readJson(updateInfoFilePath) + cachedInfo = await fsExtra.readJson(updateInfoFilePath) } catch (error: any) { let message = `No cached update info available` if (error.code !== "ENOENT") { @@ -138,7 +137,7 @@ export class DownloadedUpdateHelper { } const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName) - if (!(await pathExists(updateFile))) { + if (!(await fsExtra.pathExists(updateFile))) { logger.info("Cached update file doesn't exist") return null } @@ -185,7 +184,7 @@ export async function createTempUpdateFile(name: string, cacheDir: string, log: let result = path.join(cacheDir, name) for (let i = 0; i < 3; i++) { try { - await unlink(result) + await fsExtra.unlink(result) return result } catch (e: any) { if (e.code === "ENOENT") { diff --git a/packages/electron-updater/src/ElectronAppAdapter.ts b/packages/electron-updater/src/ElectronAppAdapter.ts index a4480f8624f..4a4c0136971 100644 --- a/packages/electron-updater/src/ElectronAppAdapter.ts +++ b/packages/electron-updater/src/ElectronAppAdapter.ts @@ -1,5 +1,8 @@ +import { createRequire } from "node:module" import * as path from "path" -import { AppAdapter, getAppCacheDir } from "./AppAdapter" + +const require = createRequire(import.meta.url) +import { AppAdapter, getAppCacheDir } from "./AppAdapter.js" export class ElectronAppAdapter implements AppAdapter { constructor(private readonly app = require("electron").app) {} diff --git a/packages/electron-updater/src/LinuxUpdater.ts b/packages/electron-updater/src/LinuxUpdater.ts index 53a5eadf3a6..f2081c4f7f4 100644 --- a/packages/electron-updater/src/LinuxUpdater.ts +++ b/packages/electron-updater/src/LinuxUpdater.ts @@ -1,6 +1,6 @@ import { AllPublishOptions } from "builder-util-runtime" -import { AppAdapter } from "./AppAdapter" -import { BaseUpdater } from "./BaseUpdater" +import { AppAdapter } from "./AppAdapter.js" +import { BaseUpdater } from "./BaseUpdater.js" export abstract class LinuxUpdater extends BaseUpdater { constructor(options?: AllPublishOptions | null, app?: AppAdapter) { diff --git a/packages/electron-updater/src/MacUpdater.ts b/packages/electron-updater/src/MacUpdater.ts index 0a76b2a1701..cb4a7c445d6 100644 --- a/packages/electron-updater/src/MacUpdater.ts +++ b/packages/electron-updater/src/MacUpdater.ts @@ -1,13 +1,16 @@ +import { createRequire } from "node:module" import { AllPublishOptions, newError, safeStringifyJson } from "builder-util-runtime" -import { pathExistsSync, stat, copyFile } from "fs-extra" + +const require = createRequire(import.meta.url) +import fsExtra from "fs-extra" import { createReadStream } from "fs" import * as path from "path" import { createServer, IncomingMessage, Server, ServerResponse } from "http" -import { AppAdapter } from "./AppAdapter" -import { AppUpdater, DownloadUpdateOptions } from "./AppUpdater" -import { ResolvedUpdateFileInfo } from "./main" -import { UpdateDownloadedEvent } from "./types" -import { findFile } from "./providers/Provider" +import { AppAdapter } from "./AppAdapter.js" +import { AppUpdater, DownloadUpdateOptions } from "./AppUpdater.js" +import { ResolvedUpdateFileInfo } from "./types.js" +import { UpdateDownloadedEvent } from "./types.js" +import { findFile } from "./providers/Provider.js" import AutoUpdater = Electron.AutoUpdater import { execFileSync } from "child_process" import { randomBytes } from "crypto" @@ -103,7 +106,7 @@ export class MacUpdater extends AppUpdater { task: async (destinationFile, downloadOptions) => { const cachedUpdateFilePath = path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_MAC_APP_ZIP_FILE_NAME) const canDifferentialDownload = () => { - if (!pathExistsSync(cachedUpdateFilePath)) { + if (!fsExtra.pathExistsSync(cachedUpdateFilePath)) { log.info("Unable to locate previous update.zip for differential download (is this first install?), falling back to full download") return false } @@ -122,7 +125,7 @@ export class MacUpdater extends AppUpdater { if (!downloadUpdateOptions.disableDifferentialDownload) { try { const cachedUpdateFilePath = path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_MAC_APP_ZIP_FILE_NAME) - await copyFile(event.downloadedFile, cachedUpdateFilePath) + await fsExtra.copyFile(event.downloadedFile, cachedUpdateFilePath) } catch (error: any) { this._logger.warn(`Unable to copy file for caching for future differential downloads: ${error.message}`) } @@ -134,7 +137,7 @@ export class MacUpdater extends AppUpdater { private async updateDownloaded(zipFileInfo: ResolvedUpdateFileInfo, event: UpdateDownloadedEvent): Promise> { const downloadedFile = event.downloadedFile - const updateFileSize = zipFileInfo.info.size ?? (await stat(downloadedFile)).size + const updateFileSize = zipFileInfo.info.size ?? (await fsExtra.stat(downloadedFile)).size const log = this._logger const logContext = `fileToProxy=${zipFileInfo.url.href}` diff --git a/packages/electron-updater/src/NsisUpdater.ts b/packages/electron-updater/src/NsisUpdater.ts index ada9e9ed7ba..1b64e702ddb 100644 --- a/packages/electron-updater/src/NsisUpdater.ts +++ b/packages/electron-updater/src/NsisUpdater.ts @@ -1,17 +1,20 @@ +import { createRequire } from "node:module" import { AllPublishOptions, newError, PackageFileInfo, CURRENT_APP_INSTALLER_FILE_NAME, CURRENT_APP_PACKAGE_FILE_NAME } from "builder-util-runtime" import * as path from "path" -import { AppAdapter } from "./AppAdapter" -import { DownloadUpdateOptions } from "./AppUpdater" -import { BaseUpdater, InstallOptions } from "./BaseUpdater" -import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader" -import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader" -import { DOWNLOAD_PROGRESS } from "./types" -import { VerifyUpdateCodeSignature } from "./main" -import { findFile, Provider } from "./providers/Provider" -import { unlink } from "fs-extra" -import { verifySignature } from "./windowsExecutableCodeSignatureVerifier" +import { AppAdapter } from "./AppAdapter.js" +import { DownloadUpdateOptions } from "./AppUpdater.js" +import { BaseUpdater, InstallOptions } from "./BaseUpdater.js" +import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader.js" +import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js" +import { DOWNLOAD_PROGRESS } from "./types.js" +import { VerifyUpdateCodeSignature } from "./index.js" +import { findFile, Provider } from "./providers/Provider.js" +import fsExtra from "fs-extra" +import { verifySignature } from "./windowsExecutableCodeSignatureVerifier.js" import { URL } from "url" +const require = createRequire(import.meta.url) + export class NsisUpdater extends BaseUpdater { /** * Specify custom install directory path @@ -90,7 +93,7 @@ export class NsisUpdater extends BaseUpdater { }) } catch (e: any) { try { - await unlink(packageFile) + await fsExtra.unlink(packageFile) } catch (_ignored) { // ignore } diff --git a/packages/electron-updater/src/PacmanUpdater.ts b/packages/electron-updater/src/PacmanUpdater.ts index c329c8a9e86..8c3b5b6f1b1 100644 --- a/packages/electron-updater/src/PacmanUpdater.ts +++ b/packages/electron-updater/src/PacmanUpdater.ts @@ -1,10 +1,10 @@ import { AllPublishOptions } from "builder-util-runtime" -import { AppAdapter } from "./AppAdapter" -import { DownloadUpdateOptions } from "./AppUpdater" -import { InstallOptions } from "./BaseUpdater" -import { DOWNLOAD_PROGRESS, Logger } from "./types" -import { findFile } from "./providers/Provider" -import { LinuxUpdater } from "./LinuxUpdater" +import { AppAdapter } from "./AppAdapter.js" +import { DownloadUpdateOptions } from "./AppUpdater.js" +import { InstallOptions } from "./BaseUpdater.js" +import { DOWNLOAD_PROGRESS, Logger } from "./types.js" +import { findFile } from "./providers/Provider.js" +import { LinuxUpdater } from "./LinuxUpdater.js" export class PacmanUpdater extends LinuxUpdater { constructor(options?: AllPublishOptions | null, app?: AppAdapter) { diff --git a/packages/electron-updater/src/RpmUpdater.ts b/packages/electron-updater/src/RpmUpdater.ts index eb2b360ed5e..3df356a8a71 100644 --- a/packages/electron-updater/src/RpmUpdater.ts +++ b/packages/electron-updater/src/RpmUpdater.ts @@ -1,10 +1,10 @@ import { AllPublishOptions } from "builder-util-runtime" -import { AppAdapter } from "./AppAdapter" -import { DownloadUpdateOptions } from "./AppUpdater" -import { InstallOptions } from "./BaseUpdater" -import { DOWNLOAD_PROGRESS, Logger } from "./types" -import { findFile } from "./providers/Provider" -import { LinuxUpdater } from "./LinuxUpdater" +import { AppAdapter } from "./AppAdapter.js" +import { DownloadUpdateOptions } from "./AppUpdater.js" +import { InstallOptions } from "./BaseUpdater.js" +import { DOWNLOAD_PROGRESS, Logger } from "./types.js" +import { findFile } from "./providers/Provider.js" +import { LinuxUpdater } from "./LinuxUpdater.js" export class RpmUpdater extends LinuxUpdater { constructor(options?: AllPublishOptions | null, app?: AppAdapter) { diff --git a/packages/electron-updater/src/differentialDownloader/DataSplitter.ts b/packages/electron-updater/src/differentialDownloader/DataSplitter.ts index 326c9ea0ed9..23faabb90bc 100644 --- a/packages/electron-updater/src/differentialDownloader/DataSplitter.ts +++ b/packages/electron-updater/src/differentialDownloader/DataSplitter.ts @@ -1,8 +1,8 @@ import { newError } from "builder-util-runtime" import { createReadStream } from "fs" import { Writable } from "stream" -import { Operation, OperationKind } from "./downloadPlanBuilder" -import { ProgressInfo } from "./ProgressDifferentialDownloadCallbackTransform" +import { Operation, OperationKind } from "./downloadPlanBuilder.js" +import { ProgressInfo } from "./ProgressDifferentialDownloadCallbackTransform.js" const DOUBLE_CRLF = Buffer.from("\r\n\r\n") diff --git a/packages/electron-updater/src/differentialDownloader/DifferentialDownloader.ts b/packages/electron-updater/src/differentialDownloader/DifferentialDownloader.ts index d62c0ddf73c..15b9d20e168 100644 --- a/packages/electron-updater/src/differentialDownloader/DifferentialDownloader.ts +++ b/packages/electron-updater/src/differentialDownloader/DifferentialDownloader.ts @@ -1,15 +1,15 @@ import { BlockMapDataHolder, createHttpError, DigestTransform, HttpExecutor, configureRequestUrl, configureRequestOptions } from "builder-util-runtime" -import { BlockMap } from "builder-util-runtime/out/blockMapApi" -import { close, open } from "fs-extra" +import { BlockMap } from "builder-util-runtime" +import fsExtra from "fs-extra" import { createWriteStream } from "fs" import { OutgoingHttpHeaders, RequestOptions } from "http" import { ProgressInfo, CancellationToken } from "builder-util-runtime" -import { Logger } from "../types" -import { copyData } from "./DataSplitter" +import { Logger } from "../types.js" +import { copyData } from "./DataSplitter.js" import { URL } from "url" -import { computeOperations, Operation, OperationKind } from "./downloadPlanBuilder" -import { checkIsRangesSupported, executeTasksUsingMultipleRangeRequests } from "./multipleRangeDownloader" -import { ProgressDifferentialDownloadCallbackTransform, ProgressDifferentialDownloadInfo } from "./ProgressDifferentialDownloadCallbackTransform" +import { computeOperations, Operation, OperationKind } from "./downloadPlanBuilder.js" +import { checkIsRangesSupported, executeTasksUsingMultipleRangeRequests } from "./multipleRangeDownloader.js" +import { ProgressDifferentialDownloadCallbackTransform, ProgressDifferentialDownloadInfo } from "./ProgressDifferentialDownloadCallbackTransform.js" export interface DifferentialDownloaderOptions { readonly oldFile: string @@ -90,7 +90,7 @@ export abstract class DifferentialDownloader { const closeFiles = (): Promise> => { return Promise.all( fdList.map(openedFile => { - return close(openedFile.descriptor).catch((e: any) => { + return fsExtra.close(openedFile.descriptor).catch((e: any) => { this.logger.error(`cannot close file "${openedFile.path}": ${e}`) }) }) @@ -121,9 +121,9 @@ export abstract class DifferentialDownloader { } private async doDownloadFile(tasks: Array, fdList: Array): Promise { - const oldFileFd = await open(this.options.oldFile, "r") + const oldFileFd = await fsExtra.open(this.options.oldFile, "r") fdList.push({ descriptor: oldFileFd, path: this.options.oldFile }) - const newFileFd = await open(this.options.newFile, "w") + const newFileFd = await fsExtra.open(this.options.newFile, "w") fdList.push({ descriptor: newFileFd, path: this.options.newFile }) const fileOut = createWriteStream(this.options.newFile, { fd: newFileFd }) await new Promise((resolve, reject) => { diff --git a/packages/electron-updater/src/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.ts b/packages/electron-updater/src/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.ts index d4446db1d7a..e842403c7c1 100644 --- a/packages/electron-updater/src/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.ts +++ b/packages/electron-updater/src/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.ts @@ -1,6 +1,6 @@ -import { BlockMap } from "builder-util-runtime/out/blockMapApi" -import { close, fstat, open, read } from "fs-extra" -import { DifferentialDownloader } from "./DifferentialDownloader" +import { BlockMap } from "builder-util-runtime" +import fsExtra from "fs-extra" +import { DifferentialDownloader } from "./DifferentialDownloader.js" import { inflateRawSync } from "zlib" export class FileWithEmbeddedBlockMapDifferentialDownloader extends DifferentialDownloader { @@ -19,19 +19,19 @@ function readBlockMap(data: Buffer): BlockMap { } async function readEmbeddedBlockMapData(file: string): Promise { - const fd = await open(file, "r") + const fd = await fsExtra.open(file, "r") try { - const fileSize = (await fstat(fd)).size + const fileSize = (await fsExtra.fstat(fd)).size const sizeBuffer = Buffer.allocUnsafe(4) - await read(fd, sizeBuffer, 0, sizeBuffer.length, fileSize - sizeBuffer.length) + await fsExtra.read(fd, sizeBuffer, 0, sizeBuffer.length, fileSize - sizeBuffer.length) const dataBuffer = Buffer.allocUnsafe(sizeBuffer.readUInt32BE(0)) - await read(fd, dataBuffer, 0, dataBuffer.length, fileSize - sizeBuffer.length - dataBuffer.length) - await close(fd) + await fsExtra.read(fd, dataBuffer, 0, dataBuffer.length, fileSize - sizeBuffer.length - dataBuffer.length) + await fsExtra.close(fd) return readBlockMap(dataBuffer) } catch (e: any) { - await close(fd) + await fsExtra.close(fd) throw e } } diff --git a/packages/electron-updater/src/differentialDownloader/GenericDifferentialDownloader.ts b/packages/electron-updater/src/differentialDownloader/GenericDifferentialDownloader.ts index b7727d6c564..fc4f73c613a 100644 --- a/packages/electron-updater/src/differentialDownloader/GenericDifferentialDownloader.ts +++ b/packages/electron-updater/src/differentialDownloader/GenericDifferentialDownloader.ts @@ -1,5 +1,5 @@ -import { BlockMap } from "builder-util-runtime/out/blockMapApi" -import { DifferentialDownloader } from "./DifferentialDownloader" +import { BlockMap } from "builder-util-runtime" +import { DifferentialDownloader } from "./DifferentialDownloader.js" export class GenericDifferentialDownloader extends DifferentialDownloader { download(oldBlockMap: BlockMap, newBlockMap: BlockMap): Promise { diff --git a/packages/electron-updater/src/differentialDownloader/downloadPlanBuilder.ts b/packages/electron-updater/src/differentialDownloader/downloadPlanBuilder.ts index 7a7c1612c0a..76c74c36566 100644 --- a/packages/electron-updater/src/differentialDownloader/downloadPlanBuilder.ts +++ b/packages/electron-updater/src/differentialDownloader/downloadPlanBuilder.ts @@ -1,5 +1,6 @@ -import { BlockMap, BlockMapFile } from "builder-util-runtime/out/blockMapApi" -import { Logger } from "../types" +import { BlockMap } from "builder-util-runtime" +import { BlockMapFile } from "builder-util-runtime/internal" +import { Logger } from "../types.js" export enum OperationKind { COPY, diff --git a/packages/electron-updater/src/differentialDownloader/multipleRangeDownloader.ts b/packages/electron-updater/src/differentialDownloader/multipleRangeDownloader.ts index fe72f15dcfe..cad44191223 100644 --- a/packages/electron-updater/src/differentialDownloader/multipleRangeDownloader.ts +++ b/packages/electron-updater/src/differentialDownloader/multipleRangeDownloader.ts @@ -1,9 +1,9 @@ import { createHttpError, safeGetHeader } from "builder-util-runtime" import { IncomingMessage } from "http" import { Writable } from "stream" -import { copyData, DataSplitter, PartListDataTask } from "./DataSplitter" -import { DifferentialDownloader } from "./DifferentialDownloader" -import { Operation, OperationKind } from "./downloadPlanBuilder" +import { copyData, DataSplitter, PartListDataTask } from "./DataSplitter.js" +import { DifferentialDownloader } from "./DifferentialDownloader.js" +import { Operation, OperationKind } from "./downloadPlanBuilder.js" export function executeTasksUsingMultipleRangeRequests( differentialDownloader: DifferentialDownloader, diff --git a/packages/electron-updater/src/electronHttpExecutor.ts b/packages/electron-updater/src/electronHttpExecutor.ts index 298db362a62..c4228ebd6e1 100644 --- a/packages/electron-updater/src/electronHttpExecutor.ts +++ b/packages/electron-updater/src/electronHttpExecutor.ts @@ -1,4 +1,7 @@ +import { createRequire } from "node:module" import { DownloadOptions, HttpExecutor, configureRequestOptions, configureRequestUrl } from "builder-util-runtime" + +const require = createRequire(import.meta.url) import type { AuthInfo } from "electron" import { RequestOptions } from "http" import Session = Electron.Session diff --git a/packages/electron-updater/src/index.ts b/packages/electron-updater/src/index.ts new file mode 100644 index 00000000000..f1b9f05979d --- /dev/null +++ b/packages/electron-updater/src/index.ts @@ -0,0 +1,91 @@ +import fsExtra from "fs-extra" +import { createRequire } from "module" +import * as path from "path" +import { AppUpdater } from "./AppUpdater.js" + +const require = createRequire(import.meta.url) + +import { UpdateInfo } from "builder-util-runtime" + +export { AppImageUpdater } from "./AppImageUpdater.js" +export { BaseUpdater } from "./BaseUpdater.js" +export { DebUpdater } from "./DebUpdater.js" +export { MacUpdater } from "./MacUpdater.js" +export { NsisUpdater } from "./NsisUpdater.js" +export { PacmanUpdater } from "./PacmanUpdater.js" +export { BitbucketProvider } from "./providers/BitbucketProvider.js" +export { GitHubProvider } from "./providers/GitHubProvider.js" +export { GitLabProvider } from "./providers/GitLabProvider.js" +export { KeygenProvider } from "./providers/KeygenProvider.js" +export { PrivateGitHubProvider } from "./providers/PrivateGitHubProvider.js" +export { ProviderRuntimeOptions } from "./providers/Provider.js" +export { RpmUpdater } from "./RpmUpdater.js" +export { AppUpdater } + +export { Provider } from "./providers/Provider.js" + +export * from "./types.js" + +function doLoadAutoUpdater(): AppUpdater { + let updater: any + if (process.platform === "win32") { + updater = new (require("./NsisUpdater.js").NsisUpdater)() + } else if (process.platform === "darwin") { + updater = new (require("./MacUpdater.js").MacUpdater)() + } else { + updater = new (require("./AppImageUpdater.js").AppImageUpdater)() + try { + const identity = path.join(process.resourcesPath, "package-type") + if (!fsExtra.existsSync(identity)) { + return updater + } + const fileType = fsExtra.readFileSync(identity).toString().trim() + switch (fileType) { + case "deb": + updater = new (require("./DebUpdater.js").DebUpdater)() + break + case "rpm": + updater = new (require("./RpmUpdater.js").RpmUpdater)() + break + case "pacman": + updater = new (require("./PacmanUpdater.js").PacmanUpdater)() + break + default: + break + } + } catch (error: any) { + console.warn( + "Unable to detect 'package-type' for autoUpdater (rpm/deb/pacman support). If you'd like to expand support, please consider contributing to electron-builder", + error.message + ) + } + } + return updater +} + +let _autoUpdater: AppUpdater | undefined + +export const autoUpdater: AppUpdater = new Proxy({} as AppUpdater, { + get(_target, prop) { + if (_autoUpdater === undefined) { + _autoUpdater = doLoadAutoUpdater() + } + const value = (_autoUpdater as any)[prop] + return typeof value === "function" ? value.bind(_autoUpdater) : value + }, + set(_target, prop, value) { + if (_autoUpdater === undefined) { + _autoUpdater = doLoadAutoUpdater() + } + ;(_autoUpdater as any)[prop] = value + return true + }, +}) + +/** + * return null if verify signature succeed + * return error message if verify signature failed + */ +export type VerifyUpdateCodeSignature = (publisherName: string[], path: string) => Promise + +export type VerifyUpdateSupport = (updateInfo: UpdateInfo) => boolean | Promise diff --git a/packages/electron-updater/src/indexInternal.ts b/packages/electron-updater/src/indexInternal.ts new file mode 100644 index 00000000000..89dced1c39d --- /dev/null +++ b/packages/electron-updater/src/indexInternal.ts @@ -0,0 +1,5 @@ +export { ElectronAppAdapter } from "./ElectronAppAdapter.js" +export { TestOnlyUpdaterOptions } from "./AppUpdater.js" +export { NoOpLogger } from "./AppUpdater.js" + +export * as utils from "./util.js" diff --git a/packages/electron-updater/src/main.ts b/packages/electron-updater/src/main.ts deleted file mode 100644 index 49f850f69bc..00000000000 --- a/packages/electron-updater/src/main.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { existsSync, readFileSync } from "fs-extra" -import * as path from "path" -import { AppUpdater } from "./AppUpdater" -import { UpdateInfo } from "builder-util-runtime" - -export { BaseUpdater } from "./BaseUpdater" -export { AppUpdater, NoOpLogger } from "./AppUpdater" -export { Provider } from "./providers/Provider" -export { AppImageUpdater } from "./AppImageUpdater" -export { DebUpdater } from "./DebUpdater" -export { PacmanUpdater } from "./PacmanUpdater" -export { RpmUpdater } from "./RpmUpdater" -export { MacUpdater } from "./MacUpdater" -export { NsisUpdater } from "./NsisUpdater" - -export * from "./types" - -// autoUpdater to mimic electron bundled autoUpdater -let _autoUpdater: any - -// required for jsdoc -export declare const autoUpdater: AppUpdater - -function doLoadAutoUpdater(): AppUpdater { - // tslint:disable:prefer-conditional-expression - if (process.platform === "win32") { - _autoUpdater = new (require("./NsisUpdater").NsisUpdater)() - } else if (process.platform === "darwin") { - _autoUpdater = new (require("./MacUpdater").MacUpdater)() - } else { - _autoUpdater = new (require("./AppImageUpdater").AppImageUpdater)() - try { - const identity = path.join(process.resourcesPath, "package-type") - if (!existsSync(identity)) { - return _autoUpdater - } - const fileType = readFileSync(identity).toString().trim() - switch (fileType) { - case "deb": - _autoUpdater = new (require("./DebUpdater").DebUpdater)() - break - case "rpm": - _autoUpdater = new (require("./RpmUpdater").RpmUpdater)() - break - case "pacman": - _autoUpdater = new (require("./PacmanUpdater").PacmanUpdater)() - break - default: - break - } - } catch (error: any) { - console.warn( - "Unable to detect 'package-type' for autoUpdater (rpm/deb/pacman support). If you'd like to expand support, please consider contributing to electron-builder", - error.message - ) - } - } - return _autoUpdater -} - -Object.defineProperty(exports, "autoUpdater", { - enumerable: true, - get: () => { - return _autoUpdater || doLoadAutoUpdater() - }, -}) - -/** - * return null if verify signature succeed - * return error message if verify signature failed - */ -export type VerifyUpdateCodeSignature = (publisherName: string[], path: string) => Promise - -export type VerifyUpdateSupport = (updateInfo: UpdateInfo) => boolean | Promise diff --git a/packages/electron-updater/src/providerFactory.ts b/packages/electron-updater/src/providerFactory.ts index 8f1e35a4c4d..91f13e17b75 100644 --- a/packages/electron-updater/src/providerFactory.ts +++ b/packages/electron-updater/src/providerFactory.ts @@ -11,14 +11,14 @@ import { newError, PublishConfiguration, } from "builder-util-runtime" -import { AppUpdater } from "./AppUpdater" -import { BitbucketProvider } from "./providers/BitbucketProvider" -import { GenericProvider } from "./providers/GenericProvider" -import { GitHubProvider } from "./providers/GitHubProvider" -import { GitLabProvider } from "./providers/GitLabProvider" -import { KeygenProvider } from "./providers/KeygenProvider" -import { PrivateGitHubProvider } from "./providers/PrivateGitHubProvider" -import { Provider, ProviderRuntimeOptions } from "./providers/Provider" +import { AppUpdater } from "./AppUpdater.js" +import { BitbucketProvider } from "./providers/BitbucketProvider.js" +import { GenericProvider } from "./providers/GenericProvider.js" +import { GitHubProvider } from "./providers/GitHubProvider.js" +import { GitLabProvider } from "./providers/GitLabProvider.js" +import { KeygenProvider } from "./providers/KeygenProvider.js" +import { PrivateGitHubProvider } from "./providers/PrivateGitHubProvider.js" +import { Provider, ProviderRuntimeOptions } from "./providers/Provider.js" export function isUrlProbablySupportMultiRangeRequests(url: string): boolean { return !url.includes("s3.amazonaws.com") diff --git a/packages/electron-updater/src/providers/BitbucketProvider.ts b/packages/electron-updater/src/providers/BitbucketProvider.ts index 824a5fca77f..d36e7d797de 100644 --- a/packages/electron-updater/src/providers/BitbucketProvider.ts +++ b/packages/electron-updater/src/providers/BitbucketProvider.ts @@ -1,8 +1,8 @@ import { CancellationToken, BitbucketOptions, newError, UpdateInfo } from "builder-util-runtime" -import { AppUpdater } from "../AppUpdater" -import { ResolvedUpdateFileInfo } from "../types" -import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util" -import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider" +import { AppUpdater } from "../AppUpdater.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util.js" +import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider.js" export class BitbucketProvider extends Provider { private readonly baseUrl: URL diff --git a/packages/electron-updater/src/providers/GenericProvider.ts b/packages/electron-updater/src/providers/GenericProvider.ts index b5a23d0013c..1e32ccba297 100644 --- a/packages/electron-updater/src/providers/GenericProvider.ts +++ b/packages/electron-updater/src/providers/GenericProvider.ts @@ -1,11 +1,11 @@ import { GenericServerOptions, HttpError, newError, UpdateInfo } from "builder-util-runtime" -import { AppUpdater } from "../AppUpdater" -import { ResolvedUpdateFileInfo } from "../types" -import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util" -import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider" +import { AppUpdater } from "../AppUpdater.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util.js" +import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider.js" export class GenericProvider extends Provider { - private readonly baseUrl = newBaseUrl(this.configuration.url) + private readonly baseUrl: URL constructor( private readonly configuration: GenericServerOptions, @@ -13,6 +13,7 @@ export class GenericProvider extends Provider { runtimeOptions: ProviderRuntimeOptions ) { super(runtimeOptions) + this.baseUrl = newBaseUrl(this.configuration.url) } private get channel(): string { diff --git a/packages/electron-updater/src/providers/GitHubProvider.ts b/packages/electron-updater/src/providers/GitHubProvider.ts index 4535384718a..ae506f4a018 100644 --- a/packages/electron-updater/src/providers/GitHubProvider.ts +++ b/packages/electron-updater/src/providers/GitHubProvider.ts @@ -1,10 +1,10 @@ import { CancellationToken, GithubOptions, githubUrl, HttpError, newError, parseXml, ReleaseNoteInfo, UpdateInfo, XElement } from "builder-util-runtime" import * as semver from "semver" import { URL } from "url" -import { AppUpdater } from "../AppUpdater" -import { ResolvedUpdateFileInfo } from "../types" -import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util" -import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider" +import { AppUpdater } from "../AppUpdater.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util.js" +import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider.js" const hrefRegExp = /\/tag\/([^/]+)$/ diff --git a/packages/electron-updater/src/providers/GitLabProvider.ts b/packages/electron-updater/src/providers/GitLabProvider.ts index 12fe2cac402..f001b43aff4 100644 --- a/packages/electron-updater/src/providers/GitLabProvider.ts +++ b/packages/electron-updater/src/providers/GitLabProvider.ts @@ -1,11 +1,10 @@ import { CancellationToken, GitlabOptions, HttpError, newError, UpdateFileInfo, UpdateInfo, GitlabReleaseInfo, GitlabReleaseAsset } from "builder-util-runtime" import { URL } from "url" -// @ts-ignore -import * as escapeRegExp from "lodash.escaperegexp" -import { AppUpdater } from "../AppUpdater" -import { ResolvedUpdateFileInfo } from "../types" -import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util" -import { getFileList, parseUpdateInfo, Provider, ProviderRuntimeOptions } from "./Provider" +import escapeRegExp from "lodash.escaperegexp" +import { AppUpdater } from "../AppUpdater.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util.js" +import { getFileList, parseUpdateInfo, Provider, ProviderRuntimeOptions } from "./Provider.js" interface GitlabUpdateInfo extends UpdateInfo { tag: string @@ -79,7 +78,10 @@ export class GitLabProvider extends Provider { try { latestRelease = JSON.parse(releaseResponse) } catch (e: any) { - throw newError(`Unable to parse latest release response from GitLab (${latestReleaseUrl}): response was not valid JSON: ${e.stack || e.message}`, "ERR_UPDATER_LATEST_VERSION_NOT_FOUND") + throw newError( + `Unable to parse latest release response from GitLab (${latestReleaseUrl}): response was not valid JSON: ${e.stack || e.message}`, + "ERR_UPDATER_LATEST_VERSION_NOT_FOUND" + ) } if (latestRelease.upcoming_release) { diff --git a/packages/electron-updater/src/providers/KeygenProvider.ts b/packages/electron-updater/src/providers/KeygenProvider.ts index 6842628a030..5007598e9a8 100644 --- a/packages/electron-updater/src/providers/KeygenProvider.ts +++ b/packages/electron-updater/src/providers/KeygenProvider.ts @@ -1,8 +1,8 @@ import { CancellationToken, KeygenOptions, newError, UpdateInfo } from "builder-util-runtime" -import { AppUpdater } from "../AppUpdater" -import { ResolvedUpdateFileInfo } from "../types" -import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util" -import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider" +import { AppUpdater } from "../AppUpdater.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util.js" +import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider.js" export class KeygenProvider extends Provider { private readonly defaultHostname = "api.keygen.sh" diff --git a/packages/electron-updater/src/providers/PrivateGitHubProvider.ts b/packages/electron-updater/src/providers/PrivateGitHubProvider.ts index f6c787f62ce..81316046d09 100644 --- a/packages/electron-updater/src/providers/PrivateGitHubProvider.ts +++ b/packages/electron-updater/src/providers/PrivateGitHubProvider.ts @@ -2,12 +2,12 @@ import { CancellationToken, GithubOptions, HttpError, newError, UpdateInfo } fro import { OutgoingHttpHeaders, RequestOptions } from "http" import { load } from "js-yaml" import * as path from "path" -import { AppUpdater } from "../AppUpdater" +import { AppUpdater } from "../AppUpdater.js" import { URL } from "url" -import { getChannelFilename, newUrlFromBase } from "../util" -import { BaseGitHubProvider } from "./GitHubProvider" -import { ResolvedUpdateFileInfo } from "../types" -import { getFileList, ProviderRuntimeOptions } from "./Provider" +import { getChannelFilename, newUrlFromBase } from "../util.js" +import { BaseGitHubProvider } from "./GitHubProvider.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { getFileList, ProviderRuntimeOptions } from "./Provider.js" export interface PrivateGitHubUpdateInfo extends UpdateInfo { assets: Array diff --git a/packages/electron-updater/src/providers/Provider.ts b/packages/electron-updater/src/providers/Provider.ts index 4d247325b33..23b073fd1fe 100644 --- a/packages/electron-updater/src/providers/Provider.ts +++ b/packages/electron-updater/src/providers/Provider.ts @@ -2,11 +2,10 @@ import { CancellationToken, configureRequestUrl, newError, safeStringifyJson, Up import { OutgoingHttpHeaders, RequestOptions } from "http" import { load } from "js-yaml" import { URL } from "url" -import { ElectronHttpExecutor } from "../electronHttpExecutor" -import { ResolvedUpdateFileInfo } from "../types" -import { newUrlFromBase } from "../util" -// @ts-ignore -import * as escapeRegExp from "lodash.escaperegexp" +import { ElectronHttpExecutor } from "../electronHttpExecutor.js" +import { ResolvedUpdateFileInfo } from "../types.js" +import { newUrlFromBase } from "../util.js" +import escapeRegExp from "lodash.escaperegexp" export type ProviderPlatform = "darwin" | "linux" | "win32" diff --git a/packages/electron-updater/src/types.ts b/packages/electron-updater/src/types.ts index d4e92de3c24..94a394c9827 100644 --- a/packages/electron-updater/src/types.ts +++ b/packages/electron-updater/src/types.ts @@ -1,7 +1,7 @@ import { CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo } from "builder-util-runtime" import { EventEmitter } from "events" import { URL } from "url" -import { LoginCallback } from "./electronHttpExecutor" +import { LoginCallback } from "./electronHttpExecutor.js" export { CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo } diff --git a/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts b/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts index f35f2aa88d3..e7f23c8f612 100644 --- a/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts +++ b/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts @@ -1,7 +1,7 @@ import { parseDn } from "builder-util-runtime" import { execFile, execFileSync, ExecFileOptions } from "child_process" import * as os from "os" -import { Logger } from "./types" +import { Logger } from "./types.js" import * as path from "path" function preparePowerShellExec(command: string, timeout?: number) { diff --git a/packages/electron-updater/tsconfig.json b/packages/electron-updater/tsconfig.json index c92cd864271..e569ae0df14 100644 --- a/packages/electron-updater/tsconfig.json +++ b/packages/electron-updater/tsconfig.json @@ -4,13 +4,6 @@ "outDir": "out", "rootDir": "src" }, - "jsdoc": { - "out": "../../scripts/jsdoc/out/updater", - "examples": "../../scripts/jsdoc/examples", - "access": "public" - }, - "files": [ - ], "include": [ "src/**/*.ts" ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 827510b3829..b40d7998cc5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ importers: '@stylistic/eslint-plugin': specifier: ^2.8.0 version: 2.13.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.2) + '@tsconfig/node22': + specifier: ^22.0.5 + version: 22.0.5 '@types/node': specifier: ^22.7.4 version: 22.13.17 @@ -72,17 +75,17 @@ importers: specifier: ^5.2.1 version: 5.5.4(eslint-config-prettier@9.1.2(eslint@9.39.2(jiti@2.4.2)))(eslint@9.39.2(jiti@2.4.2))(prettier@3.7.4) fs-extra: - specifier: 10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 is-ci: specifier: ^4.1.0 version: 4.1.0 prettier: specifier: 3.7.4 version: 3.7.4 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.13.17)(typescript@5.8.2) + tsx: + specifier: ^4.21.0 + version: 4.21.0 typedoc: specifier: ^0.26.7 version: 0.26.11(typescript@5.8.2) @@ -97,7 +100,7 @@ importers: version: 0.64.0 vitest: specifier: ^3.2.2 - version: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + version: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) packages/app-builder-lib: dependencies: @@ -128,9 +131,6 @@ importers: '@malept/flatpak-bundler': specifier: ^0.4.0 version: 0.4.0 - '@types/fs-extra': - specifier: 9.0.13 - version: 9.0.13 async-exit-hook: specifier: ^2.0.1 version: 2.0.1 @@ -162,8 +162,8 @@ importers: specifier: workspace:* version: link:../electron-publish fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 hosted-git-info: specifier: ^4.1.0 version: 4.1.0 @@ -273,6 +273,9 @@ importers: '@types/ejs': specifier: 3.1.0 version: 3.1.0 + '@types/fs-extra': + specifier: 9.0.13 + version: 9.0.13 '@types/hosted-git-info': specifier: 3.0.2 version: 3.0.2 @@ -309,9 +312,6 @@ importers: 7zip-bin: specifier: ~5.2.0 version: 5.2.0 - '@types/debug': - specifier: ^4.1.6 - version: 4.1.7 app-builder-bin: specifier: 5.0.0-alpha.12 version: 5.0.0-alpha.12 @@ -328,8 +328,8 @@ importers: specifier: ^4.3.4 version: 4.4.3 fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 http-proxy-agent: specifier: ^7.0.0 version: 7.0.2 @@ -358,6 +358,9 @@ importers: '@types/cross-spawn': specifier: 6.0.6 version: 6.0.6 + '@types/debug': + specifier: ^4.1.6 + version: 4.1.7 '@types/fs-extra': specifier: ^9.0.11 version: 9.0.13 @@ -396,8 +399,8 @@ importers: specifier: workspace:* version: link:../builder-util fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 iconv-lite: specifier: ^0.6.2 version: 0.6.3 @@ -439,9 +442,12 @@ importers: dmg-builder: specifier: workspace:* version: link:../dmg-builder + electron-publish: + specifier: workspace:* + version: link:../electron-publish fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 lazy-val: specifier: ^1.0.5 version: 1.0.5 @@ -471,9 +477,6 @@ importers: specifier: 5.4.0 version: 5.4.0 devDependencies: - '@types/archiver': - specifier: 5.3.1 - version: 5.3.1 '@types/fs-extra': specifier: 9.0.13 version: 9.0.13 @@ -504,9 +507,6 @@ importers: packages/electron-publish: dependencies: - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.13 builder-util: specifier: workspace:* version: link:../builder-util @@ -520,8 +520,8 @@ importers: specifier: ^4.0.5 version: 4.0.5 fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 lazy-val: specifier: ^1.0.5 version: 1.0.5 @@ -529,6 +529,9 @@ importers: specifier: ^2.5.2 version: 2.6.0 devDependencies: + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.13 '@types/mime': specifier: 2.0.3 version: 2.0.3 @@ -539,8 +542,8 @@ importers: specifier: workspace:* version: link:../builder-util-runtime fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 js-yaml: specifier: ^4.1.0 version: 4.1.1 @@ -624,8 +627,8 @@ importers: specifier: 5.4.0 version: 5.4.0 fs-extra: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^11.3.4 + version: 11.3.4 js-yaml: specifier: ^4.1.0 version: 4.1.1 @@ -695,7 +698,7 @@ importers: version: 1.6.3 vitest: specifier: ^3.0.4 - version: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + version: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) vitest-mock-commonjs: specifier: ^1.0.2 version: 1.0.2 @@ -1668,150 +1671,306 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.2': resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.2': resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.2': resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.2': resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.2': resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.2': resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.2': resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.2': resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.2': resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.2': resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.2': resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.2': resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.2': resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.2': resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.2': resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.2': resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.2': resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.2': resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.2': resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.2': resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.2': resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.2': resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.2': resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.2': resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2255,12 +2414,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node22@22.0.5': + resolution: {integrity: sha512-hLf2ld+sYN/BtOJjHUWOk568dvjFQkHnLNa6zce25GIH+vxKfvTgm3qpaH6ToF5tu/NN0IH66s+Bb5wElHrLcw==} + '@types/adm-zip@0.5.6': resolution: {integrity: sha512-lRlcSLg5Yoo7C2H2AUiAoYlvifWoCx/se7iUNiCBTfEVVYFVn+Tr9ZGed4K73tYgLe9O4PjdJvbxlkdAOx/qiw==} - '@types/archiver@5.3.1': - resolution: {integrity: sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw==} - '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -2294,9 +2453,6 @@ packages: '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - '@types/glob@8.1.0': - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -2348,9 +2504,6 @@ packages: '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -3218,6 +3371,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3420,8 +3578,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -3475,6 +3633,9 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + git-raw-commits@5.0.0: resolution: {integrity: sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==} engines: {node: '>=18'} @@ -4456,6 +4617,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -4818,6 +4982,11 @@ packages: '@swc/wasm': optional: true + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6512,7 +6681,7 @@ snapshots: '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3 dir-compare: 4.2.0 - fs-extra: 11.3.0 + fs-extra: 11.3.4 minimatch: 9.0.5 plist: 3.1.0 transitivePeerDependencies: @@ -6522,7 +6691,7 @@ snapshots: dependencies: cross-dirname: 0.1.0 debug: 4.4.3 - fs-extra: 11.3.0 + fs-extra: 11.3.4 minimist: 1.2.8 postject: 1.0.0-alpha.6 transitivePeerDependencies: @@ -6532,78 +6701,156 @@ snapshots: '@esbuild/aix-ppc64@0.25.2': optional: true + '@esbuild/aix-ppc64@0.27.7': + optional: true + '@esbuild/android-arm64@0.25.2': optional: true + '@esbuild/android-arm64@0.27.7': + optional: true + '@esbuild/android-arm@0.25.2': optional: true + '@esbuild/android-arm@0.27.7': + optional: true + '@esbuild/android-x64@0.25.2': optional: true + '@esbuild/android-x64@0.27.7': + optional: true + '@esbuild/darwin-arm64@0.25.2': optional: true + '@esbuild/darwin-arm64@0.27.7': + optional: true + '@esbuild/darwin-x64@0.25.2': optional: true + '@esbuild/darwin-x64@0.27.7': + optional: true + '@esbuild/freebsd-arm64@0.25.2': optional: true + '@esbuild/freebsd-arm64@0.27.7': + optional: true + '@esbuild/freebsd-x64@0.25.2': optional: true + '@esbuild/freebsd-x64@0.27.7': + optional: true + '@esbuild/linux-arm64@0.25.2': optional: true + '@esbuild/linux-arm64@0.27.7': + optional: true + '@esbuild/linux-arm@0.25.2': optional: true + '@esbuild/linux-arm@0.27.7': + optional: true + '@esbuild/linux-ia32@0.25.2': optional: true + '@esbuild/linux-ia32@0.27.7': + optional: true + '@esbuild/linux-loong64@0.25.2': optional: true + '@esbuild/linux-loong64@0.27.7': + optional: true + '@esbuild/linux-mips64el@0.25.2': optional: true + '@esbuild/linux-mips64el@0.27.7': + optional: true + '@esbuild/linux-ppc64@0.25.2': optional: true + '@esbuild/linux-ppc64@0.27.7': + optional: true + '@esbuild/linux-riscv64@0.25.2': optional: true + '@esbuild/linux-riscv64@0.27.7': + optional: true + '@esbuild/linux-s390x@0.25.2': optional: true + '@esbuild/linux-s390x@0.27.7': + optional: true + '@esbuild/linux-x64@0.25.2': optional: true + '@esbuild/linux-x64@0.27.7': + optional: true + '@esbuild/netbsd-arm64@0.25.2': optional: true + '@esbuild/netbsd-arm64@0.27.7': + optional: true + '@esbuild/netbsd-x64@0.25.2': optional: true + '@esbuild/netbsd-x64@0.27.7': + optional: true + '@esbuild/openbsd-arm64@0.25.2': optional: true + '@esbuild/openbsd-arm64@0.27.7': + optional: true + '@esbuild/openbsd-x64@0.25.2': optional: true + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + '@esbuild/sunos-x64@0.25.2': optional: true + '@esbuild/sunos-x64@0.27.7': + optional: true + '@esbuild/win32-arm64@0.25.2': optional: true + '@esbuild/win32-arm64@0.27.7': + optional: true + '@esbuild/win32-ia32@0.25.2': optional: true + '@esbuild/win32-ia32@0.27.7': + optional: true + '@esbuild/win32-x64@0.25.2': optional: true + '@esbuild/win32-x64@0.27.7': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.4.2))': dependencies: eslint: 9.39.2(jiti@2.4.2) @@ -7043,14 +7290,12 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tsconfig/node22@22.0.5': {} + '@types/adm-zip@0.5.6': dependencies: '@types/node': 22.13.17 - '@types/archiver@5.3.1': - dependencies: - '@types/glob': 8.1.0 - '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 @@ -7089,11 +7334,6 @@ snapshots: dependencies: '@types/node': 22.13.17 - '@types/glob@8.1.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.13.17 - '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.13.17 @@ -7146,8 +7386,6 @@ snapshots: '@types/minimatch@3.0.5': {} - '@types/minimatch@5.1.2': {} - '@types/ms@2.1.0': {} '@types/node@12.20.55': {} @@ -7350,13 +7588,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1))': + '@vitest/mocker@3.2.4(vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) '@vitest/pretty-format@3.0.4': dependencies: @@ -7391,7 +7629,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + vitest: 3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) '@vitest/utils@3.0.4': dependencies: @@ -8163,6 +8401,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} escape-string-regexp@2.0.0: {} @@ -8392,7 +8659,7 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.0: + fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -8456,6 +8723,10 @@ snapshots: dependencies: pump: 3.0.2 + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0): dependencies: '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0) @@ -9500,6 +9771,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -9875,23 +10148,12 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@22.13.17)(typescript@5.8.2): + tsx@4.21.0: dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.17 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + optionalDependencies: + fsevents: 2.3.3 type-check@0.4.0: dependencies: @@ -9994,7 +10256,7 @@ snapshots: dependencies: bluebird: 3.7.2 duplexer2: 0.1.4 - fs-extra: 11.3.0 + fs-extra: 11.3.4 graceful-fs: 4.2.11 node-int64: 0.4.0 @@ -10035,13 +10297,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1): + vite-node@3.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -10056,7 +10318,7 @@ snapshots: - tsx - yaml - vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1): + vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1): dependencies: esbuild: 0.25.2 postcss: 8.5.3 @@ -10066,15 +10328,16 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 sass: 1.86.1 + tsx: 4.21.0 yaml: 2.7.1 vitest-mock-commonjs@1.0.2: {} - vitest@3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1): + vitest@3.2.4(@types/node@22.13.17)(@vitest/ui@3.0.4(vitest@3.2.4))(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1)) + '@vitest/mocker': 3.2.4(vite@6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -10092,8 +10355,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) - vite-node: 3.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(yaml@2.7.1) + vite: 6.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) + vite-node: 3.2.4(@types/node@22.13.17)(jiti@2.4.2)(sass@1.86.1)(tsx@4.21.0)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.17 diff --git a/scripts/fix-schema.js b/scripts/fix-schema.js deleted file mode 100644 index c0cd8c95c26..00000000000 --- a/scripts/fix-schema.js +++ /dev/null @@ -1,38 +0,0 @@ -const fs = require("fs") -const path = require("path") - -const schemaFile = path.join(__dirname, "../packages/app-builder-lib/scheme.json") -const schema = JSON.parse(fs.readFileSync(schemaFile, "utf-8")) - -let o = schema.definitions.PlugDescriptor.additionalProperties.anyOf[0] -delete o.typeof -o.type = "object" - -schema.definitions.OutgoingHttpHeaders.additionalProperties = { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": [ - "string", - "number" - ] - } - ] -} - -o = schema.definitions.SnapOptions.properties.environment.anyOf[0] = { - additionalProperties: { type: "string" }, - type: "object", -} - -o = schema.properties["$schema"] = { - "description": "JSON Schema for this document.", - "type": ["null", "string"], -} - -fs.writeFileSync(schemaFile, JSON.stringify(schema, null, 2)) diff --git a/scripts/generate-schema.ts b/scripts/generate-schema.ts index e19a289ea7d..9fa97720530 100644 --- a/scripts/generate-schema.ts +++ b/scripts/generate-schema.ts @@ -12,12 +12,13 @@ const compilerOptions: TJS.CompilerOptions = { baseUrl: rootDir, esModuleInterop: false, forceConsistentCasingInFileNames: true, - moduleResolution: TypeScript.ModuleResolutionKind.Node10, + moduleResolution: TypeScript.ModuleResolutionKind.Node10 as any, skipLibCheck: true, - strict: true, - noUnusedLocals: true, + // strict: true, + // noUnusedLocals: true, noFallthroughCasesInSwitch: true, - noImplicitReturns: true, + // noImplicitReturns: true, + noEmit: true, inlineSources: true, sourceMap: true, @@ -33,18 +34,22 @@ const compilerOptions: TJS.CompilerOptions = { "../typings", "../../typings", // - "../node_module/@types", - "node_module/@types" - ], + "../node_modules/@types", + "app-builder-lib/typings", + "node_modules/@types" + ].map(it => path.resolve(rootDir, it)), } // schema generator args const settings: TJS.PartialArgs = { required: true, + // ref: false, + // aliasRef: true, noExtraProps: true, typeOfKeyword: true, strictNullChecks: true, skipLibCheck: true, + ignoreErrors: true, } const definitionFile = path.resolve(rootDir, "app-builder-lib/src/configuration.ts") @@ -53,7 +58,7 @@ const generator = TJS.buildGenerator(program, settings) const schema = TJS.generateSchema(program, "Configuration", settings, [], generator!) const PlugDescriptor: any = schema!.definitions!.PlugDescriptor -PlugDescriptor.additionalProperties!.anyOf![0] = { +PlugDescriptor.additionalProperties = { type: "object", } @@ -73,7 +78,7 @@ OutgoingHttpHeaders.additionalProperties = { } const SnapOptions: any = schema!.definitions!.SnapOptions -SnapOptions.properties.environment!.anyOf![0] = { +SnapOptions.properties.environment = { additionalProperties: { type: "string" }, type: "object", } diff --git a/scripts/renderer/src/typedoc2html.ts b/scripts/renderer/src/typedoc2html.ts index 408724f19c5..31e405f6e67 100644 --- a/scripts/renderer/src/typedoc2html.ts +++ b/scripts/renderer/src/typedoc2html.ts @@ -1,4 +1,4 @@ -import { copy, exists } from "fs-extra" +import fsExtra from "fs-extra" import { rm } from "fs/promises" import * as path from "path" import * as process from "process" @@ -12,14 +12,14 @@ async function main() { console.log("copying from", origin, dest) const siteDir = path.resolve(process.cwd(), "site") - if (await exists(siteDir)) { + if (await fsExtra.exists(siteDir)) { await rm(siteDir, { recursive: true }) } - if (await exists(dest)) { + if (await fsExtra.exists(dest)) { await rm(dest, { recursive: true }) } - await copy(origin, dest) - await copy(path.resolve(process.cwd(), "./README.md"), path.resolve(dest, "README.md")) + await fsExtra.copy(origin, dest) + await fsExtra.copy(path.resolve(process.cwd(), "./README.md"), path.resolve(dest, "README.md")) const typedocConfig: Partial = { options: "typedoc.config.js", diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index 6f4fe18f1c3..a3a0b41bd67 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -3,9 +3,9 @@ "compilerOptions": { "outDir": "out", "noUnusedLocals": false, - "skipLibCheck": true + "skipLibCheck": true, + "declaration": false }, - "declaration": false, "include": [ "**/*.ts", ], diff --git a/test/package.json b/test/package.json index d9b521a2c35..7b25e7b26cf 100644 --- a/test/package.json +++ b/test/package.json @@ -1,6 +1,7 @@ { "name": "@electron-builder/test", "version": "0.0.0", + "type": "module", "private": true, "dependencies": { "@electron/osx-sign": "^1.0.4", @@ -17,7 +18,7 @@ "electron-publish": "workspace:*", "electron-updater": "workspace:*", "electron-winstaller": "5.4.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.3.4", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "path-sort": "^0.1.0", @@ -45,35 +46,5 @@ "vitest": "^3.0.4", "vitest-mock-commonjs": "^1.0.2", "which": "^5.0.0" - }, - "jest": { - "snapshotResolver": "/snapshotResolver.js", - "testEnvironment": "node", - "roots": [ - "src" - ], - "transformIgnorePatterns": [ - "./node_modules", - "../node_modules", - "../packages" - ], - "transform": { - "^.+\\.ts$": [ - "esbuild-jest", - { - "sourcemap": "inline", - "loaders": { - ".ts": "ts" - } - } - ] - }, - "testPathIgnorePatterns": [ - "[\\/]{1}helpers[\\/]{1}" - ], - "testRegex": "\\.[jt]s$", - "setupFilesAfterEnv": [ - "/jestSetup.js" - ] } } diff --git a/test/snapshots/updater/blackboxUpdateTest.js.snap b/test/snapshots/updater/blackboxUpdateTest.js.snap index 750f5b50236..b29c5aafd1b 100644 --- a/test/snapshots/updater/blackboxUpdateTest.js.snap +++ b/test/snapshots/updater/blackboxUpdateTest.js.snap @@ -1783,6 +1783,134 @@ exports[`linux > appimage tool: 1.0.2 > AppImage - arm64 2`] = ` } `; +exports[`linux > appimage tool: 1.0.3 > AppImage - arm64 1`] = ` +{ + "linux": [ + { + "arch": "arm64", + "file": "TestApp.AppImage", + "updateInfo": { + "blockMapSize": "@blockMapSize", + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-linux-arm64.yml", + "fileContent": { + "files": [ + { + "blockMapSize": "@blockMapSize", + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.AppImage", + }, + ], + "path": "TestApp.AppImage", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.0", + }, + }, + ], +} +`; + +exports[`linux > appimage tool: 1.0.3 > AppImage - arm64 2`] = ` +{ + "linux": [ + { + "arch": "arm64", + "file": "TestApp.AppImage", + "updateInfo": { + "blockMapSize": "@blockMapSize", + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-linux-arm64.yml", + "fileContent": { + "files": [ + { + "blockMapSize": "@blockMapSize", + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.AppImage", + }, + ], + "path": "TestApp.AppImage", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.1", + }, + }, + ], +} +`; + +exports[`linux > arch - (pacman) 1`] = ` +{ + "linux": [ + { + "file": "latest-linux.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.pacman", + }, + ], + "path": "TestApp.pacman", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.0", + }, + }, + { + "arch": "x64", + "file": "TestApp.pacman", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + ], +} +`; + +exports[`linux > arch - (pacman) 2`] = ` +{ + "linux": [ + { + "file": "latest-linux.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.pacman", + }, + ], + "path": "TestApp.pacman", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.1", + }, + }, + { + "arch": "x64", + "file": "TestApp.pacman", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + ], +} +`; + exports[`linux > debian - (apt) 1`] = ` { "linux": [ @@ -2563,11 +2691,11 @@ exports[`linux > fedora - (zypper) 2`] = ` } `; -exports[`mac > mac - universal 1`] = ` +exports[`mac > arm64 1`] = ` { "mac": [ { - "arch": "universal", + "arch": "arm64", "file": "TestApp.zip", "updateInfo": { "sha512": "@sha512", @@ -2602,7 +2730,7 @@ exports[`mac > mac - universal 1`] = ` } `; -exports[`mac > mac - universal 2`] = ` +exports[`mac > arm64 2`] = ` { "CFBundleDisplayName": "TestApp", "CFBundleExecutable": "TestApp", @@ -2650,11 +2778,11 @@ exports[`mac > mac - universal 2`] = ` } `; -exports[`mac > mac - universal 3`] = ` +exports[`mac > arm64 3`] = ` { "mac": [ { - "arch": "universal", + "arch": "arm64", "file": "TestApp.zip", "updateInfo": { "sha512": "@sha512", @@ -2689,7 +2817,7 @@ exports[`mac > mac - universal 3`] = ` } `; -exports[`mac > mac - universal 4`] = ` +exports[`mac > arm64 4`] = ` { "CFBundleDisplayName": "TestApp", "CFBundleExecutable": "TestApp", @@ -2737,11 +2865,11 @@ exports[`mac > mac - universal 4`] = ` } `; -exports[`mac > mac - x64 1`] = ` +exports[`mac > mac - universal 1`] = ` { "mac": [ { - "arch": "x64", + "arch": "universal", "file": "TestApp.zip", "updateInfo": { "sha512": "@sha512", @@ -2776,7 +2904,7 @@ exports[`mac > mac - x64 1`] = ` } `; -exports[`mac > mac - x64 2`] = ` +exports[`mac > mac - universal 2`] = ` { "CFBundleDisplayName": "TestApp", "CFBundleExecutable": "TestApp", @@ -2824,11 +2952,11 @@ exports[`mac > mac - x64 2`] = ` } `; -exports[`mac > mac - x64 3`] = ` +exports[`mac > mac - universal 3`] = ` { "mac": [ { - "arch": "x64", + "arch": "universal", "file": "TestApp.zip", "updateInfo": { "sha512": "@sha512", @@ -2863,7 +2991,529 @@ exports[`mac > mac - x64 3`] = ` } `; -exports[`mac > mac - x64 4`] = ` +exports[`mac > mac - universal 4`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.1", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > mac - x64 1`] = ` +{ + "mac": [ + { + "arch": "x64", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.0", + }, + }, + ], +} +`; + +exports[`mac > mac - x64 2`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.0", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > mac - x64 3`] = ` +{ + "mac": [ + { + "arch": "x64", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.1", + }, + }, + ], +} +`; + +exports[`mac > mac - x64 4`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.1", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > universal 1`] = ` +{ + "mac": [ + { + "arch": "universal", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.0", + }, + }, + ], +} +`; + +exports[`mac > universal 2`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.0", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > universal 3`] = ` +{ + "mac": [ + { + "arch": "universal", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.1", + }, + }, + ], +} +`; + +exports[`mac > universal 4`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.1", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > x64 1`] = ` +{ + "mac": [ + { + "arch": "x64", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.0", + }, + }, + ], +} +`; + +exports[`mac > x64 2`] = ` +{ + "CFBundleDisplayName": "TestApp", + "CFBundleExecutable": "TestApp", + "CFBundleIconFile": "icon.icns", + "CFBundleIdentifier": "com.test.app", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "TestApp", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0.0", + "ElectronAsarIntegrity": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "hash", + }, + }, + "LSApplicationCategoryType": "your.app.category.type", + "LSEnvironment": { + "MallocNanoZone": "0", + }, + "NSAppTransportSecurity": { + "NSAllowsLocalNetworking": true, + "NSExceptionDomains": { + "127.0.0.1": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + "localhost": { + "NSIncludesSubdomains": false, + "NSTemporaryExceptionAllowsInsecureHTTPLoads": true, + "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false, + "NSTemporaryExceptionMinimumTLSVersion": "1.0", + "NSTemporaryExceptionRequiresForwardSecrecy": false, + }, + }, + }, + "NSBluetoothAlwaysUsageDescription": "This app needs access to Bluetooth", + "NSBluetoothPeripheralUsageDescription": "This app needs access to Bluetooth", + "NSHighResolutionCapable": true, + "NSPrefersDisplaySafeAreaCompatibilityMode": false, + "NSPrincipalClass": "AtomApplication", + "NSSupportsAutomaticGraphicsSwitching": true, +} +`; + +exports[`mac > x64 3`] = ` +{ + "mac": [ + { + "arch": "x64", + "file": "TestApp.zip", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "TestApp.zip.blockmap", + "safeArtifactName": "TestApp.zip.blockmap", + "updateInfo": { + "sha512": "@sha512", + "size": "@size", + }, + }, + { + "file": "latest-mac.yml", + "fileContent": { + "files": [ + { + "sha512": "@sha512", + "size": "@size", + "url": "TestApp.zip", + }, + ], + "path": "TestApp.zip", + "releaseDate": "@releaseDate", + "sha512": "@sha512", + "version": "1.0.1", + }, + }, + ], +} +`; + +exports[`mac > x64 4`] = ` { "CFBundleDisplayName": "TestApp", "CFBundleExecutable": "TestApp", diff --git a/test/src/ArtifactPublisherTest.ts b/test/src/ArtifactPublisherTest.ts index a68a9993163..362be571f38 100644 --- a/test/src/ArtifactPublisherTest.ts +++ b/test/src/ArtifactPublisherTest.ts @@ -1,5 +1,5 @@ import { Platform } from "app-builder-lib" -import { createPublisher } from "app-builder-lib/out/publish/PublishManager" +import { createPublisher } from "app-builder-lib/internal" import { Arch } from "builder-util" import { BitbucketOptions, CancellationToken, HttpError, KeygenOptions, S3Options, SpacesOptions } from "builder-util-runtime" import { publishArtifactsWithOptions } from "electron-builder" @@ -17,8 +17,8 @@ function versionNumber() { //noinspection SpellCheckingInspection const token = Buffer.from("Y2Y5NDdhZDJhYzJlMzg1OGNiNzQzYzcwOWZhNGI0OTk2NWQ4ZDg3Yg==", "base64").toString() -const iconPath = path.join(__dirname, "..", "fixtures", "test-app", "build", "icon.icns") -const icoPath = path.join(__dirname, "..", "fixtures", "test-app", "build", "icon.ico") +const iconPath = path.join(import.meta.dirname, "..", "fixtures", "test-app", "build", "icon.icns") +const icoPath = path.join(import.meta.dirname, "..", "fixtures", "test-app", "build", "icon.ico") const publishContext: PublishContext = { cancellationToken: new CancellationToken(), diff --git a/test/src/BuildTest.ts b/test/src/BuildTest.ts index 0600a458a8d..ab91e443ea4 100644 --- a/test/src/BuildTest.ts +++ b/test/src/BuildTest.ts @@ -1,18 +1,21 @@ +import { createRequire } from "node:module" import { checkBuildRequestOptions } from "app-builder-lib" -import { doMergeConfigs } from "app-builder-lib/out/util/config/config" +import { doMergeConfigs } from "app-builder-lib/internal" import { Arch, createTargets, DIR_TARGET, Platform } from "electron-builder" -import { createYargs } from "electron-builder/out/builder" +import { createYargs } from "electron-builder/internal" import { promises as fs } from "fs" -import { outputFile, outputJson } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { app, appTwo, appTwoThrows, assertPack, getFixtureDir, linuxDirTarget, modifyPackageJson, packageJson, toSystemIndependentPath } from "./helpers/packTester" -import { ELECTRON_VERSION } from "./helpers/testConfig" -import { verifySmartUnpack } from "./helpers/verifySmartUnpack" -import { PM } from "app-builder-lib/out/node-module-collector/packageManager" +import { app, appTwo, appTwoThrows, assertPack, getFixtureDir, linuxDirTarget, modifyPackageJson, packageJson, toSystemIndependentPath } from "./helpers/packTester.js" +import { ELECTRON_VERSION } from "./helpers/testConfig.js" +import { verifySmartUnpack } from "./helpers/verifySmartUnpack.js" +import { PM } from "app-builder-lib/internal" + +const require = createRequire(import.meta.url) test.ifLinux("cli", ({ expect }) => { // because these methods are internal - const { configureBuildCommand, normalizeOptions } = require("electron-builder/out/builder") + const { configureBuildCommand, normalizeOptions } = require("electron-builder/internal") const yargs = createYargs() configureBuildCommand(yargs) @@ -161,7 +164,7 @@ it.ifNotWindows("electron version from electron-prebuilt dependency", ({ expect data.devDependencies = {} }) return () => - outputJson(path.join(projectDir, "node_modules", "electron-prebuilt", "package.json"), { + fsExtra.outputJson(path.join(projectDir, "node_modules", "electron-prebuilt", "package.json"), { version: ELECTRON_VERSION, }) }, @@ -182,7 +185,7 @@ test.ifNotWindows("electron version from electron dependency", ({ expect }) => data.devDependencies = {} }) return () => - outputJson(path.join(projectDir, "node_modules", "electron", "package.json"), { + fsExtra.outputJson(path.join(projectDir, "node_modules", "electron", "package.json"), { version: ELECTRON_VERSION, }) }, @@ -399,8 +402,8 @@ test("smart unpack local module with dll file", ({ expect }) => { projectDirCreated: async (projectDir, tmpDir) => { const tmpPath = await tmpDir.getTempDir() const localPath = path.join(tmpPath, "foo") - await outputFile(path.join(localPath, "package.json"), `{"name":"foo","version":"9.0.0","main":"index.js","license":"MIT"}`) - await outputFile(path.join(localPath, "test.dll"), `test`) + await fsExtra.outputFile(path.join(localPath, "package.json"), `{"name":"foo","version":"9.0.0","main":"index.js","license":"MIT"}`) + await fsExtra.outputFile(path.join(localPath, "test.dll"), `test`) await modifyPackageJson(projectDir, data => { data.dependencies = { debug: "3.1.0", diff --git a/test/src/ExtraBuildResourcesTest.ts b/test/src/ExtraBuildResourcesTest.ts index 743fd96496e..898e0209c49 100644 --- a/test/src/ExtraBuildResourcesTest.ts +++ b/test/src/ExtraBuildResourcesTest.ts @@ -1,15 +1,18 @@ +import { createRequire } from "node:module" import { Arch, build, PackagerOptions, Platform } from "electron-builder" import * as fs from "fs" import * as path from "path" -import { assertThat } from "./helpers/fileAssert" -import { app, assertPack, linuxDirTarget, modifyPackageJson } from "./helpers/packTester" -import { ELECTRON_VERSION, getElectronCacheDir } from "./helpers/testConfig" -import { expectUpdateMetadata } from "./helpers/winHelper" +import { assertThat } from "./helpers/fileAssert.js" +import { app, assertPack, linuxDirTarget, modifyPackageJson } from "./helpers/packTester.js" +import { ELECTRON_VERSION, getElectronCacheDir } from "./helpers/testConfig.js" +import { expectUpdateMetadata } from "./helpers/winHelper.js" import { ExpectStatic } from "vitest" import * as unzipper from "unzipper" import { TmpDir } from "temp-file" import { readdir } from "fs/promises" +const require = createRequire(import.meta.url) + function createBuildResourcesTest(expect: ExpectStatic, packagerOptions: PackagerOptions) { return app( expect, diff --git a/test/src/HoistTest.ts b/test/src/HoistTest.ts index 92199e56756..dd8c6b942ba 100644 --- a/test/src/HoistTest.ts +++ b/test/src/HoistTest.ts @@ -1,5 +1,5 @@ // copy from https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-nm/tests/hoist.test.ts -import { hoist, HoisterTree, HoisterResult, HoisterDependencyKind } from "app-builder-lib/out/node-module-collector/hoist" +import { hoist, HoisterTree, HoisterResult, HoisterDependencyKind } from "app-builder-lib/internal" import { expect } from "vitest" const toTree = (obj: any, key: string = `.`, nodes = new Map()): HoisterTree => { diff --git a/test/src/HoistedNodeModuleTest.ts b/test/src/HoistedNodeModuleTest.ts index b4a51a9cbca..73eb7a68c82 100644 --- a/test/src/HoistedNodeModuleTest.ts +++ b/test/src/HoistedNodeModuleTest.ts @@ -1,11 +1,11 @@ -import { PM } from "app-builder-lib/out/node-module-collector" -import { spawn } from "builder-util/out/util" +import { PM } from "app-builder-lib/internal" +import { spawn } from "builder-util" import { Arch, DIR_TARGET, Platform } from "electron-builder" import * as path from "path" -import { appTwoThrows, assertPack, linuxDirTarget, modifyPackageJson, verifyAsarFileTree } from "./helpers/packTester" -import { ELECTRON_VERSION } from "./helpers/testConfig" +import { appTwoThrows, assertPack, linuxDirTarget, modifyPackageJson, verifyAsarFileTree } from "./helpers/packTester.js" +import { ELECTRON_VERSION } from "./helpers/testConfig.js" import { copy, mkdir, outputFile, readJson, rm, symlink, writeJson } from "fs-extra" -import { assertThat } from "./helpers/fileAssert" +import { assertThat } from "./helpers/fileAssert.js" describe.ifNotWindows("node_module collectors", () => { test("yarn workspace", ({ expect }) => diff --git a/test/src/PublishManagerTest.ts b/test/src/PublishManagerTest.ts index 7cf1bdd9d1e..45197fd040f 100644 --- a/test/src/PublishManagerTest.ts +++ b/test/src/PublishManagerTest.ts @@ -1,9 +1,9 @@ import { GenericServerOptions, GithubOptions, KeygenOptions, SpacesOptions } from "builder-util-runtime" import { Arch, createTargets, Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "./helpers/fileAssert" -import { app, checkDirContents } from "./helpers/packTester" +import { assertThat } from "./helpers/fileAssert.js" +import { app, checkDirContents } from "./helpers/packTester.js" function spacesPublisher(publishAutoUpdate = true): SpacesOptions { return { @@ -149,7 +149,7 @@ test.ifNotWindows("custom provider", ({ expect }) => { publish: "never", projectDirCreated: projectDir => - outputFile( + fsExtra.outputFile( path.join(projectDir, "build/electron-publisher-custom.js"), `class Publisher { async upload(task) { diff --git a/test/src/RepoSlugTest.ts b/test/src/RepoSlugTest.ts index 2bc245fd339..605cb031120 100644 --- a/test/src/RepoSlugTest.ts +++ b/test/src/RepoSlugTest.ts @@ -1,4 +1,4 @@ -import { getRepositoryInfo } from "app-builder-lib/out/util/repositoryInfo" +import { getRepositoryInfo } from "app-builder-lib/internal" import { ExpectStatic } from "vitest" function checkInfo(expect: ExpectStatic, info: any) { diff --git a/test/src/binDownloadTest.ts b/test/src/binDownloadTest.ts index 3ed5706c5c7..7a0fb7c3bcf 100644 --- a/test/src/binDownloadTest.ts +++ b/test/src/binDownloadTest.ts @@ -1,4 +1,4 @@ -import { getBinFromUrl } from "app-builder-lib/out/binDownload" +import { getBinFromUrl } from "app-builder-lib/internal" test("download binary from Github", async ({ expect }) => { const bin = await getBinFromUrl( diff --git a/test/src/concurrentBuildsTest.ts b/test/src/concurrentBuildsTest.ts index 0fb1f97e16f..d5fbf52927e 100644 --- a/test/src/concurrentBuildsTest.ts +++ b/test/src/concurrentBuildsTest.ts @@ -1,7 +1,7 @@ import { Arch, Configuration, DIR_TARGET, Platform } from "app-builder-lib" import { deepAssign } from "builder-util" import { TmpDir } from "temp-file" -import { assertPack, modifyPackageJson } from "./helpers/packTester" +import { assertPack, modifyPackageJson } from "./helpers/packTester.js" const options = { timeout: 30 * 60 * 1000 } diff --git a/test/src/configurationValidationTest.ts b/test/src/configurationValidationTest.ts index 6ca6f8d0bbd..a9174e50fad 100644 --- a/test/src/configurationValidationTest.ts +++ b/test/src/configurationValidationTest.ts @@ -1,8 +1,8 @@ -import { validateConfiguration } from "app-builder-lib/out/util/config/config" +import { validateConfiguration } from "app-builder-lib/internal" import { Arch, DebugLogger } from "builder-util" -import { Configuration, Platform } from "electron-builder" -import { CliOptions, configureBuildCommand, createYargs, normalizeOptions } from "electron-builder/out/builder" -import { app, appThrows, linuxDirTarget } from "./helpers/packTester" +import { CliOptions, Configuration, Platform } from "electron-builder" +import { configureBuildCommand, createYargs, normalizeOptions } from "electron-builder/internal" +import { app, appThrows, linuxDirTarget } from "./helpers/packTester.js" test.ifNotWindows("validation", ({ expect }) => appThrows( diff --git a/test/src/extraMetadataTest.ts b/test/src/extraMetadataTest.ts index 04d8ebdff69..1aa349aeff7 100644 --- a/test/src/extraMetadataTest.ts +++ b/test/src/extraMetadataTest.ts @@ -1,12 +1,15 @@ -import { readAsarJson } from "app-builder-lib/out/asar/asar" +import { createRequire } from "node:module" +import { readAsarJson } from "app-builder-lib/internal" import { Platform } from "electron-builder" -import { coerceTypes } from "electron-builder/out/builder" -import { readJson } from "fs-extra" +import { coerceTypes } from "electron-builder/internal" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "./helpers/fileAssert" -import { app, linuxDirTarget, modifyPackageJson } from "./helpers/packTester" +import { assertThat } from "./helpers/fileAssert.js" +import { app, linuxDirTarget, modifyPackageJson } from "./helpers/packTester.js" import { ExpectStatic } from "vitest" +const require = createRequire(import.meta.url) + function createExtraMetadataTest(expect: ExpectStatic, asar: boolean) { return app( expect, @@ -44,7 +47,7 @@ function createExtraMetadataTest(expect: ExpectStatic, asar: boolean) { if (asar) { expect(await readAsarJson(path.join(context.getResources(Platform.LINUX), "app.asar"), "package.json")).toMatchSnapshot() } else { - expect(await readJson(path.join(context.getResources(Platform.LINUX), "app", "package.json"))).toMatchSnapshot() + expect(await fsExtra.readJson(path.join(context.getResources(Platform.LINUX), "app", "package.json"))).toMatchSnapshot() } }, } @@ -56,7 +59,7 @@ test("extra metadata (no asar)", ({ expect }) => createExtraMetadataTest(expect, test("cli", ({ expect }) => { // because these methods are internal - const { configureBuildCommand, normalizeOptions } = require("electron-builder/out/builder") + const { configureBuildCommand, normalizeOptions } = require("electron-builder/internal") const yargs = require("yargs") .strict() .fail((message: string, error: Error | null) => { diff --git a/test/src/filenameUtilTest.ts b/test/src/filenameUtilTest.ts index f9ba2726789..577df87f61c 100644 --- a/test/src/filenameUtilTest.ts +++ b/test/src/filenameUtilTest.ts @@ -1,4 +1,4 @@ -import { getCompleteExtname } from "builder-util/out/filename" +import { getCompleteExtname } from "builder-util/internal" // [inputFilename, expectedExtname] const tests = [ diff --git a/test/src/filesTest.ts b/test/src/filesTest.ts index 736c322bde2..db4b5305d65 100644 --- a/test/src/filesTest.ts +++ b/test/src/filesTest.ts @@ -1,11 +1,11 @@ import { TmpDir, archFromString, copyDir } from "builder-util" import { DIR_TARGET, Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import * as path from "path" -import { Mode, RWX } from "stat-mode" -import { assertThat } from "./helpers/fileAssert" -import { app, appThrows, assertPack, checkDirContents, linuxDirTarget, modifyPackageJson } from "./helpers/packTester" +import statMode from "stat-mode" +import { assertThat } from "./helpers/fileAssert.js" +import { app, appThrows, assertPack, checkDirContents, linuxDirTarget, modifyPackageJson } from "./helpers/packTester.js" import { ExpectStatic } from "vitest" test.ifNotWindows("expand not defined env", ({ expect }) => @@ -35,10 +35,10 @@ test.ifNotWindows("files", ({ expect }) => { projectDirCreated: projectDir => Promise.all([ - outputFile(path.join(projectDir, "ignoreMe", "foo"), "data"), - outputFile(path.join(projectDir, "ignoreEmptyDir", "bar"), "data"), - outputFile(path.join(projectDir, "test.h"), "test that"), - outputFile(path.join(projectDir, "dist/electron/foo.js"), "data"), + fsExtra.outputFile(path.join(projectDir, "ignoreMe", "foo"), "data"), + fsExtra.outputFile(path.join(projectDir, "ignoreEmptyDir", "bar"), "data"), + fsExtra.outputFile(path.join(projectDir, "test.h"), "test that"), + fsExtra.outputFile(path.join(projectDir, "dist/electron/foo.js"), "data"), ]), packed: context => { const resources = path.join(context.getResources(Platform.LINUX), "app") @@ -100,7 +100,8 @@ test.ifNotWindows("map resources", ({ expect }) => }, }, { - projectDirCreated: projectDir => Promise.all([outputFile(path.join(projectDir, "foo", "old"), "data"), outputFile(path.join(projectDir, "license.txt"), "data")]), + projectDirCreated: projectDir => + Promise.all([fsExtra.outputFile(path.join(projectDir, "foo", "old"), "data"), fsExtra.outputFile(path.join(projectDir, "license.txt"), "data")]), packed: context => { const resources = context.getResources(Platform.LINUX) return Promise.all([ @@ -132,13 +133,13 @@ async function doExtraResourcesTest(expect: ExpectStatic, platform: Platform) { { projectDirCreated: async projectDir => { return Promise.all([ - outputFile(path.resolve(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), - outputFile(path.resolve(projectDir, "bar/hello.txt"), "data"), - outputFile(path.resolve(projectDir, "dir-relative/f.txt"), "data"), - outputFile(path.resolve(projectDir, `bar/${process.arch}.txt`), "data"), - outputFile(path.resolve(projectDir, `${osName}/${process.arch}.txt`), "data"), - outputFile(path.resolve(projectDir, "platformSpecificR"), "platformSpecificR"), - outputFile(path.resolve(projectDir, "ignoreMe.txt"), "ignoreMe"), + fsExtra.outputFile(path.resolve(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), + fsExtra.outputFile(path.resolve(projectDir, "bar/hello.txt"), "data"), + fsExtra.outputFile(path.resolve(projectDir, "dir-relative/f.txt"), "data"), + fsExtra.outputFile(path.resolve(projectDir, `bar/${process.arch}.txt`), "data"), + fsExtra.outputFile(path.resolve(projectDir, `${osName}/${process.arch}.txt`), "data"), + fsExtra.outputFile(path.resolve(projectDir, "platformSpecificR"), "platformSpecificR"), + fsExtra.outputFile(path.resolve(projectDir, "ignoreMe.txt"), "ignoreMe"), ]) }, packed: async context => { @@ -188,14 +189,14 @@ test.ifNotWindows("extraResources - two-package", ({ expect }) => { { projectDirCreated: projectDir => { return Promise.all([ - outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), - outputFile(path.join(projectDir, "bar/hello.txt"), "data", { mode: 0o400 }), - outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), - outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), - outputFile(path.join(projectDir, "executable"), "executable", { mode: 0o755 }), - outputFile(path.join(projectDir, "executableOnlyOwner"), "executable", { mode: 0o740 }), + fsExtra.outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), + fsExtra.outputFile(path.join(projectDir, "bar/hello.txt"), "data", { mode: 0o400 }), + fsExtra.outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), + fsExtra.outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), + fsExtra.outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), + fsExtra.outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), + fsExtra.outputFile(path.join(projectDir, "executable"), "executable", { mode: 0o755 }), + fsExtra.outputFile(path.join(projectDir, "executableOnlyOwner"), "executable", { mode: 0o740 }), ]) }, packed: async context => { @@ -236,7 +237,7 @@ test.ifNotWindows("postpone symlink", async () => { const source = await tmpDir.getTempDir() const aSourceFile = path.join(source, "z", "Z") const bSourceFileLink = path.join(source, "B") - await outputFile(aSourceFile, "test") + await fsExtra.outputFile(aSourceFile, "test") await fs.symlink(aSourceFile, bSourceFileLink) const dest = await tmpDir.getTempDir() @@ -246,15 +247,15 @@ test.ifNotWindows("postpone symlink", async () => { }) async function allCan(file: string, execute: boolean) { - const mode = new Mode(await fs.stat(file)) + const mode = new statMode.Mode(await fs.stat(file)) - function checkExecute(value: RWX) { + function checkExecute(value: statMode.RWX) { if (value.execute !== execute) { throw new Error(`${file} is ${execute ? "not " : ""}executable`) } } - function checkRead(value: RWX) { + function checkRead(value: statMode.RWX) { if (!value.read) { throw new Error(`${file} is not readable`) } diff --git a/test/src/globTest.ts b/test/src/globTest.ts index dea45f3ad0a..1dc75dc52e8 100644 --- a/test/src/globTest.ts +++ b/test/src/globTest.ts @@ -1,21 +1,21 @@ import { Platform } from "app-builder-lib" -import { readAsar } from "app-builder-lib/out/asar/asar" -import { PM } from "app-builder-lib/out/node-module-collector/packageManager" -import { outputFile } from "fs-extra" +import { readAsar } from "app-builder-lib/internal" +import { PM } from "app-builder-lib/internal" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import * as path from "path" import { ExpectStatic } from "vitest" -import { assertThat } from "./helpers/fileAssert" -import { app, appThrows, assertPack, linuxDirTarget, modifyPackageJson, PackedContext, removeUnstableProperties, verifyAsarFileTree } from "./helpers/packTester" -import { verifySmartUnpack } from "./helpers/verifySmartUnpack" +import { assertThat } from "./helpers/fileAssert.js" +import { app, appThrows, assertPack, linuxDirTarget, modifyPackageJson, PackedContext, removeUnstableProperties, verifyAsarFileTree } from "./helpers/packTester.js" +import { verifySmartUnpack } from "./helpers/verifySmartUnpack.js" async function createFiles(appDir: string) { await Promise.all([ - outputFile(path.join(appDir, "assets", "file1"), "data"), - outputFile(path.join(appDir, "assets", "file2"), "data"), - outputFile(path.join(appDir, "assets", "subdir", "file3"), "data"), - outputFile(path.join(appDir, "b2", "file"), "data"), - outputFile(path.join(appDir, "do-not-unpack-dir", "file.json"), "{}").then(() => fs.writeFile(path.join(appDir, "do-not-unpack-dir", "must-be-not-unpacked"), "{}")), + fsExtra.outputFile(path.join(appDir, "assets", "file1"), "data"), + fsExtra.outputFile(path.join(appDir, "assets", "file2"), "data"), + fsExtra.outputFile(path.join(appDir, "assets", "subdir", "file3"), "data"), + fsExtra.outputFile(path.join(appDir, "b2", "file"), "data"), + fsExtra.outputFile(path.join(appDir, "do-not-unpack-dir", "file.json"), "{}").then(() => fs.writeFile(path.join(appDir, "do-not-unpack-dir", "must-be-not-unpacked"), "{}")), ]) const dir = path.join(appDir, "do-not-unpack-dir", "dir-2", "dir-3", "dir-3") @@ -84,7 +84,7 @@ test.ifNotWindows("asarUnpack and files ignore", ({ expect }) => { }, }, { - projectDirCreated: projectDir => outputFile(path.join(projectDir, "test/ffprobe-static/bin/darwin/x64/ffprobe"), "data"), + projectDirCreated: projectDir => fsExtra.outputFile(path.join(projectDir, "test/ffprobe-static/bin/darwin/x64/ffprobe"), "data"), packed: async context => { const resourceDir = context.getResources(Platform.LINUX) await Promise.all([assertThat(expect, path.join(resourceDir, "app.asar.unpacked", "test/ffprobe-static/bin/darwin/x64/ffprobe")).doesNotExist()]) @@ -123,7 +123,7 @@ test.skip("outside link", ({ expect }) => { projectDirCreated: async (projectDir, tmpDir) => { const tempDir = await tmpDir.getTempDir() - await outputFile(path.join(tempDir, "foo"), "data") + await fsExtra.outputFile(path.join(tempDir, "foo"), "data") await fs.symlink(tempDir, path.join(projectDir, "o-dir")) }, }, diff --git a/test/src/helpers/CheckingPackager.ts b/test/src/helpers/CheckingPackager.ts index 2852e2ab842..9c70e9b3a31 100644 --- a/test/src/helpers/CheckingPackager.ts +++ b/test/src/helpers/CheckingPackager.ts @@ -1,11 +1,9 @@ -import { SignOptions as MacSignOptions } from "@electron/osx-sign/dist/cjs/types" -import { Identity } from "app-builder-lib/out/codeSign/macCodeSign" -import { DoPackOptions } from "app-builder-lib/out/platformPackager" +import { SignOptions as MacSignOptions } from "@electron/osx-sign/dist/esm/types.js" +import { Identity, DoPackOptions } from "app-builder-lib/internal" import { WinPackager, getArchSuffix, MacPackager } from "app-builder-lib" import { AsyncTaskManager } from "builder-util" import { DmgTarget } from "dmg-builder" import { Arch, MacConfiguration, Packager, Target } from "electron-builder" -import SquirrelWindowsTarget from "electron-builder-squirrel-windows" import * as path from "path" export class CheckingWinPackager extends WinPackager { @@ -15,18 +13,17 @@ export class CheckingWinPackager extends WinPackager { super(info) } - //noinspection JSUnusedLocalSymbols async pack(outDir: string, arch: Arch, targets: Array, taskManager: AsyncTaskManager): Promise { + const pkgName = "electron-builder-squirrel-windows" // skip pack - const helperClass: typeof SquirrelWindowsTarget = (await import("electron-builder-squirrel-windows")).default - const newClass = new helperClass(this, outDir) + const helperClass = (await import(pkgName)).default + const newClass = new (helperClass as any)(this, outDir) const setupFile = this.expandArtifactNamePattern(newClass.options, "exe", arch, "${productName} Setup ${version}.${ext}") const installerOutDir = path.join(outDir, `squirrel-windows${getArchSuffix(arch)}`) this.effectiveDistOptions = await newClass.computeEffectiveDistOptions(installerOutDir, outDir, setupFile) await this.signIf(this.computeAppOutDir(outDir, arch)) } - //noinspection JSUnusedLocalSymbols packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array, taskManager: AsyncTaskManager): void { // skip } diff --git a/test/src/helpers/TestAppAdapter.ts b/test/src/helpers/TestAppAdapter.ts index 25947245605..af63c678c51 100644 --- a/test/src/helpers/TestAppAdapter.ts +++ b/test/src/helpers/TestAppAdapter.ts @@ -1,4 +1,4 @@ -import { ElectronAppAdapter } from "electron-updater/out/ElectronAppAdapter" +import { ElectronAppAdapter } from "electron-updater/internal" // do not implement AppAdapter directly, test that our ElectronAppAdapter implementation is correct export class TestAppAdapter extends ElectronAppAdapter { diff --git a/test/src/helpers/asarVerifier.ts b/test/src/helpers/asarVerifier.ts index fb2842f22f1..fd2f7fa96cd 100644 --- a/test/src/helpers/asarVerifier.ts +++ b/test/src/helpers/asarVerifier.ts @@ -1,4 +1,4 @@ -import { readAsar } from "app-builder-lib/src/asar/asar" +import { readAsar } from "app-builder-lib/internal" import path from "path" import { expect, ExpectStatic } from "vitest" diff --git a/test/src/helpers/downloadElectron.ts b/test/src/helpers/downloadElectron.ts index 62510d67c00..ba79d0fab17 100644 --- a/test/src/helpers/downloadElectron.ts +++ b/test/src/helpers/downloadElectron.ts @@ -1,10 +1,14 @@ +import { createRequire } from "node:module" +import { fileURLToPath } from "node:url" import { isCI as isCi } from "ci-info" import * as fs from "fs/promises" import * as path from "path" import { gte } from "semver" -import { ELECTRON_VERSION, getElectronCacheDir } from "./testConfig" +import { ELECTRON_VERSION, getElectronCacheDir } from "./testConfig.js" -const executeAppBuilder: (options: any) => Promise = require(path.join(__dirname, "../../..", "packages/builder-util")).executeAppBuilder +const require = createRequire(import.meta.url) + +const executeAppBuilder: (options: any) => Promise = require(path.join(import.meta.dirname, "../../..", "packages/builder-util")).executeAppBuilder export async function deleteOldElectronVersion(): Promise { // on CircleCi no need to clean manually @@ -47,7 +51,7 @@ export function downloadAllRequiredElectronVersions(): Promise { ? ["x64"] : platform === "win32" ? ["ia32", "x64"] - : require(`${path.join(__dirname, "../../..")}/packages/builder-util/out/util`).getArchCliNames() + : require(`${path.join(import.meta.dirname, "../../..")}/packages/builder-util/out/util.js`).getArchCliNames() for (const arch of archs) { if (gte(ELECTRON_VERSION, "19.0.0") && platform === "linux" && arch === "ia32") { // Chromium dropped support for ia32 linux binaries in 102.0.4999.0 @@ -64,7 +68,7 @@ export function downloadAllRequiredElectronVersions(): Promise { return executeAppBuilder(["download-electron", "--configuration", JSON.stringify(versions)]) } -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { downloadAllRequiredElectronVersions().catch(error => { console.error((error.stack || error).toString()) process.exitCode = -1 diff --git a/test/src/helpers/fileAssert.ts b/test/src/helpers/fileAssert.ts index 4186aa7e33d..07422987ec8 100644 --- a/test/src/helpers/fileAssert.ts +++ b/test/src/helpers/fileAssert.ts @@ -2,14 +2,13 @@ import { exists, statOrNull } from "builder-util" import * as fs from "fs/promises" import * as path from "path" import { ExpectStatic } from "vitest" +import { PACKAGE_VERSION as appVersion } from "app-builder-lib/internal" // http://joel-costigliola.github.io/assertj/ export function assertThat(expect: ExpectStatic, actual: any): Assertions { return new Assertions(expect, actual) } -const appVersion = require(path.join(__dirname, "../../../packages/app-builder-lib/package.json")).version - class Assertions { constructor( private readonly expect: ExpectStatic, diff --git a/test/src/helpers/launchAppCrossPlatform.ts b/test/src/helpers/launchAppCrossPlatform.ts index 594df6b97cd..2694932d2c0 100644 --- a/test/src/helpers/launchAppCrossPlatform.ts +++ b/test/src/helpers/launchAppCrossPlatform.ts @@ -1,4 +1,4 @@ -import { getBinFromUrl } from "app-builder-lib/src/binDownload" +import { getBinFromUrl } from "app-builder-lib/internal" import { isEmptyOrSpaces } from "builder-util" import { ChildProcess, spawn } from "child_process" import { chmodSync } from "fs" diff --git a/test/src/helpers/packTester.ts b/test/src/helpers/packTester.ts index 5f0c5be2dda..d9accbc7f59 100644 --- a/test/src/helpers/packTester.ts +++ b/test/src/helpers/packTester.ts @@ -1,35 +1,27 @@ import { PublishManager } from "app-builder-lib" -import { verifyAsarFileTree as _verifyAsarFileTree } from "./asarVerifier" -import { computeArchToTargetNamesMap } from "app-builder-lib/out/targets/targetFactory" -import { getLinuxToolsPath } from "app-builder-lib/out/toolsets/linux" -import { parsePlistFile, PlistObject } from "app-builder-lib/out/util/plist" -import { AsarIntegrity } from "app-builder-lib/out/asar/integrity" +import { computeArchToTargetNamesMap, getLinuxToolsPath, parsePlistFile, PlistObject, AsarIntegrity } from "app-builder-lib/internal" +import { verifyAsarFileTree as _verifyAsarFileTree } from "./asarVerifier.js" import { addValue, copyDir, deepAssign, exec, executeFinally, exists, FileCopier, log, USE_HARD_LINKS, walk } from "builder-util" import { CancellationToken, UpdateFileInfo } from "builder-util-runtime" import { Arch, ArtifactCreated, Configuration, DIR_TARGET, getArchSuffix, MacOsTargetName, Packager, PackagerOptions, Platform, Target } from "electron-builder" import { convertVersion } from "electron-winstaller" import { PublishPolicy } from "electron-publish" -import { copyFile, emptyDir, mkdir, writeJson } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import { load } from "js-yaml" import * as path from "path" import pathSorter from "path-sort" import { NtExecutable, NtExecutableResource } from "resedit" import { TmpDir } from "temp-file" -import { getCollectorByPackageManager, PM } from "app-builder-lib/out/node-module-collector" +import { getCollectorByPackageManager, PM, computeDefaultAppDirectory, installDependencies, createLazyProductionDeps, detectPackageManager } from "app-builder-lib/internal" import { promisify } from "util" -import { MAC_CSC_LINK, WIN_CSC_LINK } from "./codeSignData" -import { assertThat } from "./fileAssert" +import { MAC_CSC_LINK, WIN_CSC_LINK } from "./codeSignData.js" +import { assertThat } from "./fileAssert.js" import AdmZip from "adm-zip" -// @ts-ignore import sanitizeFileName from "sanitize-filename" import type { ExpectStatic } from "vitest" -import { computeDefaultAppDirectory } from "app-builder-lib/out/util/config/config" -import { installDependencies } from "app-builder-lib/out/util/yarn" -import { ELECTRON_VERSION } from "./testConfig" -import { createLazyProductionDeps } from "app-builder-lib/out/util/packageDependencies" -import { execSync } from "child_process" -import { detectPackageManager } from "app-builder-lib/out/node-module-collector/packageManager" +import { ELECTRON_VERSION } from "./testConfig.js" +import { exec as execCallback, execSync } from "child_process" const PACKAGE_MANAGER_VERSION_MAP = { [PM.NPM]: { cli: "npm", version: "9.8.1" }, @@ -148,20 +140,20 @@ export async function assertPack(expect: ExpectStatic, fixtureName: string, pack packagerOptions = deepAssign({}, packagerOptions, { config: { mac: { identity: null } } }) } - let projectDir = path.join(__dirname, "..", "..", "fixtures", fixtureName) + let projectDir = path.join(import.meta.dirname, "..", "..", "fixtures", fixtureName) // const isDoNotUseTempDir = platform === "darwin" const customTmpDir = process.env.TEST_APP_TMP_DIR const tmpDir = checkOptions.tmpDir || new TmpDir(`pack-tester: ${fixtureName}`) // non-macOS test uses the same dir as macOS test, but we cannot share node_modules (because tests executed in parallel) const dir = customTmpDir == null ? await tmpDir.createTempDir({ prefix: "test_project" }) : path.resolve(customTmpDir) if (customTmpDir != null) { - await emptyDir(dir) + await fsExtra.emptyDir(dir) log.info({ customTmpDir }, "custom temp dir used") } const state = expect.getState() const lockfileFixtureName = path.basename(state.testPath!, path.extname(state.testPath!)) - const lockfilePathPrefix = path.join(__dirname, "..", "..", "fixtures", "lockfiles", lockfileFixtureName) + const lockfilePathPrefix = path.join(import.meta.dirname, "..", "..", "fixtures", "lockfiles", lockfileFixtureName) const lockfileFixtureNameCandidates = getLockfileFixtureNameCandidates(state.currentTestName || "") if (lockfileFixtureNameCandidates.length === 0) { lockfileFixtureNameCandidates.push("unknown-test") @@ -242,7 +234,7 @@ export async function assertPack(expect: ExpectStatic, fixtureName: string, pack const shouldUpdateLockfiles = !!process.env.UPDATE_LOCKFILE_FIXTURES && !!checkOptions.storeDepsLockfileSnapshot // check for lockfile fixture so we can use `--frozen-lockfile` if ((await exists(testFixtureLockfile)) && !shouldUpdateLockfiles) { - await copyFile(testFixtureLockfile, destLockfile) + await fsExtra.copyFile(testFixtureLockfile, destLockfile) lockfileFixtureApplied = true } @@ -277,9 +269,9 @@ export async function assertPack(expect: ExpectStatic, fixtureName: string, pack if (shouldUpdateLockfiles) { const fixtureDir = path.dirname(testFixtureLockfile) if (!(await exists(fixtureDir))) { - await mkdir(fixtureDir) + await fsExtra.mkdir(fixtureDir) } - await copyFile(destLockfile, testFixtureLockfile) + await fsExtra.copyFile(destLockfile, testFixtureLockfile) } if (packagerOptions.projectDir != null) { @@ -328,7 +320,7 @@ export function copyTestAsset(name: string, destination: string): Promise } export function getFixtureDir() { - return path.join(__dirname, "..", "..", "fixtures") + return path.join(import.meta.dirname, "..", "..", "fixtures") } /** @@ -721,7 +713,7 @@ const checkResult = (expect: ExpectStatic, artifacts: Array, ex return { packageFile, zip, allFiles } } -export const execShell: any = promisify(require("child_process").exec) +export const execShell: any = promisify(execCallback) export async function getTarExecutable() { return process.platform === "darwin" ? path.join(await getLinuxToolsPath(), "bin", "gtar") : "tar" @@ -758,7 +750,7 @@ export async function modifyPackageJson(projectDir: string, task: (data: any) => await fs.unlink(file) await fs.writeFile(path.join(projectDir, ".yarnrc.yml"), "nodeLinker: node-modules") - return await writeJson(file, data, { spaces: 2 }) + return await fsExtra.writeJson(file, data, { spaces: 2 }) } export function platform(platform: Platform): PackagerOptions { diff --git a/test/src/helpers/updaterTestUtil.ts b/test/src/helpers/updaterTestUtil.ts index 4355290114d..29696cdc241 100644 --- a/test/src/helpers/updaterTestUtil.ts +++ b/test/src/helpers/updaterTestUtil.ts @@ -1,11 +1,11 @@ import { NodeHttpExecutor, serializeToYaml, TmpDir } from "builder-util" import { AllPublishOptions, DownloadOptions } from "builder-util-runtime" import { AppUpdater, MacUpdater, NsisUpdater } from "electron-updater" -import { NoOpLogger, TestOnlyUpdaterOptions } from "electron-updater/out/AppUpdater" -import { outputFile, writeFile } from "fs-extra" +import { NoOpLogger, TestOnlyUpdaterOptions } from "electron-updater/internal" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "./fileAssert" -import { TestAppAdapter } from "./TestAppAdapter" +import { assertThat } from "./fileAssert.js" +import { TestAppAdapter } from "./TestAppAdapter.js" import { ExpectStatic, vi } from "vitest" const tmpDir = new TmpDir("updater-test-util") @@ -24,7 +24,7 @@ export async function createNsisUpdater(version = "0.0.1") { // to reduce difference in test mode, setFeedURL is not used to set (NsisUpdater also read configOnDisk to load original publisherName) export async function writeUpdateConfig(data: T): Promise { const updateConfigPath = path.join(await tmpDir.getTempDir({ prefix: "test-update-config" }), "app-update.yml") - await outputFile(updateConfigPath, serializeToYaml(data)) + await fsExtra.outputFile(updateConfigPath, serializeToYaml(data)) return updateConfigPath } @@ -62,7 +62,7 @@ export class TestNodeHttpExecutor extends NodeHttpExecutor { async download(url: string, destination: string, options: DownloadOptions): Promise { const obj = new URL(url) const buffer = await this.downloadToBuffer(obj, options) - await writeFile(destination, buffer) + await fsExtra.writeFile(destination, buffer) return buffer.toString() } } diff --git a/test/src/helpers/verifySmartUnpack.ts b/test/src/helpers/verifySmartUnpack.ts index 4f846e36f5d..09d0cb102dd 100644 --- a/test/src/helpers/verifySmartUnpack.ts +++ b/test/src/helpers/verifySmartUnpack.ts @@ -1,8 +1,8 @@ -import { AsarFilesystem, readAsar } from "app-builder-lib/out/asar/asar" +import { AsarFilesystem, readAsar } from "app-builder-lib/internal" import { walk } from "builder-util" import { readFileSync } from "fs" import * as path from "path" -import { toSystemIndependentPath } from "./packTester" +import { toSystemIndependentPath } from "./packTester.js" import { ExpectStatic } from "vitest" export function removeUnstableProperties(data: any) { diff --git a/test/src/helpers/winHelper.ts b/test/src/helpers/winHelper.ts index e1f38cbaa37..952a9af7a70 100644 --- a/test/src/helpers/winHelper.ts +++ b/test/src/helpers/winHelper.ts @@ -1,13 +1,13 @@ -import { readAsarJson } from "app-builder-lib/out/asar/asar" +import { readAsarJson } from "app-builder-lib/internal" import { walk } from "builder-util" import { Arch, Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import { load } from "js-yaml" import * as path from "path" -import { assertThat } from "./fileAssert" -import { PackedContext } from "./packTester" -import { diff, WineManager } from "./wine" +import { assertThat } from "./fileAssert.js" +import { PackedContext } from "./packTester.js" +import { diff, WineManager } from "./wine.js" import { ExpectStatic } from "vitest" export async function expectUpdateMetadata(expect: ExpectStatic, context: PackedContext, arch: Arch = Arch.ia32, requireCodeSign: boolean = false): Promise { @@ -91,7 +91,7 @@ export async function doTest( // run installer again to test uninstall const appDataFile = path.join(wine.userDir!, "Application Data", name, "doNotDeleteMe") - await outputFile(appDataFile, "app data must be not removed") + await fsExtra.outputFile(appDataFile, "app data must be not removed") fsBefore = await listFiles() await wine.exec(path.join(outDir, `${productFilename} Setup 1.1.0.exe`), "/S") fsAfter = await listFiles() diff --git a/test/src/helpers/wine.ts b/test/src/helpers/wine.ts index 82c2d118a6e..5296f4ee879 100644 --- a/test/src/helpers/wine.ts +++ b/test/src/helpers/wine.ts @@ -1,5 +1,5 @@ import { exec, safeStringifyJson, unlinkIfExists } from "builder-util" -import { emptyDir } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import { homedir } from "os" import * as path from "path" @@ -37,7 +37,7 @@ export class WineManager { } async prepareWine(wineDir: string) { - await emptyDir(wineDir) + await fsExtra.emptyDir(wineDir) //noinspection SpellCheckingInspection const env = { ...process.env, diff --git a/test/src/httpExecutorTest.ts b/test/src/httpExecutorTest.ts index 40614f82877..be95fdf0408 100644 --- a/test/src/httpExecutorTest.ts +++ b/test/src/httpExecutorTest.ts @@ -1,5 +1,5 @@ import { expect, test, describe } from "vitest" -import { HttpExecutor } from "builder-util-runtime/src/httpExecutor" +import { HttpExecutor } from "builder-util-runtime" import { RequestOptions } from "http" describe("HttpExecutor.prepareRedirectUrlOptions", () => { @@ -506,7 +506,6 @@ describe("HttpExecutor.prepareRedirectUrlOptions", () => { }) }) -// @ts-ignore describe("HttpExecutor.isCrossOriginRedirect", () => { const testCases: Array<{ name: string; url1: string; url2: string; expected: boolean }> = [ { diff --git a/test/src/ignoreTest.ts b/test/src/ignoreTest.ts index efe4153009c..49aa86580ea 100644 --- a/test/src/ignoreTest.ts +++ b/test/src/ignoreTest.ts @@ -1,9 +1,9 @@ import { DIR_TARGET, Platform, archFromString } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "./helpers/fileAssert" -import { app, checkDirContents, linuxDirTarget, modifyPackageJson } from "./helpers/packTester" -import { PM } from "app-builder-lib/out/node-module-collector/packageManager" +import { assertThat } from "./helpers/fileAssert.js" +import { app, checkDirContents, linuxDirTarget, modifyPackageJson } from "./helpers/packTester.js" +import { PM } from "app-builder-lib/internal" const currentProcessTarget = Platform.LINUX.createTarget(DIR_TARGET, archFromString(process.arch)) @@ -18,7 +18,7 @@ test.ifNotWindows("ignore build resources", ({ expect }) => }, { projectDirCreated: projectDir => { - return outputFile(path.join(projectDir, "one/build/foo.txt"), "data") + return fsExtra.outputFile(path.join(projectDir, "one/build/foo.txt"), "data") }, packed: context => { return assertThat(expect, path.join(context.getResources(Platform.LINUX), "app", "one", "build", "foo.txt")).isFile() @@ -47,7 +47,7 @@ test.ifNotWindows("2 ignore", ({ expect }) => }, { projectDirCreated: projectDir => { - return outputFile(path.join(projectDir, "electron/foo.txt"), "data") + return fsExtra.outputFile(path.join(projectDir, "electron/foo.txt"), "data") }, packed: context => { return assertThat(expect, path.join(context.getResources(Platform.LINUX), "app", "electron", "foo.txt")).doesNotExist() @@ -68,10 +68,10 @@ test.ifNotWindows("ignore known ignored files", ({ expect }) => { projectDirCreated: projectDir => Promise.all([ - outputFile(path.join(projectDir, ".svn", "foo"), "data"), - outputFile(path.join(projectDir, ".git", "foo"), "data"), - outputFile(path.join(projectDir, "node_modules", ".bin", "f.txt"), "data"), - outputFile(path.join(projectDir, "node_modules", ".bin2", "f.txt"), "data"), + fsExtra.outputFile(path.join(projectDir, ".svn", "foo"), "data"), + fsExtra.outputFile(path.join(projectDir, ".git", "foo"), "data"), + fsExtra.outputFile(path.join(projectDir, "node_modules", ".bin", "f.txt"), "data"), + fsExtra.outputFile(path.join(projectDir, "node_modules", ".bin2", "f.txt"), "data"), ]), packed: context => checkDirContents(expect, path.join(context.getResources(Platform.LINUX), "app")), } @@ -128,8 +128,8 @@ test.ifNotWindows("copied sub node_modules of the rootDir/node_modules", ({ expe ...data.dependencies, } }), - outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), - outputFile(path.join(projectDir, "others", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "others", "node_modules", "package.json"), "{}"), ]) }, packed: context => { @@ -164,10 +164,10 @@ test.ifNotWindows("Don't copy sub node_modules of the other dir instead of rootD ...data.dependencies, } }), - outputFile(path.join(projectDir, "others", "node_modules", "package.json"), "{}"), - outputFile(path.join(projectDir, "others", "test1", "package.json"), "{}"), - outputFile(path.join(projectDir, "others", "submodule-2-test", "node_modules", "package.json"), "{}"), - outputFile(path.join(projectDir, "others", "submodule-2-test", "test2", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "others", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "others", "test1", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "others", "submodule-2-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "others", "submodule-2-test", "test2", "package.json"), "{}"), ]) }, packed: context => { @@ -205,8 +205,8 @@ test.ifNotWindows("copied select submodule node_modules", ({ expect }) => ...data.dependencies, } }), - outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), - outputFile(path.join(projectDir, "submodule-2-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "submodule-2-test", "node_modules", "package.json"), "{}"), ]) }, packed: context => { @@ -238,7 +238,7 @@ test.ifNotWindows("cannot copied select submodule node_modules by */", ({ expect ...data.dependencies, } }), - outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), ]) }, packed: context => { @@ -268,7 +268,7 @@ test.ifNotWindows("cannot copied select submodule node_modules by **/submodule-1 ...data.dependencies, } }), - outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), + fsExtra.outputFile(path.join(projectDir, "submodule-1-test", "node_modules", "package.json"), "{}"), ]) }, packed: context => { diff --git a/test/src/linux/debTest.ts b/test/src/linux/debTest.ts index bd3ade0aadf..955e68e0199 100644 --- a/test/src/linux/debTest.ts +++ b/test/src/linux/debTest.ts @@ -1,6 +1,6 @@ import { Arch, Platform } from "electron-builder" import * as fs from "fs/promises" -import { app, execShell, getTarExecutable } from "../helpers/packTester" +import { app, execShell, getTarExecutable } from "../helpers/packTester.js" const defaultDebTarget = Platform.LINUX.createTarget("deb", Arch.x64) diff --git a/test/src/linux/flatpakTest.ts b/test/src/linux/flatpakTest.ts index 7eb8719bf72..8af24b97bb2 100644 --- a/test/src/linux/flatpakTest.ts +++ b/test/src/linux/flatpakTest.ts @@ -1,5 +1,5 @@ import { Platform } from "electron-builder" -import { app } from "../helpers/packTester" +import { app } from "../helpers/packTester.js" import * as which from "which" describe.heavy.ifEnv(which.sync("flatpak", { nothrow: true }) != null)("Linux Flatpak Test", () => { diff --git a/test/src/linux/fpmTest.ts b/test/src/linux/fpmTest.ts index 5ed8b74353b..182c1d9590b 100644 --- a/test/src/linux/fpmTest.ts +++ b/test/src/linux/fpmTest.ts @@ -1,5 +1,5 @@ import { Arch, Platform } from "electron-builder" -import { app, EXTENDED_TIMEOUT } from "../helpers/packTester" +import { app, EXTENDED_TIMEOUT } from "../helpers/packTester.js" // "apk" is very slow, don't test for now describe.heavy.ifNotWindows("fpm", () => { diff --git a/test/src/linux/linuxArchiveTest.ts b/test/src/linux/linuxArchiveTest.ts index d46f84dd55c..ac4bb5808f2 100644 --- a/test/src/linux/linuxArchiveTest.ts +++ b/test/src/linux/linuxArchiveTest.ts @@ -1,5 +1,5 @@ import { Arch, Platform } from "electron-builder" -import { app, EXTENDED_TIMEOUT } from "../helpers/packTester" +import { app, EXTENDED_TIMEOUT } from "../helpers/packTester.js" test.ifNotWindows("tar", { timeout: EXTENDED_TIMEOUT }, ({ expect }) => app(expect, { diff --git a/test/src/linux/linuxPackagerTest.ts b/test/src/linux/linuxPackagerTest.ts index 0c3b29219d5..c1ea5318e5b 100644 --- a/test/src/linux/linuxPackagerTest.ts +++ b/test/src/linux/linuxPackagerTest.ts @@ -1,12 +1,12 @@ import { GenericServerOptions } from "builder-util-runtime" import { Arch, build, Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import * as path from "path" -import { assertThat } from "../helpers/fileAssert" -import { app, appThrows, copyTestAsset, modifyPackageJson } from "../helpers/packTester" -import { ELECTRON_VERSION } from "../helpers/testConfig" -import { ToolsetConfig } from "app-builder-lib/src" +import { assertThat } from "../helpers/fileAssert.js" +import { app, appThrows, copyTestAsset, modifyPackageJson } from "../helpers/packTester.js" +import { ELECTRON_VERSION } from "../helpers/testConfig.js" +import { ToolsetConfig } from "app-builder-lib" const appImageTarget = Platform.LINUX.createTarget("appimage", Arch.x64) @@ -107,7 +107,7 @@ describe.ifNotWindows("LinuxPackager", () => { }, { projectDirCreated: projectDir => { - return outputFile( + return fsExtra.outputFile( path.join(projectDir, "build", "license.html"), ` diff --git a/test/src/linux/snapHeavyTest.ts b/test/src/linux/snapHeavyTest.ts index 81030e2e7ca..52b9869df21 100644 --- a/test/src/linux/snapHeavyTest.ts +++ b/test/src/linux/snapHeavyTest.ts @@ -1,5 +1,5 @@ import { Arch, Platform } from "app-builder-lib" -import { app, EXTENDED_TIMEOUT, snapTarget } from "../helpers/packTester" +import { app, EXTENDED_TIMEOUT, snapTarget } from "../helpers/packTester.js" import * as which from "which" // very slow diff --git a/test/src/linux/snapTest.ts b/test/src/linux/snapTest.ts index 4d1014b7be6..eb7fc54eee3 100644 --- a/test/src/linux/snapTest.ts +++ b/test/src/linux/snapTest.ts @@ -1,5 +1,5 @@ import { Arch, Platform } from "electron-builder" -import { app, assertPack, snapTarget } from "../helpers/packTester" +import { app, assertPack, snapTarget } from "../helpers/packTester.js" test.ifNotWindows("snap", ({ expect }) => app(expect, { diff --git a/test/src/mac/dmgTest.ts b/test/src/mac/dmgTest.ts index eb8eb0c8c49..ac99dc82cfa 100644 --- a/test/src/mac/dmgTest.ts +++ b/test/src/mac/dmgTest.ts @@ -4,10 +4,10 @@ import { Arch, copyFile, exec } from "builder-util" import { Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { assertThat } from "../helpers/fileAssert" -import { app, assertPack, copyTestAsset } from "../helpers/packTester" +import { assertThat } from "../helpers/fileAssert.js" +import { app, assertPack, copyTestAsset } from "../helpers/packTester.js" import { beforeAll } from "vitest" -import type { attachAndExecute as aAndE, getDmgTemplatePath as dmgTemplate } from "dmg-builder/out/dmgUtil" +import type { attachAndExecute as aAndE, getDmgTemplatePath as dmgTemplate } from "dmg-builder" const dmgTarget = Platform.MAC.createTarget("dmg", Arch.x64) const defaultTarget = Platform.MAC.createTarget(undefined, Arch.x64) @@ -18,7 +18,7 @@ describe.heavy.ifMac("dmg", { sequential: true }, () => { beforeAll(async () => { // import at runtime to avoid issues on non-macOS platforms - const { attachAndExecute: a, getDmgTemplatePath: d } = await import("dmg-builder/out/dmgUtil") + const { attachAndExecute: a, getDmgTemplatePath: d } = await import("dmg-builder") attachAndExecute = a getDmgTemplatePath = d }) diff --git a/test/src/mac/macArchiveTest.ts b/test/src/mac/macArchiveTest.ts index 2843d231dfe..814f608482b 100644 --- a/test/src/mac/macArchiveTest.ts +++ b/test/src/mac/macArchiveTest.ts @@ -1,12 +1,12 @@ import { Arch, exec } from "builder-util" import { parseXml } from "builder-util-runtime" import { Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import * as fs from "fs/promises" import * as path from "path" import pathSorter from "path-sort" -import { assertThat } from "../helpers/fileAssert" -import { app, copyTestAsset, createMacTargetTest, getFixtureDir, parseFileList } from "../helpers/packTester" +import { assertThat } from "../helpers/fileAssert.js" +import { app, copyTestAsset, createMacTargetTest, getFixtureDir, parseFileList } from "../helpers/packTester.js" test.ifMac("invalid target", ({ expect }) => expect(createMacTargetTest(expect, ["ttt" as any])).rejects.toThrow()) @@ -54,7 +54,7 @@ test.ifMac("extraDistFiles", ({ expect }) => { signed: false, projectDirCreated: projectDir => { - return Promise.all([outputFile(path.join(projectDir, "extra.txt"), "test")]) + return Promise.all([fsExtra.outputFile(path.join(projectDir, "extra.txt"), "test")]) }, } ) diff --git a/test/src/mac/macCodeSignTest.ts b/test/src/mac/macCodeSignTest.ts index 324b88d6c78..dd7b045f3c2 100644 --- a/test/src/mac/macCodeSignTest.ts +++ b/test/src/mac/macCodeSignTest.ts @@ -1,6 +1,6 @@ -import { createKeychain, removeKeychain } from "app-builder-lib/out/codeSign/macCodeSign" +import { createKeychain, removeKeychain } from "app-builder-lib/internal" import { removePassword, TmpDir } from "builder-util" -import { MAC_CSC_LINK } from "../helpers/codeSignData" +import { MAC_CSC_LINK } from "../helpers/codeSignData.js" import { afterEach } from "vitest" describe.ifMac.runIf(MAC_CSC_LINK && process.env.CSC_KEY_PASSWORD)("macos keychain", { sequential: true }, () => { diff --git a/test/src/mac/macIconTest.ts b/test/src/mac/macIconTest.ts index 18473bd5b7d..8fcdb753147 100644 --- a/test/src/mac/macIconTest.ts +++ b/test/src/mac/macIconTest.ts @@ -1,9 +1,9 @@ -import { parsePlistFile, PlistObject } from "app-builder-lib/out/util/plist" +import { parsePlistFile, PlistObject } from "app-builder-lib/internal" import { Arch, DIR_TARGET, Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { CheckingMacPackager } from "../helpers/CheckingPackager" -import { app } from "../helpers/packTester" +import { CheckingMacPackager } from "../helpers/CheckingPackager.js" +import { app } from "../helpers/packTester.js" import { ExpectStatic } from "vitest" async function assertIcon(expect: ExpectStatic, platformPackager: CheckingMacPackager) { @@ -19,7 +19,7 @@ async function assertIcon(expect: ExpectStatic, platformPackager: CheckingMacPac const targets = Platform.MAC.createTarget(DIR_TARGET, Arch.x64) -const iconComposerFixture = path.join(__dirname, "..", "..", "fixtures", "macos-icon-composer-assets", "electron.icon") +const iconComposerFixture = path.join(import.meta.dirname, "..", "..", "fixtures", "macos-icon-composer-assets", "electron.icon") test.ifMac("icon composer generate asset catalog", ({ expect }) => { return app( diff --git a/test/src/mac/macPackagerTest.ts b/test/src/mac/macPackagerTest.ts index 2bf42b870ff..745cd636d7b 100644 --- a/test/src/mac/macPackagerTest.ts +++ b/test/src/mac/macPackagerTest.ts @@ -2,9 +2,9 @@ import { copyOrLinkFile } from "builder-util" import { Arch, createTargets, DIR_TARGET, Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { assertThat } from "../helpers/fileAssert" -import { app, appThrows, assertPack, checkDirContents, platform } from "../helpers/packTester" -import { verifySmartUnpack } from "../helpers/verifySmartUnpack" +import { assertThat } from "../helpers/fileAssert.js" +import { app, appThrows, assertPack, checkDirContents, platform } from "../helpers/packTester.js" +import { verifySmartUnpack } from "../helpers/verifySmartUnpack.js" describe("macPackager", { sequential: true }, () => { test.ifMac("two-package", ({ expect }) => diff --git a/test/src/mac/masTest.ts b/test/src/mac/masTest.ts index 7534cef4b07..b0d57625b5b 100644 --- a/test/src/mac/masTest.ts +++ b/test/src/mac/masTest.ts @@ -1,7 +1,7 @@ import { Arch, Platform } from "electron-builder" import * as path from "path" -import { CheckingMacPackager } from "../helpers/CheckingPackager" -import { assertPack, createMacTargetTest, signed } from "../helpers/packTester" +import { CheckingMacPackager } from "../helpers/CheckingPackager.js" +import { assertPack, createMacTargetTest, signed } from "../helpers/packTester.js" describe.ifEnv(process.platform === "darwin" && process.env.CSC_KEY_PASSWORD != null)("mas", () => { test("mas", ({ expect }) => createMacTargetTest(expect, ["mas"])) diff --git a/test/src/macroExpanderTest.ts b/test/src/macroExpanderTest.ts index 6cdb81fc3a4..1eb073d8ed1 100644 --- a/test/src/macroExpanderTest.ts +++ b/test/src/macroExpanderTest.ts @@ -1,4 +1,4 @@ -import { expandMacro } from "app-builder-lib/out/util/macroExpander" +import { expandMacro } from "app-builder-lib/internal" const appInfoStub: any = { sanitizedProductName: "1", diff --git a/test/src/mainEntryTest.ts b/test/src/mainEntryTest.ts index 15237cb87f7..72d2904a7ab 100644 --- a/test/src/mainEntryTest.ts +++ b/test/src/mainEntryTest.ts @@ -1,7 +1,7 @@ import { createTargets, DIR_TARGET, Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { appTwoThrows, assertPack, modifyPackageJson } from "./helpers/packTester" +import { appTwoThrows, assertPack, modifyPackageJson } from "./helpers/packTester.js" const packagerOptions = { targets: createTargets([Platform.LINUX, Platform.MAC], DIR_TARGET), diff --git a/test/src/packageManagerTest.ts b/test/src/packageManagerTest.ts index 56abc0d8d14..b22b3c40bdd 100644 --- a/test/src/packageManagerTest.ts +++ b/test/src/packageManagerTest.ts @@ -1,10 +1,10 @@ import { Platform } from "app-builder-lib" -import { PM } from "app-builder-lib/src/node-module-collector" -import { copyFile, outputFile, rm, writeFile } from "fs-extra" +import { PM } from "app-builder-lib/internal" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "./helpers/fileAssert" -import { app, assertPack, getFixtureDir, getPackageManagerWithVersion, linuxDirTarget, modifyPackageJson, verifyAsarFileTree } from "./helpers/packTester" -import { ELECTRON_VERSION } from "./helpers/testConfig" +import { assertThat } from "./helpers/fileAssert.js" +import { app, assertPack, getFixtureDir, getPackageManagerWithVersion, linuxDirTarget, modifyPackageJson, verifyAsarFileTree } from "./helpers/packTester.js" +import { ELECTRON_VERSION } from "./helpers/testConfig.js" import { isEmptyOrSpaces, spawn } from "builder-util" import * as which from "which" @@ -48,10 +48,10 @@ describe.ifNotWindows("Package Managers", () => { false ) await modifyPackageJson(projectDir, data => packageConfig(data, yarnVersion), true) - await writeFile(path.join(projectDir, "yarn.lock"), "") - await writeFile(path.join(projectDir, "app", "yarn.lock"), "") - await copyFile(path.join(getFixtureDir(), ".pnp.cjs"), path.join(projectDir, ".pnp.cjs")) - await rm(path.join(projectDir, ".yarnrc.yml")) + await fsExtra.writeFile(path.join(projectDir, "yarn.lock"), "") + await fsExtra.writeFile(path.join(projectDir, "app", "yarn.lock"), "") + await fsExtra.copyFile(path.join(getFixtureDir(), ".pnp.cjs"), path.join(projectDir, ".pnp.cjs")) + await fsExtra.rm(path.join(projectDir, ".yarnrc.yml")) await spawn("yarn", ["install"], { cwd: projectDir, env: testEnv, @@ -85,9 +85,9 @@ describe.ifNotWindows("Package Managers", () => { false ) await modifyPackageJson(projectDir, data => packageConfig(data, yarnBerryVersion), true) - await writeFile(path.join(projectDir, "yarn.lock"), "") - await writeFile(path.join(projectDir, "app", "yarn.lock"), "") - await copyFile(path.join(getFixtureDir(), ".pnp.cjs"), path.join(projectDir, ".pnp.cjs")) + await fsExtra.writeFile(path.join(projectDir, "yarn.lock"), "") + await fsExtra.writeFile(path.join(projectDir, "app", "yarn.lock"), "") + await fsExtra.copyFile(path.join(getFixtureDir(), ".pnp.cjs"), path.join(projectDir, ".pnp.cjs")) await spawn("yarn", ["install"], { cwd: projectDir, env: testEnv, @@ -255,7 +255,7 @@ describe.ifNotWindows("Package Managers", () => { "left-pad": "1.3.0", } }), - outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "isolated"\n'), + fsExtra.outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "isolated"\n'), ]) }, packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)), @@ -298,7 +298,7 @@ describe.ifNotWindows("Package Managers", () => { "is-bigint": "1.0.4", } }), - outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "isolated"\n'), + fsExtra.outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "isolated"\n'), ]) }, packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)), @@ -339,7 +339,7 @@ describe.ifNotWindows("Package Managers", () => { "left-pad": "1.3.0", } }), - outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "hoisted"\n'), + fsExtra.outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "hoisted"\n'), ]) }, packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)), @@ -382,7 +382,7 @@ describe.ifNotWindows("Package Managers", () => { "is-bigint": "1.0.4", } }), - outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "hoisted"\n'), + fsExtra.outputFile(path.join(projectDir, "bunfig.toml"), '[install]\nlinker = "hoisted"\n'), ]) }, packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)), @@ -409,8 +409,8 @@ describe.ifNotWindows("Package Managers", () => { false ) await modifyPackageJson(projectDir, data => packageConfig(data, yarnBerryVersion), true) - await writeFile(path.join(projectDir, "yarn.lock"), "") - await writeFile(path.join(projectDir, "app", "yarn.lock"), "") + await fsExtra.writeFile(path.join(projectDir, "yarn.lock"), "") + await fsExtra.writeFile(path.join(projectDir, "app", "yarn.lock"), "") }, } )) @@ -477,8 +477,8 @@ describe.ifNotWindows("Package Managers", () => { projectDirCreated: async (projectDir, tmpDir, testEnv) => { const tempDir = await tmpDir.getTempDir() const localPath = path.join(tempDir, "foo") - await outputFile(path.join(localPath, "package.json"), `{"name":"foo","version":"9.0.0","main":"index.js","license":"MIT","dependencies":{"ms":"2.0.0"}}`) - await outputFile(path.join(localPath, "index.js"), `module.exports = require("ms")`) + await fsExtra.outputFile(path.join(localPath, "package.json"), `{"name":"foo","version":"9.0.0","main":"index.js","license":"MIT","dependencies":{"ms":"2.0.0"}}`) + await fsExtra.outputFile(path.join(localPath, "index.js"), `module.exports = require("ms")`) const pmCommand = getPackageManagerWithVersion(pm).cli await spawn(pmCommand, ["install"], { diff --git a/test/src/parseNameVersionTest.ts b/test/src/parseNameVersionTest.ts index 33b3600d03d..1dc3151ac50 100644 --- a/test/src/parseNameVersionTest.ts +++ b/test/src/parseNameVersionTest.ts @@ -1,4 +1,4 @@ -import { PnpmNodeModulesCollector } from "app-builder-lib/out/node-module-collector/pnpmNodeModulesCollector" +import { PnpmNodeModulesCollector } from "app-builder-lib/internal" import { TmpDir } from "temp-file" import { describe, expect, test } from "vitest" diff --git a/test/src/protonTest.ts b/test/src/protonTest.ts index db3ba672e4e..712318615f3 100644 --- a/test/src/protonTest.ts +++ b/test/src/protonTest.ts @@ -1,6 +1,6 @@ import { copyDir } from "builder-util" import { Arch, Platform } from "electron-builder" -import { app, AssertPackOptions } from "./helpers/packTester" +import { app, AssertPackOptions } from "./helpers/packTester.js" const checkOptions: AssertPackOptions = { projectDirCreated: async projectDir => { diff --git a/test/src/provider/bitbucketProviderTest.ts b/test/src/provider/bitbucketProviderTest.ts index 6be64a26492..8aa89124e0a 100644 --- a/test/src/provider/bitbucketProviderTest.ts +++ b/test/src/provider/bitbucketProviderTest.ts @@ -1,6 +1,6 @@ import { BitbucketOptions } from "builder-util-runtime" -import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil" -import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil.js" +import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil.js" const MOCK_OWNER = "test-owner" const MOCK_SLUG = "test-repo" diff --git a/test/src/provider/githubProviderTest.ts b/test/src/provider/githubProviderTest.ts index c6917cb91c0..b2dea165234 100644 --- a/test/src/provider/githubProviderTest.ts +++ b/test/src/provider/githubProviderTest.ts @@ -1,7 +1,7 @@ import { GithubOptions, HttpError, UpdateInfo } from "builder-util-runtime" -import { GitHubProvider } from "electron-updater/src/providers/GitHubProvider" -import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil" -import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { GitHubProvider } from "electron-updater/src/providers/GitHubProvider.js" +import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil.js" +import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil.js" const MOCK_OWNER = "test-owner" const MOCK_REPO = "test-public-repo" @@ -167,9 +167,7 @@ test("getLatestTagName failure - throws ERR_UPDATER_INVALID_RELEASE_FEED", async const updater = await createPublicUpdater(requestSpy) updater.allowPrerelease = false - requestSpy - .mockResolvedValueOnce(mockAtomFeed([{ tag: STABLE_TAG, title: STABLE_TAG }])) - .mockRejectedValueOnce(new Error("Connection refused")) + requestSpy.mockResolvedValueOnce(mockAtomFeed([{ tag: STABLE_TAG, title: STABLE_TAG }])).mockRejectedValueOnce(new Error("Connection refused")) await expect(updater.checkForUpdates()).rejects.toMatchObject({ code: "ERR_UPDATER_INVALID_RELEASE_FEED" }) }) diff --git a/test/src/provider/gitlabProviderTest.ts b/test/src/provider/gitlabProviderTest.ts index f97521b2532..ad9a7ad1207 100644 --- a/test/src/provider/gitlabProviderTest.ts +++ b/test/src/provider/gitlabProviderTest.ts @@ -1,7 +1,7 @@ import { GitlabOptions, GitlabReleaseInfo, HttpError } from "builder-util-runtime" -import { GitLabProvider } from "electron-updater/src/providers/GitLabProvider" -import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil" -import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { GitLabProvider } from "electron-updater/src/providers/GitLabProvider.js" +import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil.js" +import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil.js" const MOCK_PROJECT_ID = 99999999 const STABLE_VERSION = "1.1.0" diff --git a/test/src/provider/keygenProviderTest.ts b/test/src/provider/keygenProviderTest.ts index f48329730d5..6ec7c234074 100644 --- a/test/src/provider/keygenProviderTest.ts +++ b/test/src/provider/keygenProviderTest.ts @@ -1,6 +1,6 @@ import { KeygenOptions } from "builder-util-runtime" -import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil" -import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil.js" +import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil.js" const MOCK_ACCOUNT = "test-account-id" const MOCK_PRODUCT = "test-product-id" diff --git a/test/src/provider/privateGithubProviderTest.ts b/test/src/provider/privateGithubProviderTest.ts index f3e82623c09..aa2a3669cb6 100644 --- a/test/src/provider/privateGithubProviderTest.ts +++ b/test/src/provider/privateGithubProviderTest.ts @@ -1,7 +1,7 @@ import { GithubOptions, HttpError } from "builder-util-runtime" -import { PrivateGitHubProvider, PrivateGitHubUpdateInfo } from "electron-updater/src/providers/PrivateGitHubProvider" -import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil" -import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { PrivateGitHubProvider, PrivateGitHubUpdateInfo } from "electron-updater/src/providers/PrivateGitHubProvider.js" +import { assertDownloadNotTriggered, getProvider, mockYaml } from "../helpers/providerTestUtil.js" +import { createMockRequest, createNsisUpdater, trackEvents, writeUpdateConfig } from "../helpers/updaterTestUtil.js" const MOCK_TOKEN = "ghp_test-token-12345" const MOCK_OWNER = "test-owner" diff --git a/test/src/provider/providerTest.ts b/test/src/provider/providerTest.ts index 07b728e5151..09fbbb917ab 100644 --- a/test/src/provider/providerTest.ts +++ b/test/src/provider/providerTest.ts @@ -1,10 +1,10 @@ import { CancellationToken, UpdateInfo } from "builder-util-runtime" -import { Provider, ProviderRuntimeOptions } from "electron-updater/src/providers/Provider" -import { ResolvedUpdateFileInfo } from "electron-updater/src/types" +import { Provider, ProviderRuntimeOptions } from "electron-updater" +import { ResolvedUpdateFileInfo } from "electron-updater/src/types.js" import { OutgoingHttpHeaders } from "http" import { URL } from "url" import { MockInstance, afterEach, beforeEach, vi } from "vitest" -import { httpExecutor } from "../helpers/updaterTestUtil" +import { httpExecutor } from "../helpers/updaterTestUtil.js" let requestSpy: MockInstance diff --git a/test/src/publisher/gitlab/GitlabPublisher.integration.test.ts b/test/src/publisher/gitlab/GitlabPublisher.integration.test.ts index 3321d335553..e5e58eb0d85 100644 --- a/test/src/publisher/gitlab/GitlabPublisher.integration.test.ts +++ b/test/src/publisher/gitlab/GitlabPublisher.integration.test.ts @@ -2,8 +2,8 @@ import { Arch } from "builder-util" import { CancellationToken } from "builder-util-runtime" import { GitlabPublisher, PublishContext } from "electron-publish" import { afterAll, beforeEach, describe, expect, test } from "vitest" -import { GitlabTestFixtures } from "./GitlabTestFixtures" -import { GitlabTestHelper } from "./GitlabTestHelper" +import { GitlabTestFixtures } from "./GitlabTestFixtures.js" +import { GitlabTestHelper } from "./GitlabTestHelper.js" /** * GitLab Publisher Integration Tests diff --git a/test/src/publisher/gitlab/GitlabPublisherTest.ts b/test/src/publisher/gitlab/GitlabPublisherTest.ts index 8563fb86e1d..c09ac27b953 100644 --- a/test/src/publisher/gitlab/GitlabPublisherTest.ts +++ b/test/src/publisher/gitlab/GitlabPublisherTest.ts @@ -1,7 +1,7 @@ import { CancellationToken, GitlabOptions } from "builder-util-runtime" import { GitlabPublisher, PublishContext } from "electron-publish" import { beforeEach, describe, test, vi } from "vitest" -import { GitlabTestFixtures } from "./GitlabTestFixtures" +import { GitlabTestFixtures } from "./GitlabTestFixtures.js" // Mock the HTTP executor to avoid real network calls vi.mock("builder-util", async () => { diff --git a/test/src/publisher/gitlab/GitlabTestFixtures.ts b/test/src/publisher/gitlab/GitlabTestFixtures.ts index e34bcebff6d..17e202881a6 100644 --- a/test/src/publisher/gitlab/GitlabTestFixtures.ts +++ b/test/src/publisher/gitlab/GitlabTestFixtures.ts @@ -3,8 +3,8 @@ import { GitlabOptions } from "builder-util-runtime" export class GitlabTestFixtures { // Test file paths - static readonly ICON_PATH = path.join(__dirname, "..", "..", "..", "fixtures", "test-app", "build", "icon.icns") - static readonly ICO_PATH = path.join(__dirname, "..", "..", "..", "fixtures", "test-app", "build", "icon.ico") + static readonly ICON_PATH = path.join(import.meta.dirname, "..", "..", "..", "fixtures", "test-app", "build", "icon.icns") + static readonly ICO_PATH = path.join(import.meta.dirname, "..", "..", "..", "fixtures", "test-app", "build", "icon.ico") // Test versions static readonly VERSIONS = { diff --git a/test/src/rebuilderTest.ts b/test/src/rebuilderTest.ts index b39e56adf04..76e322bbf73 100644 --- a/test/src/rebuilderTest.ts +++ b/test/src/rebuilderTest.ts @@ -1,10 +1,10 @@ import { Configuration, Platform } from "app-builder-lib" -import { PM } from "app-builder-lib/out/node-module-collector" -import { exists } from "builder-util/src/util" +import { PM } from "app-builder-lib/internal" +import { exists } from "builder-util" import path from "path" -import { assertPack, linuxDirTarget, modifyPackageJson } from "./helpers/packTester" -import { ELECTRON_VERSION } from "./helpers/testConfig" -import { verifySmartUnpack } from "./helpers/verifySmartUnpack" +import { assertPack, linuxDirTarget, modifyPackageJson } from "./helpers/packTester.js" +import { ELECTRON_VERSION } from "./helpers/testConfig.js" +import { verifySmartUnpack } from "./helpers/verifySmartUnpack.js" const packageConfig = (data: any) => { data.name = "@packageManagers/test-app-yarn-workspace" diff --git a/test/src/updater/blackboxUpdateTest.ts b/test/src/updater/blackboxUpdateTest.ts index a6be9048785..f312cf02b14 100644 --- a/test/src/updater/blackboxUpdateTest.ts +++ b/test/src/updater/blackboxUpdateTest.ts @@ -1,7 +1,7 @@ import { ToolsetConfig } from "app-builder-lib" -import { PM } from "app-builder-lib/src/node-module-collector" +import { PM } from "app-builder-lib/internal" import { GenericServerOptions, Nullish } from "builder-util-runtime" -import { archFromString, doSpawn, getArchSuffix, isEmptyOrSpaces, log, spawn, TmpDir } from "builder-util/out/util" +import { archFromString, doSpawn, getArchSuffix, isEmptyOrSpaces, log, spawn, TmpDir } from "builder-util" import { execFileSync, execSync } from "child_process" import { Arch, Configuration, Platform } from "electron-builder" import { DebUpdater, PacmanUpdater, RpmUpdater } from "electron-updater" @@ -9,14 +9,15 @@ import { copy, existsSync, move, outputFile, readJsonSync } from "fs-extra" import { homedir } from "os" import path from "path" import { ExpectStatic, TestContext } from "vitest" -import { getRanLocalServerPath, launchAndWaitForQuit } from "../helpers/launchAppCrossPlatform" -import { assertPack, modifyPackageJson, PackedContext } from "../helpers/packTester" -import { ELECTRON_VERSION } from "../helpers/testConfig" -import { NEW_VERSION_NUMBER, OLD_VERSION_NUMBER, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { getRanLocalServerPath, launchAndWaitForQuit } from "../helpers/launchAppCrossPlatform.js" +import { assertPack, modifyPackageJson, PackedContext } from "../helpers/packTester.js" +import { ELECTRON_VERSION } from "../helpers/testConfig.js" +import { NEW_VERSION_NUMBER, OLD_VERSION_NUMBER, writeUpdateConfig } from "../helpers/updaterTestUtil.js" +const optionsForFlakyE2E = { sequential: true, retry: 2 } // Linux Tests MUST be run in docker containers for proper ephemeral testing environment (e.g. fresh install + update + relaunch) // Currently this test logic does not handle uninstalling packages (yet) -describe.heavy.ifMac.ifEnv(process.env.CSC_KEY_PASSWORD)("mac", { sequential: true }, () => { +describe.ifMac.heavy("mac", optionsForFlakyE2E, () => { // can test on x64 and also arm64 (via rosetta) test("x64", async context => { await runTest(context, "zip", "", Arch.x64) @@ -33,8 +34,8 @@ describe.heavy.ifMac.ifEnv(process.env.CSC_KEY_PASSWORD)("mac", { sequential: tr const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] for (const winCodeSign of winCodeSignVersions) { - describe(`winCodeSign: ${winCodeSign}`, { sequential: true }, () => { - describe.heavy.ifWindows("windows", { sequential: true }, () => { + describe(`winCodeSign: ${winCodeSign}`, optionsForFlakyE2E, () => { + describe.heavy.ifWindows("windows", optionsForFlakyE2E, () => { test("nsis", async context => { await runTest(context, "nsis", "", Arch.x64, { winCodeSign }) }) @@ -44,9 +45,9 @@ for (const winCodeSign of winCodeSignVersions) { const appImageToolVersions: ToolsetConfig["appimage"][] = ["0.0.0", "1.0.2", "1.0.3"] // must be sequential in order for process.env.ELECTRON_BUILDER_LINUX_PACKAGE_MANAGER to be respected per-test -describe.heavy.ifLinux("linux", { sequential: true }, () => { +describe.heavy.ifLinux("linux", optionsForFlakyE2E, () => { for (const appimage of appImageToolVersions) { - describe(`appimage tool: ${appimage}`, () => { + describe(`appimage tool: ${appimage}`, optionsForFlakyE2E, () => { test.ifEnv(process.env.RUN_APP_IMAGE_TEST === "true" && process.arch === "arm64")("AppImage - arm64", async context => { await runTest(context, "AppImage", "appimage", Arch.arm64, { appimage }) }) @@ -62,7 +63,7 @@ describe.heavy.ifLinux("linux", { sequential: true }, () => { for (const distro in packageManagerMap) { const { pms, target } = packageManagerMap[distro as keyof typeof packageManagerMap] for (const pm of pms) { - test(`${distro} - (${pm})`, { sequential: true }, async context => { + test(`${distro} - (${pm})`, optionsForFlakyE2E, async context => { if (!determineEnvironment(distro)) { context.skip() } @@ -202,6 +203,16 @@ async function doBuild( name: "testapp", version, }, + electronFuses: { + runAsNode: false, + enableCookieEncryption: true, + enableNodeOptionsEnvironmentVariable: false, + enableNodeCliInspectArguments: false, + enableEmbeddedAsarIntegrityValidation: true, + onlyLoadAppFromAsar: true, + loadBrowserProcessSpecificV8Snapshot: false, + grantFileProtocolExtraPrivileges: false, + }, electronUpdaterCompatibility: "1.1", // anything above 1.0.0 works. This is to allow testing via `link:` protocol with the current workspace electron-updater package version ...extraConfig, compression: "store", @@ -236,7 +247,7 @@ async function doBuild( electron: ELECTRON_VERSION, "node-addon-api": "^8", } - const electronUpdaterPath = (pkg: string) => path.resolve(__dirname, "../../../packages", pkg) + const electronUpdaterPath = (pkg: string) => path.resolve(import.meta.dirname, "../../../packages", pkg) const updaterPath = electronUpdaterPath("electron-updater") const utilPath = electronUpdaterPath("builder-util-runtime") data.dependencies = { diff --git a/test/src/updater/differentialUpdateTest.ts b/test/src/updater/differentialUpdateTest.ts index cb0f90ca5f9..213e660f14c 100644 --- a/test/src/updater/differentialUpdateTest.ts +++ b/test/src/updater/differentialUpdateTest.ts @@ -3,16 +3,16 @@ import { archFromString, doSpawn, getArchSuffix } from "builder-util" import { GenericServerOptions, Nullish, S3Options } from "builder-util-runtime" import { AppImageUpdater, BaseUpdater, MacUpdater, NsisUpdater } from "electron-updater" import { EventEmitter } from "events" -import { move } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" import { TmpDir } from "temp-file" -import { TestAppAdapter } from "../helpers/TestAppAdapter" -import { EXTENDED_TIMEOUT, PackedContext, assertPack, removeUnstableProperties } from "../helpers/packTester" -import { NEW_VERSION_NUMBER, OLD_VERSION_NUMBER, testAppCacheDirName, tuneTestUpdater, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { TestAppAdapter } from "../helpers/TestAppAdapter.js" +import { EXTENDED_TIMEOUT, PackedContext, assertPack, removeUnstableProperties } from "../helpers/packTester.js" +import { NEW_VERSION_NUMBER, OLD_VERSION_NUMBER, testAppCacheDirName, tuneTestUpdater, writeUpdateConfig } from "../helpers/updaterTestUtil.js" import { mockForNodeRequire } from "vitest-mock-commonjs" import { ExpectStatic } from "vitest" -import { getRanLocalServerPath } from "../helpers/launchAppCrossPlatform" -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { getRanLocalServerPath } from "../helpers/launchAppCrossPlatform.js" +import { ToolsetConfig } from "app-builder-lib/out/configuration.js" async function doBuild( expect: ExpectStatic, @@ -58,7 +58,7 @@ async function doBuild( buildApp(version, targets, extraConfig, async context => { // move dist temporarily out of project dir so each downloader can reference it const newDir = await tmpDir.getTempDir({ prefix: version }) - await move(context.outDir, newDir) + await fsExtra.move(context.outDir, newDir) outDirs.push(newDir) }) try { @@ -81,7 +81,7 @@ for (const winCodeSign of winCodeSignVersions) { await doBuild(expect, outDirs, Platform.WINDOWS.createTarget(["nsis-web"], Arch.x64, Arch.arm64), tmpDir, { winCodeSign }) const oldDir = outDirs[0] - await move( + await fsExtra.move( path.join(oldDir, "nsis-web", `TestApp-${OLD_VERSION_NUMBER}${getArchSuffix(archFromString(process.arch), "universal")}.nsis.7z`), path.join(getTestUpdaterCacheDir(oldDir), testAppCacheDirName, "package.7z") ) @@ -96,8 +96,8 @@ for (const winCodeSign of winCodeSignVersions) { const oldDir = outDirs[0] // move to new dir so that localhost server can read both blockmaps - await move(path.join(oldDir, `Test App ßW Setup ${OLD_VERSION_NUMBER}.exe`), path.join(getTestUpdaterCacheDir(oldDir), testAppCacheDirName, "installer.exe")) - await move(path.join(oldDir, `Test App ßW Setup ${OLD_VERSION_NUMBER}.exe.blockmap`), path.join(outDirs[1], "Test App ßW Setup 1.0.0.exe.blockmap")) + await fsExtra.move(path.join(oldDir, `Test App ßW Setup ${OLD_VERSION_NUMBER}.exe`), path.join(getTestUpdaterCacheDir(oldDir), testAppCacheDirName, "installer.exe")) + await fsExtra.move(path.join(oldDir, `Test App ßW Setup ${OLD_VERSION_NUMBER}.exe.blockmap`), path.join(outDirs[1], "Test App ßW Setup 1.0.0.exe.blockmap")) await testBlockMap(expect, outDirs[0], outDirs[1], NsisUpdater, Platform.WINDOWS, Arch.x64) }) @@ -148,8 +148,11 @@ async function testMac(expect: ExpectStatic, arch: Arch) { // move to new dir so that localhost server can read both blockmaps const oldDir = outDirs[0] const blockmap = `Test App ßW-${OLD_VERSION_NUMBER}${getArchSuffix(arch)}-mac.zip.blockmap` - await move(path.join(oldDir, blockmap), path.join(outDirs[1], blockmap)) - await move(path.join(oldDir, `Test App ßW-${OLD_VERSION_NUMBER}${getArchSuffix(arch)}-mac.zip`), path.join(getTestUpdaterCacheDir(oldDir), testAppCacheDirName, "update.zip")) + await fsExtra.move(path.join(oldDir, blockmap), path.join(outDirs[1], blockmap)) + await fsExtra.move( + path.join(oldDir, `Test App ßW-${OLD_VERSION_NUMBER}${getArchSuffix(arch)}-mac.zip`), + path.join(getTestUpdaterCacheDir(oldDir), testAppCacheDirName, "update.zip") + ) await testBlockMap(expect, outDirs[0], outDirs[1], MacUpdater, Platform.MAC, arch, "Test App ßW") } finally { diff --git a/test/src/updater/linuxUpdaterTest.ts b/test/src/updater/linuxUpdaterTest.ts index bc3f619dbba..bcc2a833d4c 100644 --- a/test/src/updater/linuxUpdaterTest.ts +++ b/test/src/updater/linuxUpdaterTest.ts @@ -1,7 +1,7 @@ import { GithubOptions } from "builder-util-runtime" import { AppUpdater, DebUpdater, PacmanUpdater, RpmUpdater } from "electron-updater" -import { assertThat } from "../helpers/fileAssert" -import { createTestAppAdapter, tuneTestUpdater, validateDownload, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { assertThat } from "../helpers/fileAssert.js" +import { createTestAppAdapter, tuneTestUpdater, validateDownload, writeUpdateConfig } from "../helpers/updaterTestUtil.js" import { ExpectStatic } from "vitest" import { execSync } from "child_process" diff --git a/test/src/updater/macUpdaterTest.ts b/test/src/updater/macUpdaterTest.ts index f107e4d66dc..f51c0fb1ae0 100644 --- a/test/src/updater/macUpdaterTest.ts +++ b/test/src/updater/macUpdaterTest.ts @@ -1,8 +1,8 @@ import { configureRequestOptionsFromUrl, GithubOptions } from "builder-util-runtime" -import { MacUpdater } from "electron-updater/out/MacUpdater" +import { MacUpdater } from "electron-updater" import { EventEmitter } from "events" -import { assertThat } from "../helpers/fileAssert" -import { createTestAppAdapter, httpExecutor, trackEvents, tuneTestUpdater, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { assertThat } from "../helpers/fileAssert.js" +import { createTestAppAdapter, httpExecutor, trackEvents, tuneTestUpdater, writeUpdateConfig } from "../helpers/updaterTestUtil.js" import { mockForNodeRequire } from "vitest-mock-commonjs" class TestNativeUpdater extends EventEmitter { diff --git a/test/src/updater/nsisUpdaterTest.ts b/test/src/updater/nsisUpdaterTest.ts index eb1b3913068..1a786a22669 100644 --- a/test/src/updater/nsisUpdaterTest.ts +++ b/test/src/updater/nsisUpdaterTest.ts @@ -1,15 +1,14 @@ import { BitbucketOptions, GenericServerOptions, GithubOptions, GitlabOptions, KeygenOptions, S3Options, SpacesOptions } from "builder-util-runtime" import { BitbucketPublisher } from "electron-publish" import { UpdateCheckResult } from "electron-updater" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { tmpdir } from "os" import * as path from "path" -import { assertThat } from "../helpers/fileAssert" -import { removeUnstableProperties } from "../helpers/packTester" -import { createNsisUpdater, trackEvents, validateDownload, writeUpdateConfig } from "../helpers/updaterTestUtil" +import { assertThat } from "../helpers/fileAssert.js" +import { removeUnstableProperties } from "../helpers/packTester.js" +import { createNsisUpdater, trackEvents, validateDownload, writeUpdateConfig } from "../helpers/updaterTestUtil.js" import { ExpectStatic } from "vitest" -import { GitLabProvider } from "electron-updater/src/providers/GitLabProvider" -import { GitHubProvider } from "electron-updater/src/providers/GitHubProvider" +import { GitLabProvider, GitHubProvider } from "electron-updater" const config = { retry: 3 } @@ -471,7 +470,7 @@ test.ifWindows("test custom signature verifier - signing error message", config, // disable for now test("90 staging percentage", config, async ({ expect }) => { const userIdFile = path.join(tmpdir(), "electron-updater-test", "userData", ".updaterId") - await outputFile(userIdFile, "1wa70172-80f8-5cc4-8131-28f5e0edd2a1") + await fsExtra.outputFile(userIdFile, "1wa70172-80f8-5cc4-8131-28f5e0edd2a1") const updater = await createNsisUpdater("0.0.1") updater.updateConfigPath = await writeUpdateConfig({ @@ -485,7 +484,7 @@ test("90 staging percentage", config, async ({ expect }) => { test("1 staging percentage", config, async ({ expect }) => { const userIdFile = path.join(tmpdir(), "electron-updater-test", "userData", ".updaterId") - await outputFile(userIdFile, "12a70172-80f8-5cc4-8131-28f5e0edd2a1") + await fsExtra.outputFile(userIdFile, "12a70172-80f8-5cc4-8131-28f5e0edd2a1") const updater = await createNsisUpdater("0.0.1") updater.updateConfigPath = await writeUpdateConfig({ diff --git a/test/src/urlUtilTest.ts b/test/src/urlUtilTest.ts index 93635d211df..f9aeb73c2ff 100644 --- a/test/src/urlUtilTest.ts +++ b/test/src/urlUtilTest.ts @@ -1,14 +1,14 @@ -import { newUrlFromBase } from "electron-updater/out/util" +import { utils } from "electron-updater/internal" import { URL } from "url" test("newUrlFromBase", ({ expect }) => { const fileUrl = new URL("https://AWS_S3_HOST/bucket-yashraj/electron%20Setup%2011.0.3.exe") - const newBlockMapUrl = newUrlFromBase(`${fileUrl.pathname}.blockmap`, fileUrl) + const newBlockMapUrl = utils.newUrlFromBase(`${fileUrl.pathname}.blockmap`, fileUrl) expect(newBlockMapUrl.href).toBe("https://aws_s3_host/bucket-yashraj/electron%20Setup%2011.0.3.exe.blockmap") }) test("add no cache", ({ expect }) => { const baseUrl = new URL("https://gitlab.com/artifacts/master/raw/dist?job=build_electron_win") - const newBlockMapUrl = newUrlFromBase("latest.yml", baseUrl, true) + const newBlockMapUrl = utils.newUrlFromBase("latest.yml", baseUrl, true) expect(newBlockMapUrl.href).toBe("https://gitlab.com/artifacts/master/raw/latest.yml?job=build_electron_win") }) diff --git a/test/src/windows/appxTest.ts b/test/src/windows/appxTest.ts index a61b5cd9dce..b4acba43b6b 100644 --- a/test/src/windows/appxTest.ts +++ b/test/src/windows/appxTest.ts @@ -1,8 +1,8 @@ import { Arch, Platform } from "electron-builder" -import { readFile } from "fs-extra" +import fsExtra from "fs-extra" import { mkdir } from "fs/promises" import * as path from "path" -import { app, appThrows, copyTestAsset } from "../helpers/packTester" +import { app, appThrows, copyTestAsset } from "../helpers/packTester.js" import { ToolsetConfig } from "app-builder-lib" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = [ @@ -125,7 +125,7 @@ describe.ifWindows("AppX", () => { customManifestPath: "custom-template-manifest.xml", }, appxManifestCreated: async filepath => { - const fileContent = await readFile(filepath, "utf-8") + const fileContent = await fsExtra.readFile(filepath, "utf-8") expect(fileContent).toMatchSnapshot() }, }, @@ -140,7 +140,7 @@ describe.ifWindows("AppX", () => { customManifestPath: "custom-manifest.xml", }, appxManifestCreated: async filepath => { - const fileContent = await readFile(filepath, "utf-8") + const fileContent = await fsExtra.readFile(filepath, "utf-8") expect(fileContent).toMatchSnapshot() }, }, @@ -157,7 +157,7 @@ describe.ifWindows("AppX", () => { capabilities: ["internetClient", "picturesLibrary", "webcam", "screenDuplication", "graphicsCapture", "globalMediaControl"], }, appxManifestCreated: async filepath => { - const fileContent = await readFile(filepath, "utf-8") + const fileContent = await fsExtra.readFile(filepath, "utf-8") console.log("APPX-MANIFEST: " + fileContent) expect(fileContent).toContain('') expect(fileContent).toContain('') diff --git a/test/src/windows/assistedInstallerTest.ts b/test/src/windows/assistedInstallerTest.ts index d7758c5e8e1..24862ce1cad 100644 --- a/test/src/windows/assistedInstallerTest.ts +++ b/test/src/windows/assistedInstallerTest.ts @@ -1,9 +1,9 @@ import { Arch, Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { app, assertPack, copyTestAsset } from "../helpers/packTester" -import { checkHelpers, doTest, expectUpdateMetadata } from "../helpers/winHelper" -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { app, assertPack, copyTestAsset } from "../helpers/packTester.js" +import { checkHelpers, doTest, expectUpdateMetadata } from "../helpers/winHelper.js" +import { ToolsetConfig } from "app-builder-lib" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] const nsisTarget = Platform.WINDOWS.createTarget("nsis", Arch.x64) diff --git a/test/src/windows/msiTest.ts b/test/src/windows/msiTest.ts index 61eb3227077..bf21c72c1fb 100644 --- a/test/src/windows/msiTest.ts +++ b/test/src/windows/msiTest.ts @@ -1,6 +1,6 @@ import { Arch, Platform } from "electron-builder" import * as fs from "fs" -import { app } from "../helpers/packTester" +import { app } from "../helpers/packTester.js" import { ToolsetConfig } from "app-builder-lib" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] diff --git a/test/src/windows/msiWrappedTest.ts b/test/src/windows/msiWrappedTest.ts index 22cc72f9596..5a87a12ae6f 100644 --- a/test/src/windows/msiWrappedTest.ts +++ b/test/src/windows/msiWrappedTest.ts @@ -1,8 +1,8 @@ import { Arch, Platform } from "electron-builder" import { XMLParser } from "fast-xml-parser" import * as fs from "fs" -import { app, appThrows } from "../helpers/packTester" -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { app, appThrows } from "../helpers/packTester.js" +import { ToolsetConfig } from "app-builder-lib" const parser = new XMLParser({ ignoreAttributes: false, diff --git a/test/src/windows/oneClickInstallerTest.ts b/test/src/windows/oneClickInstallerTest.ts index 0b2648c3be6..1b56555c214 100644 --- a/test/src/windows/oneClickInstallerTest.ts +++ b/test/src/windows/oneClickInstallerTest.ts @@ -1,9 +1,9 @@ import { Arch, Platform } from "electron-builder" -import { copyFile, writeFile } from "fs-extra" +import fsExtra from "fs-extra" import * as path from "path" -import { assertThat } from "../helpers/fileAssert" -import { app, assertPack, copyTestAsset, EXTENDED_TIMEOUT, modifyPackageJson } from "../helpers/packTester" -import { checkHelpers, doTest, expectUpdateMetadata } from "../helpers/winHelper" +import { assertThat } from "../helpers/fileAssert.js" +import { app, assertPack, copyTestAsset, EXTENDED_TIMEOUT, modifyPackageJson } from "../helpers/packTester.js" +import { checkHelpers, doTest, expectUpdateMetadata } from "../helpers/winHelper.js" const nsisTarget = Platform.WINDOWS.createTarget(["nsis"], Arch.x64) @@ -98,10 +98,10 @@ test("multi language license", { timeout: EXTENDED_TIMEOUT }, ({ expect }) => { projectDirCreated: projectDir => { return Promise.all([ - writeFile(path.join(projectDir, "build", "license_en.txt"), "Hi"), - writeFile(path.join(projectDir, "build", "license_ru.txt"), "Привет"), - writeFile(path.join(projectDir, "build", "license_ko.txt"), "Привет"), - writeFile(path.join(projectDir, "build", "license_fi.txt"), "Привет"), + fsExtra.writeFile(path.join(projectDir, "build", "license_en.txt"), "Hi"), + fsExtra.writeFile(path.join(projectDir, "build", "license_ru.txt"), "Привет"), + fsExtra.writeFile(path.join(projectDir, "build", "license_ko.txt"), "Привет"), + fsExtra.writeFile(path.join(projectDir, "build", "license_fi.txt"), "Привет"), ]) }, } @@ -124,7 +124,7 @@ test("html license", { timeout: EXTENDED_TIMEOUT }, ({ expect }) => { projectDirCreated: projectDir => { return Promise.all([ - writeFile(path.join(projectDir, "build", "license.html"), '

Hi google

'), + fsExtra.writeFile(path.join(projectDir, "build", "license.html"), '

Hi google

'), ]) }, } @@ -239,7 +239,7 @@ test.skip("big file pack", { timeout: EXTENDED_TIMEOUT }, ({ expect }) => }, { projectDirCreated: async projectDir => { - await copyFile("/Volumes/Pegasus/15.02.18.m4v", path.join(projectDir, "foo/bar/video.mov")) + await fsExtra.copyFile("/Volumes/Pegasus/15.02.18.m4v", path.join(projectDir, "foo/bar/video.mov")) }, } ) diff --git a/test/src/windows/portableTest.ts b/test/src/windows/portableTest.ts index 1886faca4d8..de75249bc53 100644 --- a/test/src/windows/portableTest.ts +++ b/test/src/windows/portableTest.ts @@ -1,6 +1,6 @@ import { Arch, Platform } from "electron-builder" import * as path from "path" -import { app, copyTestAsset, getFixtureDir } from "../helpers/packTester" +import { app, copyTestAsset, getFixtureDir } from "../helpers/packTester.js" import { ToolsetConfig } from "app-builder-lib" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] diff --git a/test/src/windows/squirrelWindowsTest.ts b/test/src/windows/squirrelWindowsTest.ts index 5605dd94550..99f2b8a9e17 100644 --- a/test/src/windows/squirrelWindowsTest.ts +++ b/test/src/windows/squirrelWindowsTest.ts @@ -1,7 +1,7 @@ import { Arch, Platform } from "electron-builder" import * as path from "path" -import { CheckingWinPackager } from "../helpers/CheckingPackager" -import { app, assertPack, copyTestAsset } from "../helpers/packTester" +import { CheckingWinPackager } from "../helpers/CheckingPackager.js" +import { app, assertPack, copyTestAsset } from "../helpers/packTester.js" import { ToolsetConfig } from "app-builder-lib" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] diff --git a/test/src/windows/webInstallerTest.ts b/test/src/windows/webInstallerTest.ts index d3e56fa5bed..d031ed7b1e2 100644 --- a/test/src/windows/webInstallerTest.ts +++ b/test/src/windows/webInstallerTest.ts @@ -1,5 +1,5 @@ import { Arch, Platform } from "electron-builder" -import { app } from "../helpers/packTester" +import { app } from "../helpers/packTester.js" // tests are heavy, to distribute tests across CircleCI machines evenly, these tests were moved from oneClickInstallerTest diff --git a/test/src/windows/winCodeSignTest.ts b/test/src/windows/winCodeSignTest.ts index 4ab05b5065e..b573c4f7b04 100644 --- a/test/src/windows/winCodeSignTest.ts +++ b/test/src/windows/winCodeSignTest.ts @@ -1,12 +1,12 @@ import { parseDn } from "builder-util-runtime" import { DIR_TARGET, Platform } from "electron-builder" -import { outputFile } from "fs-extra" +import fsExtra from "fs-extra" import { load } from "js-yaml" import * as path from "path" -import { CheckingWinPackager } from "../helpers/CheckingPackager" -import { app, appThrows } from "../helpers/packTester" +import { CheckingWinPackager } from "../helpers/CheckingPackager.js" +import { app, appThrows } from "../helpers/packTester.js" import { ExpectStatic } from "vitest" -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { ToolsetConfig } from "app-builder-lib" test("parseDn", ({ expect }) => { expect(parseDn("CN=7digital Limited, O=7digital Limited, L=London, C=GB")).toMatchSnapshot() @@ -36,7 +36,7 @@ for (const winCodeSign of winCodeSignVersions) { { signedWin: true, projectDirCreated: async projectDir => { - await outputFile(path.join(projectDir, "assets", "nested", "nested", "file.exe"), "invalid PE file") + await fsExtra.outputFile(path.join(projectDir, "assets", "nested", "nested", "file.exe"), "invalid PE file") }, }, error => { @@ -85,8 +85,8 @@ for (const winCodeSign of winCodeSignVersions) { return Promise.resolve() })) test("certificateFile/password - sign as Promise", ({ expect }) => testCustomSign(expect, () => Promise.resolve())) - test("certificateFile/password - sign as function", async ({ expect }) => testCustomSign(expect, (await import("../helpers/customWindowsSign")).default)) - test("certificateFile/password - sign as path", ({ expect }) => testCustomSign(expect, path.join(__dirname, "../helpers/customWindowsSign.mjs"))) + test("certificateFile/password - sign as function", async ({ expect }) => testCustomSign(expect, (await import("../helpers/customWindowsSign.js")).default)) + test("certificateFile/password - sign as path", ({ expect }) => testCustomSign(expect, path.join(import.meta.dirname, "../helpers/customWindowsSign.mjs"))) test("custom sign if no code sign info", ({ expect }) => { let called = false diff --git a/test/src/windows/winPackagerTest.ts b/test/src/windows/winPackagerTest.ts index cddc4aa1ead..8d327a822ab 100644 --- a/test/src/windows/winPackagerTest.ts +++ b/test/src/windows/winPackagerTest.ts @@ -1,9 +1,9 @@ -import { ToolsetConfig } from "app-builder-lib/src/configuration" +import { ToolsetConfig } from "app-builder-lib" import { Arch, DIR_TARGET, Platform } from "electron-builder" import * as fs from "fs/promises" import * as path from "path" -import { CheckingWinPackager } from "../helpers/CheckingPackager" -import { app, appThrows, assertPack, platform } from "../helpers/packTester" +import { CheckingWinPackager } from "../helpers/CheckingPackager.js" +import { app, appThrows, assertPack, platform } from "../helpers/packTester.js" const winCodeSignVersions: ToolsetConfig["winCodeSign"][] = ["0.0.0", "1.0.0", "1.1.0"] diff --git a/test/tsconfig.json b/test/tsconfig.json index abb32d262e2..6b072b56170 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -4,7 +4,8 @@ "rootDir": ".", "outDir": "out", "skipLibCheck": true, - "baseUrl": "../packages" + "baseUrl": "../packages", + "declaration": false }, "references": [ { @@ -14,23 +15,23 @@ "path": "../packages/builder-util-runtime" }, { - "path": "../packages/electron-builder" + "path": "../packages/app-builder-lib" }, { - "path": "../packages/electron-publish" + "path": "../packages/electron-builder" }, { "path": "../packages/electron-updater" + }, + { + "path": "../packages/electron-publish" } ], - "declaration": false, "include": [ "../typings/*.d.ts", "typings/*.d.ts", "src/**/*.ts", "vitest-scripts/*.ts" ], - "types": ["vitest/globals"], - "exclude": [ - ] + "types": ["vitest/globals"] } diff --git a/test/vitest-scripts/cache.ts b/test/vitest-scripts/cache.ts index 9e81e5d1a6a..1571085cd5a 100644 --- a/test/vitest-scripts/cache.ts +++ b/test/vitest-scripts/cache.ts @@ -1,6 +1,6 @@ import * as fs from "fs" import * as path from "path" -import { CACHE_FILE, SupportedPlatforms } from "./smart-config" +import { CACHE_FILE, SupportedPlatforms } from "./smart-config.js" export interface TestStats { platformRuns?: Record< diff --git a/test/vitest-scripts/file-discovery.ts b/test/vitest-scripts/file-discovery.ts index dc68e15ca5a..15c695d06f5 100644 --- a/test/vitest-scripts/file-discovery.ts +++ b/test/vitest-scripts/file-discovery.ts @@ -1,6 +1,6 @@ import * as fs from "fs" import * as path from "path" -import { IS_LINUX, IS_MAC, IS_WIN, PLATFORM, SupportedPlatforms, TargetPlatform, TEST_ROOT, skipPerOSTests, skippedTests } from "./smart-config" +import { IS_LINUX, IS_MAC, IS_WIN, PLATFORM, SupportedPlatforms, TargetPlatform, TEST_ROOT, skipPerOSTests, skippedTests } from "./smart-config.js" export function platformAllowed(file: string, platform: TargetPlatform = "current"): boolean { if (platform === "current") { @@ -38,7 +38,12 @@ function collectTests(dir: string, platform: TargetPlatform = "current", out: st } for (const name of fs.readdirSync(dir)) { - if ([".ts.map", ".js.map", ".d.ts", ".snap"].some(ext => name.endsWith(ext)) || ["node_modules", "out"].includes(name) || isUnstableTest(name, platform)) { + if ([".ts.map", ".js.map", ".d.ts", ".snap"].some(ext => name.endsWith(ext)) || ["node_modules", "out"].includes(name)) { + continue + } + + if (isUnstableTest(name, platform)) { + console.warn(`Skipping unstable test: ${name}`) continue } diff --git a/test/vitest-scripts/run-vitest.ts b/test/vitest-scripts/run-vitest.ts index 467cb738811..078dd91b1bd 100644 --- a/test/vitest-scripts/run-vitest.ts +++ b/test/vitest-scripts/run-vitest.ts @@ -1,11 +1,13 @@ -#!/usr/bin/env ts-node +#!/usr/bin/env tsx import isCI from "is-ci" import { startVitest } from "vitest/node" -import { getAllTestFiles } from "./file-discovery" -import { buildWeightedFiles, computeShardCount, splitIntoShards } from "./shard-builder" -import { SHARD_INDEX, SupportedPlatforms, TEST_FILES_PATTERN } from "./smart-config" -import SmartSequencer from "./vitest-smart-sequencer" +import { getAllTestFiles } from "./file-discovery.js" +import { buildWeightedFiles, computeShardCount, splitIntoShards } from "./shard-builder.js" +import { SHARD_INDEX, SupportedPlatforms, TEST_FILES_PATTERN } from "./smart-config.js" +import SmartSequencer from "./vitest-smart-sequencer.js" + +const __dirname = import.meta.dirname const testRegex = TEST_FILES_PATTERN?.split(",") const includeRegex = `(${testRegex.join("|")})` diff --git a/test/vitest-scripts/shard-builder.ts b/test/vitest-scripts/shard-builder.ts index 97a005812a8..64e3777f411 100644 --- a/test/vitest-scripts/shard-builder.ts +++ b/test/vitest-scripts/shard-builder.ts @@ -1,6 +1,6 @@ import * as path from "path" -import { loadCache } from "./cache" -import { DEFAULT_FILE_MS, SAFEGUARD_MAX_SHARDS, SupportedPlatforms, TARGET_MS, TargetPlatform } from "./smart-config" +import { loadCache } from "./cache.js" +import { DEFAULT_FILE_MS, SAFEGUARD_MAX_SHARDS, SupportedPlatforms, TARGET_MS, TargetPlatform } from "./smart-config.js" export interface WeightedFile { filename: string diff --git a/test/vitest-scripts/smart-config.ts b/test/vitest-scripts/smart-config.ts index c5ba6cbabf0..73df7a15831 100644 --- a/test/vitest-scripts/smart-config.ts +++ b/test/vitest-scripts/smart-config.ts @@ -1,5 +1,8 @@ +import isCI from "is-ci" import * as path from "path" +const __dirname = import.meta.dirname + export type TargetPlatform = "darwin" | "win32" | "linux" | "current" export type SupportedPlatforms = Exclude @@ -29,7 +32,8 @@ export const skippedTests = [ "snapHeavyTest", ] export const skipPerOSTests: Record = { - darwin: ["fpmTest", "macUpdaterTest", "blackboxUpdateTest"], + // requires valid signing signature on CI, which we don't have yet. (Can only run locally) + darwin: ["fpmTest", "macUpdaterTest", isCI ? "blackboxUpdateTest" : null].filter(Boolean) as string[], linux: ["flatpakTest"], win32: [], } diff --git a/test/vitest-scripts/smart-shard-count.ts b/test/vitest-scripts/smart-shard-count.ts index 8ac5cc5dfe1..1f2aa8312b5 100644 --- a/test/vitest-scripts/smart-shard-count.ts +++ b/test/vitest-scripts/smart-shard-count.ts @@ -1,8 +1,6 @@ -#!/usr/bin/env ts-node - -import { getAllTestFiles } from "./file-discovery" -import { buildWeightedFiles, computeShardCount } from "./shard-builder" -import { TargetPlatform } from "./smart-config" +import { getAllTestFiles } from "./file-discovery.js" +import { buildWeightedFiles, computeShardCount } from "./shard-builder.js" +import { TargetPlatform } from "./smart-config.js" /** * Compute shard indices for a given platform diff --git a/test/vitest-scripts/vitest-setup.ts b/test/vitest-scripts/vitest-setup.ts index 129f801b332..513948934a6 100644 --- a/test/vitest-scripts/vitest-setup.ts +++ b/test/vitest-scripts/vitest-setup.ts @@ -1,5 +1,5 @@ import { test as baseTest, describe as baseDescribe, expect } from "vitest" -import { ConditionalSuiteAPI, ConditionalTestAPI } from "../typings/vitest" +import { ConditionalSuiteAPI, ConditionalTestAPI } from "../typings/vitest.js" const isWindows = process.platform === "win32" const isMac = process.platform === "darwin" diff --git a/test/vitest-scripts/vitest-smart-reporter.ts b/test/vitest-scripts/vitest-smart-reporter.ts index cb2e77ba0aa..ed8d1a2e5ac 100644 --- a/test/vitest-scripts/vitest-smart-reporter.ts +++ b/test/vitest-scripts/vitest-smart-reporter.ts @@ -1,7 +1,7 @@ import * as path from "path" import type { Reporter, TestCase, TestModule } from "vitest/node" -import { FileStats, loadCache, saveCache, TestStats } from "./cache" -import { UNSTABLE_FAIL_RATIO, SupportedPlatforms } from "./smart-config" +import { FileStats, loadCache, saveCache, TestStats } from "./cache.js" +import { UNSTABLE_FAIL_RATIO, SupportedPlatforms } from "./smart-config.js" const defaultStat: TestStats = { platformRuns: { diff --git a/test/vitest-scripts/vitest-smart-sequencer.ts b/test/vitest-scripts/vitest-smart-sequencer.ts index 07cb8995260..75193e658d7 100644 --- a/test/vitest-scripts/vitest-smart-sequencer.ts +++ b/test/vitest-scripts/vitest-smart-sequencer.ts @@ -1,7 +1,7 @@ import * as path from "path" import { BaseSequencer, TestSpecification } from "vitest/node" -import { loadCache } from "./cache" -import { DEFAULT_FILE_MS, SupportedPlatforms } from "./smart-config" +import { loadCache } from "./cache.js" +import { DEFAULT_FILE_MS, SupportedPlatforms } from "./smart-config.js" export default class SmartSequencer extends BaseSequencer { readonly cache = loadCache() diff --git a/tsconfig-base.json b/tsconfig-base.json index f05e98abd57..7a74fd1831f 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -1,21 +1,17 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "target": "es2019", - "module": "CommonJS", - "esModuleInterop": false, "forceConsistentCasingInFileNames": true, - "moduleResolution": "node", - "skipLibCheck": true, - "strict": true, + "noUnusedLocals": true, "noFallthroughCasesInSwitch": true, "noImplicitReturns": true, + "allowJs": true, "inlineSources": true, "sourceMap": true, - "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "newLine": "lf", diff --git a/tsconfig.json b/tsconfig.json index b224a4e0e80..0a9301a7d56 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,18 @@ { "files": [], "references": [ + { + "path": "./packages/builder-util-runtime" + }, + { + "path": "./packages/builder-util" + }, + { + "path": "./packages/app-builder-lib" + }, + { + "path": "./packages/dmg-builder" + }, { "path": "./packages/electron-builder" },