From 8971e2feba2ced685fb7af030548067e3ca156f4 Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Wed, 17 Jul 2024 18:42:49 -0700 Subject: [PATCH] Set up electron-builder for new app (#113) Adds electron-builder, which we will use to package and distribute our application, same as in the existing app. Replaces explicit port assignments with dynamic ones, which are then stored into environment variables. Adds a ~/.w2-dev folder for use when running a dev build. The build-helper pipeline from the old repo is included here too, but it is not updated yet so it will fail. Also removes some redundant utility functions and cleans up some let vs. const usage. The packaging can be run using the `package:prod` and `package:dev` tasks. --------- Co-authored-by: sawka --- .github/workflows/build-helper.yml | 75 ++ .gitignore | 1 + Taskfile.yml | 108 ++- cmd/server/main-server.go | 11 +- electron-builder.config.cjs | 79 ++ emain/emain.ts | 144 ++-- emain/preload.ts | 3 +- frontend/app/store/global.ts | 19 +- frontend/app/store/wos.ts | 14 +- frontend/app/tab/tabbar.tsx | 4 +- frontend/app/view/preview.tsx | 5 +- frontend/app/view/term/termsticker.tsx | 5 +- frontend/faraday/lib/layoutNode.ts | 3 +- frontend/faraday/lib/layoutState.ts | 3 +- frontend/faraday/lib/utils.ts | 40 - frontend/types/custom.d.ts | 15 +- frontend/types/gotypes.d.ts | 72 -- frontend/util/endpoints.ts | 9 + frontend/util/getenv.ts | 26 + frontend/util/isdev.ts | 17 + frontend/util/util.ts | 30 + frontend/wave.ts | 6 +- package.json | 24 +- pkg/wavebase/wavebase.go | 4 + pkg/web/web.go | 21 +- pkg/web/ws.go | 9 +- yarn.lock | 1041 +++++++++++++++++++++++- 27 files changed, 1512 insertions(+), 276 deletions(-) create mode 100644 .github/workflows/build-helper.yml create mode 100644 electron-builder.config.cjs create mode 100644 frontend/util/endpoints.ts create mode 100644 frontend/util/getenv.ts create mode 100644 frontend/util/isdev.ts diff --git a/.github/workflows/build-helper.yml b/.github/workflows/build-helper.yml new file mode 100644 index 00000000..74272228 --- /dev/null +++ b/.github/workflows/build-helper.yml @@ -0,0 +1,75 @@ +name: "Build Helper" +on: workflow_dispatch +env: + GO_VERSION: "1.22.0" + NODE_VERSION: "21.5.0" +jobs: + runbuild: + strategy: + matrix: + include: + - platform: "darwin" + arch: "universal" + runner: "macos-latest-xlarge" + task: "build-package" + - platform: "linux" + arch: "amd64" + runner: "ubuntu-latest" + scripthaus: "build-package-linux" + - platform: "linux" + arch: "arm64" + runner: "ubuntu-latest" + scripthaus: "build-package-linux" + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + with: + repository: scripthaus-dev/scripthaus + path: scripthaus + - name: Install Linux Build Dependencies (Linux only) + if: matrix.platform == 'linux' + run: | + sudo apt-get update + sudo apt-get install --no-install-recommends -y libarchive-tools libopenjp2-tools rpm + - uses: actions/setup-go@v5 + with: + go-version: ${{env.GO_VERSION}} + cache-dependency-path: | + wavesrv/go.sum + waveshell/go.sum + scripthaus/go.sum + - name: Install Scripthaus + run: | + go work use ./scripthaus; + cd scripthaus; + go get ./...; + CGO_ENABLED=1 go build -o scripthaus cmd/main.go + echo $PWD >> $GITHUB_PATH + - uses: actions/setup-node@v4 + with: + node-version: ${{env.NODE_VERSION}} + - name: Install yarn + run: | + corepack enable + yarn install + - name: Set Version + id: set-version + run: | + VERSION=$(node -e 'console.log(require("./version.js"))') + echo "WAVETERM_VERSION=${VERSION}" >> "$GITHUB_OUTPUT" + - name: Build ${{ matrix.platform }}/${{ matrix.arch }} + run: scripthaus run ${{ matrix.scripthaus }} + env: + GOARCH: ${{ matrix.arch }} + CSC_LINK: ${{ matrix.platform == 'darwin' && secrets.PROD_MACOS_CERTIFICATE}} + CSC_KEY_PASSWORD: ${{ matrix.platform == 'darwin' && secrets.PROD_MACOS_CERTIFICATE_PWD }} + APPLE_ID: ${{ matrix.platform == 'darwin' && secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ matrix.platform == 'darwin' && secrets.PROD_MACOS_NOTARIZATION_PWD }} + APPLE_TEAM_ID: ${{ matrix.platform == 'darwin' && secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }} + - name: Upload to S3 staging + run: aws s3 cp make/ s3://waveterm-github-artifacts/staging/${{ steps.set-version.outputs.WAVETERM_VERSION }}/ --recursive --exclude "*/*" --exclude "builder-*.yml" + env: + AWS_ACCESS_KEY_ID: "${{ secrets.S3_USERID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.S3_SECRETKEY }}" + AWS_DEFAULT_REGION: us-west-2 diff --git a/.gitignore b/.gitignore index 527a721d..1c3fc393 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ bin/ .DS_Store *~ out/ +make/ # Yarn Modern .pnp.* diff --git a/Taskfile.yml b/Taskfile.yml index e2581d16..e162f0fb 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -10,6 +10,39 @@ vars: sh: node version.cjs tasks: + + package:dev: + cmds: + - yarn build:dev && yarn electron-builder -c electron-builder.config.cjs -p never + deps: + - generate + - build:server + - build:wsh + + package:prod: + cmds: + - yarn build:prod && yarn electron-builder -c electron-builder.config.cjs -p never + deps: + - generate + - build:server + - build:wsh + + electron:dev: + cmds: + - WAVETERM_DEV=1 yarn dev + deps: + - generate + - build:server + - build:wsh + + electron:start: + cmds: + - WAVETERM_DEV=1 yarn start + deps: + - generate + - build:server + - build:wsh + generate: cmds: - go run cmd/generate/main-generate.go @@ -20,41 +53,78 @@ tasks: - "pkg/wstore/*.go" - "pkg/wshrpc/**/*.go" - electron:dev: - cmds: - - WAVETERM_DEV=1 yarn dev - deps: - - build:server - - build:wsh - - electron:start: - cmds: - - WAVETERM_DEV=1 yarn start - deps: - - build:server - - build:wsh - build:server: + deps: + - task: build:server:internal + vars: + GOARCH: arm64 + - task: build:server:internal + vars: + GOARCH: amd64 + + build:server:internal: + requires: + vars: + - GOARCH cmds: - - go build -o dist/bin/wavesrv{{exeExt}} cmd/server/main-server.go + - CGO_ENABLED=1 GOARCH={{.GOARCH}} go build -tags "osusergo,netgo,sqlite_omit_load_extension" -ldflags "-X main.BuildTime=$(date +'%Y%m%d%H%M') -X main.WaveVersion={{.VERSION}}" -o dist/bin/wavesrv.{{.GOARCH}}{{exeExt}} cmd/server/main-server.go sources: - "cmd/server/*.go" - "pkg/**/*.go" generates: - - dist/bin/wavesrv{{exeExt}} + - dist/bin/wavesrv.{{.GOARCH}}{{exeExt}} deps: - go:mod:tidy + internal: true build:wsh: - cmds: - - go build -o dist/bin/wsh{{exeExt}} cmd/wsh/main-wsh.go + deps: + - task: build:wsh:internal + vars: + GOOS: darwin + GOARCH: arm64 + - task: build:wsh:internal + vars: + GOOS: darwin + GOARCH: amd64 + - task: build:wsh:internal + vars: + GOOS: linux + GOARCH: arm64 + - task: build:wsh:internal + vars: + GOOS: linux + GOARCH: amd64 + - task: build:wsh:internal + vars: + GOOS: windows + GOARCH: amd64 + - task: build:wsh:internal + vars: + GOOS: windows + GOARCH: arm64 + + build:wsh:internal: + vars: + GO_LDFLAGS: + sh: echo "-s -w -X main.BuildTime=$(date +'%Y%m%d%H%M')" + EXT: + sh: echo {{if eq .GOOS "windows"}}.exe{{end}} + requires: + vars: + - GOOS + - GOARCH + - VERSION sources: - "cmd/wsh/**/*.go" - "pkg/**/*.go" generates: - - dist/bin/wsh{{exeExt}} + - dist/bin/wsh-{{.VERSION}}-{{.GOOS}}.{{.GOARCH}}{{.EXT}} + cmds: + - (CGO_ENABLED=0 GOOS={{.GOOS}} GOARCH={{.GOARCH}} go build -ldflags="{{.GO_LDFLAGS}}" -o dist/bin/wsh-{{.VERSION}}-{{.GOOS}}.{{.GOARCH}}{{.EXT}} cmd/wsh/main-wsh.go) deps: - go:mod:tidy + internal: true go:mod:tidy: summary: Runs `go mod tidy` diff --git a/cmd/server/main-server.go b/cmd/server/main-server.go index 4d0d3e5a..b5579a3a 100644 --- a/cmd/server/main-server.go +++ b/cmd/server/main-server.go @@ -124,12 +124,17 @@ func main() { go stdinReadWatch() configWatcher() - go web.RunWebSocketServer() - webListener, err := web.MakeTCPListener() + webListener, err := web.MakeTCPListener("web") if err != nil { log.Printf("error creating web listener: %v\n", err) return } + wsListener, err := web.MakeTCPListener("websocket") + if err != nil { + log.Printf("error creating websocket listener: %v\n", err) + return + } + go web.RunWebSocketServer(wsListener) unixListener, err := web.MakeUnixListener() if err != nil { log.Printf("error creating unix listener: %v\n", err) @@ -141,7 +146,7 @@ func main() { _, err := strconv.Atoi(pidStr) if err == nil { // use fmt instead of log here to make sure it goes directly to stderr - fmt.Fprintf(os.Stderr, "WAVESRV-ESTART\n") + fmt.Fprintf(os.Stderr, "WAVESRV-ESTART ws:%s web:%s\n", wsListener.Addr(), webListener.Addr()) } } }() diff --git a/electron-builder.config.cjs b/electron-builder.config.cjs new file mode 100644 index 00000000..7ddd5258 --- /dev/null +++ b/electron-builder.config.cjs @@ -0,0 +1,79 @@ +const pkg = require("./package.json"); +const fs = require("fs"); +const path = require("path"); + +/** + * @type {import('electron-builder').Configuration} + * @see https://www.electron.build/configuration/configuration + */ +const config = { + appId: pkg.build.appId, + productName: pkg.productName, + artifactName: "${productName}-${platform}-${arch}-${version}.${ext}", + npmRebuild: false, + nodeGypRebuild: false, + electronCompile: false, + files: [ + { + from: "./dist", + to: "./dist", + filter: ["**/*"], + }, + { + from: ".", + to: ".", + filter: ["package.json"], + }, + ], + directories: { + output: "make", + }, + asarUnpack: ["dist/bin/**/*"], + mac: { + target: [ + { + target: "zip", + arch: "universal", + }, + { + target: "dmg", + arch: "universal", + }, + ], + icon: "build/icons.icns", + category: "public.app-category.developer-tools", + minimumSystemVersion: "10.15.0", + notarize: process.env.APPLE_TEAM_ID + ? { + teamId: process.env.APPLE_TEAM_ID, + } + : false, + binaries: fs + .readdirSync("dist/bin", { recursive: true, withFileTypes: true }) + .filter((f) => f.isFile() && (f.name.startsWith("wavesrv") || f.name.includes("darwin"))) + .map((f) => path.resolve(f.path, f.name)), + }, + linux: { + executableName: pkg.productName, + category: "TerminalEmulator", + icon: "build/icons.icns", + target: ["zip", "deb", "rpm", "AppImage", "pacman"], + synopsis: pkg.description, + description: null, + desktop: { + Name: pkg.productName, + Comment: pkg.description, + Keywords: "developer;terminal;emulator;", + category: "Development;Utility;", + }, + }, + appImage: { + license: "LICENSE", + }, + publish: { + provider: "generic", + url: "https://dl.waveterm.dev/releases", + }, +}; + +module.exports = config; diff --git a/emain/emain.ts b/emain/emain.ts index d1cbc4a6..05095fa8 100644 --- a/emain/emain.ts +++ b/emain/emain.ts @@ -8,32 +8,34 @@ import os from "os"; import * as path from "path"; import * as readline from "readline"; import { debounce } from "throttle-debounce"; -import { getBackendHostPort } from "../frontend/app/store/global"; +import * as util from "util"; +import winston from "winston"; import * as services from "../frontend/app/store/services"; import * as keyutil from "../frontend/util/keyutil"; import { fireAndForget } from "../frontend/util/util"; +import { getServerWebEndpoint, WebServerEndpointVarName, WSServerEndpointVarName } from "@/util/endpoints"; +import { WaveDevVarName, WaveDevViteVarName } from "@/util/isdev"; +import { sprintf } from "sprintf-js"; const electronApp = electron.app; -const isDev = process.env.WAVETERM_DEV; -const isDevServer = !electronApp.isPackaged && process.env.ELECTRON_RENDERER_URL; const WaveAppPathVarName = "WAVETERM_APP_PATH"; -const WaveDevVarName = "WAVETERM_DEV"; const WaveSrvReadySignalPidVarName = "WAVETERM_READY_SIGNAL_PID"; const AuthKeyFile = "waveterm.authkey"; -const DevServerEndpoint = "http://127.0.0.1:8190"; -const ProdServerEndpoint = "http://127.0.0.1:1719"; electron.nativeTheme.themeSource = "dark"; type WaveBrowserWindow = Electron.BrowserWindow & { waveWindowId: string; readyPromise: Promise }; let waveSrvReadyResolve = (value: boolean) => {}; -let waveSrvReady: Promise = new Promise((resolve, _) => { +const waveSrvReady: Promise = new Promise((resolve, _) => { waveSrvReadyResolve = resolve; }); let globalIsQuitting = false; let globalIsStarting = true; +const isDev = !electron.app.isPackaged; +const isDevVite = isDev && process.env.ELECTRON_RENDERER_URL; + let waveSrvProc: child_process.ChildProcessWithoutNullStreams | null = null; electronApp.setName(isDev ? "NextWave (Dev)" : "NextWave"); const unamePlatform = process.platform; @@ -43,16 +45,50 @@ if (unameArch == "x64") { } keyutil.setKeyUtilPlatform(unamePlatform); -function getBaseHostPort(): string { - if (isDev) { - return DevServerEndpoint; - } - return ProdServerEndpoint; -} - // must match golang function getWaveHomeDir() { - return path.join(os.homedir(), ".w2"); + return path.join(os.homedir(), isDev ? ".w2-dev" : ".w2"); +} + +const waveHome = getWaveHomeDir(); + +const oldConsoleLog = console.log; + +const loggerTransports: winston.transport[] = [ + new winston.transports.File({ filename: path.join(waveHome, "waveterm-app.log"), level: "info" }), +]; +if (isDev) { + loggerTransports.push(new winston.transports.Console()); +} +const loggerConfig = { + level: "info", + format: winston.format.combine( + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), + winston.format.printf((info) => `${info.timestamp} ${info.message}`) + ), + transports: loggerTransports, +}; +const logger = winston.createLogger(loggerConfig); +function log(...msg: any[]) { + try { + logger.info(util.format(...msg)); + } catch (e) { + oldConsoleLog(...msg); + } +} +console.log = log; +console.log( + sprintf( + "waveterm-app starting, WAVETERM_HOME=%s, electronpath=%s gopath=%s arch=%s/%s", + waveHome, + getElectronAppBasePath(), + getGoAppBasePath(), + unamePlatform, + unameArch + ) +); +if (isDev) { + console.log("waveterm-app WAVETERM_DEV set"); } function getElectronAppBasePath(): string { @@ -60,20 +96,18 @@ function getElectronAppBasePath(): string { } function getGoAppBasePath(): string { - const appDir = getElectronAppBasePath(); - if (appDir.endsWith(".asar")) { - return `${appDir}.unpacked`; - } else { - return appDir; - } + return getElectronAppBasePath().replace("app.asar", "app.asar.unpacked"); } +const wavesrvBinName = `wavesrv.${unameArch}`; + function getWaveSrvPath(): string { - return path.join(getGoAppBasePath(), "bin", "wavesrv"); + return path.join(getGoAppBasePath(), "bin", wavesrvBinName); } function getWaveSrvPathWin(): string { - const appPath = path.join(getGoAppBasePath(), "bin", "wavesrv.exe"); + const winBinName = `${wavesrvBinName}.exe`; + const appPath = path.join(getGoAppBasePath(), "bin", winBinName); return `& "${appPath}"`; } @@ -93,11 +127,16 @@ function runWaveSrv(): Promise { pResolve = argResolve; pReject = argReject; }); + if (isDev) { + process.env[WaveDevVarName] = "1"; + } + + if (isDevVite) { + process.env[WaveDevViteVarName] = "1"; + } + const envCopy = { ...process.env }; envCopy[WaveAppPathVarName] = getGoAppBasePath(); - if (isDev) { - envCopy[WaveDevVarName] = "1"; - } envCopy[WaveSrvReadySignalPidVarName] = process.pid.toString(); let waveSrvCmd: string; if (process.platform === "win32") { @@ -139,6 +178,14 @@ function runWaveSrv(): Promise { }); rlStderr.on("line", (line) => { if (line.includes("WAVESRV-ESTART")) { + const addrs = /ws:([a-z0-9.:]+) web:([a-z0-9.:]+)/gm.exec(line); + if (addrs == null) { + console.log("error parsing WAVESRV-ESTART line", line); + electron.app.quit(); + return; + } + process.env[WSServerEndpointVarName] = addrs[1]; + process.env[WebServerEndpointVarName] = addrs[2]; waveSrvReadyResolve(true); return; } @@ -159,12 +206,12 @@ function runWaveSrv(): Promise { async function handleWSEvent(evtMsg: WSEventType) { if (evtMsg.eventtype == "electron:newwindow") { - let windowId: string = evtMsg.data; - let windowData: WaveWindow = (await services.ObjectService.GetObject("window:" + windowId)) as WaveWindow; + const windowId: string = evtMsg.data; + const windowData: WaveWindow = (await services.ObjectService.GetObject("window:" + windowId)) as WaveWindow; if (windowData == null) { return; } - let clientData = await services.ClientService.GetClientData(); + const clientData = await services.ClientService.GetClientData(); const newWin = createBrowserWindow(clientData.oid, windowData); await newWin.readyPromise; newWin.show(); @@ -221,7 +268,7 @@ function shFrameNavHandler(event: Electron.Event= dx && x < dx + width && y >= dy && y < dy + height) { return true; @@ -418,18 +464,9 @@ function ensureBoundsAreVisible(bounds: electron.Rectangle): electron.Rectangle return bounds; } -electron.ipcMain.on("isDev", (event) => { - event.returnValue = isDev; -}); - -electron.ipcMain.on("isDevServer", (event) => { - event.returnValue = isDevServer; -}); - electron.ipcMain.on("getPlatform", (event, url) => { event.returnValue = unamePlatform; }); - // Listen for the open-external event from the renderer process electron.ipcMain.on("open-external", (event, url) => { if (url && typeof url === "string") { @@ -443,8 +480,7 @@ electron.ipcMain.on("open-external", (event, url) => { electron.ipcMain.on("download", (event, payload) => { const window = electron.BrowserWindow.fromWebContents(event.sender); - const baseName = payload.filePath.split(/[\\/]/).pop(); - const streamingUrl = getBackendHostPort() + "/wave/stream-file?path=" + encodeURIComponent(payload.filePath); + const streamingUrl = getServerWebEndpoint() + "/wave/stream-file?path=" + encodeURIComponent(payload.filePath); window.webContents.downloadURL(streamingUrl); }); @@ -459,8 +495,12 @@ electron.ipcMain.on("getCursorPoint", (event) => { event.returnValue = retVal; }); +electron.ipcMain.on("getEnv", (event, varName) => { + event.returnValue = process.env[varName] ?? null; +}); + async function createNewWaveWindow() { - let clientData = await services.ClientService.GetClientData(); + const clientData = await services.ClientService.GetClientData(); const newWindow = await services.ClientService.MakeWindow(); const newBrowserWindow = createBrowserWindow(clientData.oid, newWindow); newBrowserWindow.show(); @@ -498,7 +538,7 @@ function convertMenuDefArrToMenu(menuDefArr: ElectronContextMenuItem[]): electro } function makeAppMenu() { - let fileMenu: Electron.MenuItemConstructorOptions[] = []; + const fileMenu: Electron.MenuItemConstructorOptions[] = []; fileMenu.push({ label: "New Window", accelerator: "CommandOrControl+N", @@ -557,12 +597,12 @@ async function appMain() { const ready = await waveSrvReady; console.log("wavesrv ready signal received", ready, Date.now() - startTs, "ms"); console.log("get client data"); - let clientData = await services.ClientService.GetClientData(); + const clientData = await services.ClientService.GetClientData(); console.log("client data ready"); await electronApp.whenReady(); - let wins: WaveBrowserWindow[] = []; - for (let windowId of clientData.windowids.slice().reverse()) { - let windowData: WaveWindow = (await services.ObjectService.GetObject("window:" + windowId)) as WaveWindow; + const wins: WaveBrowserWindow[] = []; + for (const windowId of clientData.windowids.slice().reverse()) { + const windowData: WaveWindow = (await services.ObjectService.GetObject("window:" + windowId)) as WaveWindow; if (windowData == null) { services.WindowService.CloseWindow(windowId).catch((e) => { /* ignore */ @@ -572,7 +612,7 @@ async function appMain() { const win = createBrowserWindow(clientData.oid, windowData); wins.push(win); } - for (let win of wins) { + for (const win of wins) { await win.readyPromise; console.log("show", win.waveWindowId); win.show(); diff --git a/emain/preload.ts b/emain/preload.ts index 1741a00c..93b1f198 100644 --- a/emain/preload.ts +++ b/emain/preload.ts @@ -4,8 +4,6 @@ let { contextBridge, ipcRenderer } = require("electron"); contextBridge.exposeInMainWorld("api", { - isDev: () => ipcRenderer.sendSync("isDev"), - isDevServer: () => ipcRenderer.sendSync("isDevServer"), getPlatform: () => ipcRenderer.sendSync("getPlatform"), getCursorPoint: () => ipcRenderer.sendSync("getCursorPoint"), openNewWindow: () => ipcRenderer.send("openNewWindow"), @@ -19,6 +17,7 @@ contextBridge.exposeInMainWorld("api", { console.error("Invalid URL passed to openExternal:", url); } }, + getEnv: (varName) => ipcRenderer.sendSync("getEnv", varName), }); // Custom event for "new-window" diff --git a/frontend/app/store/global.ts b/frontend/app/store/global.ts index 8a664989..8be43316 100644 --- a/frontend/app/store/global.ts +++ b/frontend/app/store/global.ts @@ -6,6 +6,7 @@ import { getLayoutStateAtomForTab } from "@/faraday/lib/layoutAtom"; import { layoutTreeStateReducer } from "@/faraday/lib/layoutState"; import { handleIncomingRpcMessage } from "@/app/store/wshrpc"; +import { getServerWebEndpoint, getServerWSEndpoint } from "@/util/endpoints"; import * as layoututil from "@/util/layoututil"; import { produce } from "immer"; import * as jotai from "jotai"; @@ -193,15 +194,6 @@ function useBlockAtom(blockId: string, name: string, makeFn: () => jotai.Atom return atom as jotai.Atom; } -function getBackendHostPort(): string { - // TODO deal with dev/production - return "http://127.0.0.1:8190"; -} - -function getBackendWSHostPort(): string { - return "ws://127.0.0.1:8191"; -} - let globalWS: WSControl = null; function handleWSEventMessage(msg: WSEventType) { @@ -278,7 +270,7 @@ function handleWSMessage(msg: any) { } function initWS() { - globalWS = new WSControl(getBackendWSHostPort(), globalStore, globalWindowId, "", (msg) => { + globalWS = new WSControl(getServerWSEndpoint(), globalStore, globalWindowId, "", (msg) => { handleWSMessage(msg); }); globalWS.connectNow("initWS"); @@ -332,7 +324,7 @@ async function fetchWaveFile( if (offset != null) { usp.set("offset", offset.toString()); } - const resp = await fetch(getBackendHostPort() + "/wave/file?" + usp.toString()); + const resp = await fetch(getServerWebEndpoint() + "/wave/file?" + usp.toString()); if (!resp.ok) { if (resp.status === 404) { return { data: null, fileInfo: null }; @@ -375,13 +367,10 @@ function getObjectId(obj: any): number { } export { - PLATFORM, - WOS, atoms, createBlock, fetchWaveFile, getApi, - getBackendHostPort, getEventORefSubject, getEventSubject, getFileSubject, @@ -389,10 +378,12 @@ export { globalStore, globalWS, initWS, + PLATFORM, sendWSCommand, setBlockFocus, setPlatform, useBlockAtom, useBlockCache, useSettingsAtom, + WOS, }; diff --git a/frontend/app/store/wos.ts b/frontend/app/store/wos.ts index b9f0d5dd..60856a3f 100644 --- a/frontend/app/store/wos.ts +++ b/frontend/app/store/wos.ts @@ -4,10 +4,11 @@ // WaveObjectStore import { sendRpcCommand } from "@/app/store/wshrpc"; +import { getServerWebEndpoint } from "@/util/endpoints"; import * as jotai from "jotai"; import * as React from "react"; import { v4 as uuidv4 } from "uuid"; -import { atoms, getBackendHostPort, globalStore } from "./global"; +import { atoms, globalStore } from "./global"; import * as services from "./services"; const IsElectron = true; @@ -67,22 +68,23 @@ function callBackendService(service: string, method: string, args: any[], noUICo if (!noUIContext) { uiContext = globalStore.get(atoms.uiContext); } - let waveCall: WebCallType = { + const waveCall: WebCallType = { service: service, method: method, args: args, uicontext: uiContext, }; // usp is just for debugging (easier to filter URLs) - let methodName = service + "." + method; - let usp = new URLSearchParams(); + const methodName = `${service}.${method}`; + const usp = new URLSearchParams(); usp.set("service", service); usp.set("method", method); - let fetchPromise = fetch(getBackendHostPort() + "/wave/service?" + usp.toString(), { + const url = getServerWebEndpoint() + "/wave/service?" + usp.toString(); + const fetchPromise = fetch(url, { method: "POST", body: JSON.stringify(waveCall), }); - let prtn = fetchPromise + const prtn = fetchPromise .then((resp) => { if (!resp.ok) { throw new Error(`call ${methodName} failed: ${resp.status} ${resp.statusText}`); diff --git a/frontend/app/tab/tabbar.tsx b/frontend/app/tab/tabbar.tsx index 50905bda..b3f0b138 100644 --- a/frontend/app/tab/tabbar.tsx +++ b/frontend/app/tab/tabbar.tsx @@ -3,7 +3,6 @@ import { WindowDrag } from "@/element/windowdrag"; import { deleteLayoutStateAtomForTab } from "@/faraday/lib/layoutAtom"; -import { debounce } from "@/faraday/lib/utils"; import { atoms } from "@/store/global"; import * as services from "@/store/services"; import { useAtomValue } from "jotai"; @@ -12,6 +11,7 @@ import React, { createRef, useCallback, useEffect, useRef, useState } from "reac import { Tab } from "./tab"; +import { debounce } from "throttle-debounce"; import "./tabbar.less"; const TAB_DEFAULT_WIDTH = 130; @@ -111,7 +111,7 @@ const TabBar = React.memo(({ workspace }: TabBarProps) => { // const debouncedSetTabWidth = debounce((width) => setTabWidth(width), 100); // const debouncedSetScrollable = debounce((scrollable) => setScrollable(scrollable), 100); - const debouncedUpdateTabPositions = debounce(() => updateTabPositions(), 100); + const debouncedUpdateTabPositions = debounce(100, () => updateTabPositions()); const handleResizeTabs = useCallback(() => { const tabBar = tabBarRef.current; diff --git a/frontend/app/view/preview.tsx b/frontend/app/view/preview.tsx index 40e3cdbc..ec4bb66a 100644 --- a/frontend/app/view/preview.tsx +++ b/frontend/app/view/preview.tsx @@ -3,9 +3,10 @@ import { ContextMenuModel } from "@/app/store/contextmenu"; import { Markdown } from "@/element/markdown"; -import { getBackendHostPort, globalStore, useBlockAtom } from "@/store/global"; +import { globalStore, useBlockAtom } from "@/store/global"; import * as services from "@/store/services"; import * as WOS from "@/store/wos"; +import { getServerWebEndpoint } from "@/util/endpoints"; import * as util from "@/util/util"; import clsx from "clsx"; import * as jotai from "jotai"; @@ -274,7 +275,7 @@ function MarkdownPreview({ contentAtom }: { contentAtom: jotai.Atom diff --git a/frontend/app/view/term/termsticker.tsx b/frontend/app/view/term/termsticker.tsx index 18373148..6c311054 100644 --- a/frontend/app/view/term/termsticker.tsx +++ b/frontend/app/view/term/termsticker.tsx @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { WshServer } from "@/app/store/wshserver"; -import { createBlock, getBackendHostPort } from "@/store/global"; +import { createBlock } from "@/store/global"; +import { getServerWebEndpoint } from "@/util/endpoints"; import clsx from "clsx"; import * as jotai from "jotai"; import * as React from "react"; @@ -116,7 +117,7 @@ function TermSticker({ sticker, config }: { sticker: StickerType; config: Sticke if (sticker.imgsrc == null) { return null; } - const streamingUrl = getBackendHostPort() + "/wave/stream-file?path=" + encodeURIComponent(sticker.imgsrc); + const streamingUrl = getServerWebEndpoint() + "/wave/stream-file?path=" + encodeURIComponent(sticker.imgsrc); return (
diff --git a/frontend/faraday/lib/layoutNode.ts b/frontend/faraday/lib/layoutNode.ts index 2ab593d1..e66e7bcf 100644 --- a/frontend/faraday/lib/layoutNode.ts +++ b/frontend/faraday/lib/layoutNode.ts @@ -1,8 +1,9 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 +import { getCrypto } from "@/util/util"; import { DefaultNodeSize, LayoutNode } from "./model"; -import { FlexDirection, getCrypto, reverseFlexDirection } from "./utils"; +import { FlexDirection, reverseFlexDirection } from "./utils"; const crypto = getCrypto(); diff --git a/frontend/faraday/lib/layoutState.ts b/frontend/faraday/lib/layoutState.ts index c3482e5a..38530004 100644 --- a/frontend/faraday/lib/layoutState.ts +++ b/frontend/faraday/lib/layoutState.ts @@ -1,6 +1,7 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 +import { lazy } from "@/util/util"; import { addChildAt, addIntermediateNode, @@ -25,7 +26,7 @@ import { LayoutTreeSwapNodeAction, MoveOperation, } from "./model"; -import { DropDirection, FlexDirection, lazy } from "./utils"; +import { DropDirection, FlexDirection } from "./utils"; /** * Initializes a layout tree state. diff --git a/frontend/faraday/lib/utils.ts b/frontend/faraday/lib/utils.ts index 7cc6a422..6c0ea235 100644 --- a/frontend/faraday/lib/utils.ts +++ b/frontend/faraday/lib/utils.ts @@ -97,43 +97,3 @@ export function setTransform({ top, left, width, height }: Dimensions, setSize: position: "absolute", }; } - -export const debounce = any>(callback: T, waitFor: number) => { - let timeout: NodeJS.Timeout; - return (...args: Parameters): ReturnType => { - let result: any; - clearTimeout(timeout); - timeout = setTimeout(() => { - result = callback(...args); - }, waitFor); - return result; - }; -}; - -/** - * Simple wrapper function that lazily evaluates the provided function and caches its result for future calls. - * @param callback The function to lazily run. - * @returns The result of the function. - */ -export const lazy = any>(callback: T) => { - let res: ReturnType; - let processed = false; - return (...args: Parameters): ReturnType => { - if (processed) return res; - res = callback(...args); - processed = true; - return res; - }; -}; - -/** - * Workaround for NodeJS compatibility. Will attempt to resolve the Crypto API from the browser and fallback to NodeJS if it isn't present. - * @returns The Crypto API. - */ -export function getCrypto() { - try { - return window.crypto; - } catch { - return crypto; - } -} diff --git a/frontend/types/custom.d.ts b/frontend/types/custom.d.ts index 7b12ea4b..8a478b3e 100644 --- a/frontend/types/custom.d.ts +++ b/frontend/types/custom.d.ts @@ -17,23 +17,10 @@ declare global { }; type ElectronApi = { - /** - * Determines whether the current app instance is a development build. - * @returns True if the current app instance is a development build. - */ - isDev: () => boolean; - /** - * Determines whether the current app instance is hosted in a Vite dev server. - * @returns True if the current app instance is hosted in a Vite dev server. - */ - isDevServer: () => boolean; - /** - * Get a point value representing the cursor's position relative to the calling BrowserWindow - * @returns A point value. - */ getCursorPoint: () => Electron.Point; getPlatform: () => NodeJS.Platform; + getEnv: (varName: string) => string; showContextMenu: (menu: ElectronContextMenuItem[], position: { x: number; y: number }) => void; onContextMenuClick: (callback: (id: string) => void) => void; diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts index ce88435c..82053e5a 100644 --- a/frontend/types/gotypes.d.ts +++ b/frontend/types/gotypes.d.ts @@ -15,24 +15,6 @@ declare global { meta: MetaType; }; - // wshutil.BlockAppendFileCommand - type BlockAppendFileCommand = { - command: "blockfile:append"; - filename: string; - data: number[]; - }; - - // wshutil.BlockAppendIJsonCommand - type BlockAppendIJsonCommand = { - command: "blockfile:appendijson"; - filename: string; - data: MetaType; - }; - - type BlockCommand = { - command: string; - } & ( BlockAppendFileCommand | BlockAppendIJsonCommand | BlockInputCommand | BlockRestartCommand | CreateBlockCommand | BlockGetMetaCommand | BlockMessageCommand | ResolveIdsCommand | BlockSetMetaCommand | BlockSetViewCommand ); - // blockcontroller.BlockControllerRuntimeStatus type BlockControllerRuntimeStatus = { blockid: string; @@ -48,26 +30,11 @@ declare global { meta?: MetaType; }; - // wshutil.BlockGetMetaCommand - type BlockGetMetaCommand = { - command: "getmeta"; - oref: string; - }; - // wconfig.BlockHeaderOpts type BlockHeaderOpts = { showblockids: boolean; }; - // wshutil.BlockInputCommand - type BlockInputCommand = { - blockid: string; - command: "controller:input"; - inputdata64?: string; - signame?: string; - termsize?: TermSize; - }; - // webcmd.BlockInputWSCommand type BlockInputWSCommand = { wscommand: "blockinput"; @@ -75,31 +42,6 @@ declare global { inputdata64: string; }; - // wshutil.BlockMessageCommand - type BlockMessageCommand = { - command: "message"; - message: string; - }; - - // wshutil.BlockRestartCommand - type BlockRestartCommand = { - command: "controller:restart"; - blockid: string; - }; - - // wshutil.BlockSetMetaCommand - type BlockSetMetaCommand = { - command: "setmeta"; - oref?: string; - meta: MetaType; - }; - - // wshutil.BlockSetViewCommand - type BlockSetViewCommand = { - command: "setview"; - view: string; - }; - // wstore.Client type Client = WaveObj & { mainwindowid: string; @@ -174,14 +116,6 @@ declare global { meta: MetaType; }; - // wshutil.CreateBlockCommand - type CreateBlockCommand = { - command: "createblock"; - tabid: string; - blockdef: BlockDef; - rtopts?: RuntimeOpts; - }; - // wstore.FileDef type FileDef = { filetype?: string; @@ -248,12 +182,6 @@ declare global { y: number; }; - // wshutil.ResolveIdsCommand - type ResolveIdsCommand = { - command: "resolveids"; - ids: string[]; - }; - // wshutil.RpcMessage type RpcMessage = { command?: string; diff --git a/frontend/util/endpoints.ts b/frontend/util/endpoints.ts new file mode 100644 index 00000000..3165e0e7 --- /dev/null +++ b/frontend/util/endpoints.ts @@ -0,0 +1,9 @@ +import { getEnv } from "./getenv"; +import { lazy } from "./util"; + +export const WebServerEndpointVarName = "WAVE_SERVER_WEB_ENDPOINT"; +export const WSServerEndpointVarName = "WAVE_SERVER_WS_ENDPOINT"; + +export const getServerWebEndpoint = lazy(() => `http://${getEnv(WebServerEndpointVarName)}`); + +export const getServerWSEndpoint = lazy(() => `ws://${getEnv(WSServerEndpointVarName)}`); diff --git a/frontend/util/getenv.ts b/frontend/util/getenv.ts new file mode 100644 index 00000000..37487169 --- /dev/null +++ b/frontend/util/getenv.ts @@ -0,0 +1,26 @@ +import { getApi } from "@/app/store/global"; + +function getWindow(): Window { + return globalThis.window; +} + +function getProcess(): NodeJS.Process { + return globalThis.process; +} + +/** + * Gets an environment variable from the host process, either directly or via IPC if called from the browser. + * @param paramName The name of the environment variable to attempt to retrieve. + * @returns The value of the environment variable or null if not present. + */ +export function getEnv(paramName: string): string { + const win = getWindow(); + if (win != null) { + return getApi().getEnv(paramName); + } + const proc = getProcess(); + if (proc != null) { + return proc.env[paramName]; + } + return null; +} diff --git a/frontend/util/isdev.ts b/frontend/util/isdev.ts new file mode 100644 index 00000000..8482f694 --- /dev/null +++ b/frontend/util/isdev.ts @@ -0,0 +1,17 @@ +import { getEnv } from "./getenv"; +import { lazy } from "./util"; + +export const WaveDevVarName = "WAVETERM_DEV"; +export const WaveDevViteVarName = "WAVETERM_DEV_VITE"; + +/** + * Determines whether the current app instance is a development build. + * @returns True if the current app instance is a development build. + */ +export const isDev = lazy(() => !!getEnv(WaveDevVarName)); + +/** + * Determines whether the current app instance is running via the Vite dev server. + * @returns True if the app is running via the Vite dev server. + */ +export const isDevVite = lazy(() => !!getEnv(WaveDevViteVarName)); diff --git a/frontend/util/util.ts b/frontend/util/util.ts index 6221db21..fc669aa6 100644 --- a/frontend/util/util.ts +++ b/frontend/util/util.ts @@ -162,15 +162,45 @@ function useAtomValueSafe(atom: jotai.Atom): T { return jotai.useAtomValue(atom); } +/** + * Simple wrapper function that lazily evaluates the provided function and caches its result for future calls. + * @param callback The function to lazily run. + * @returns The result of the function. + */ +const lazy = any>(callback: T) => { + let res: ReturnType; + let processed = false; + return (...args: Parameters): ReturnType => { + if (processed) return res; + res = callback(...args); + processed = true; + return res; + }; +}; + +/** + * Workaround for NodeJS compatibility. Will attempt to resolve the Crypto API from the browser and fallback to NodeJS if it isn't present. + * @returns The Crypto API. + */ +function getCrypto() { + try { + return window.crypto; + } catch { + return crypto; + } +} + export { base64ToArray, base64ToString, fireAndForget, + getCrypto, getPromiseState, getPromiseValue, isBlank, jotaiLoadableValue, jsonDeepEqual, + lazy, makeIconClass, stringToBase64, useAtomValueSafe, diff --git a/frontend/wave.ts b/frontend/wave.ts index 95955118..122c2977 100644 --- a/frontend/wave.ts +++ b/frontend/wave.ts @@ -12,13 +12,13 @@ import { App } from "./app/app"; import { loadFonts } from "./util/fontutil"; const urlParams = new URLSearchParams(window.location.search); -let windowId = urlParams.get("windowid"); -let clientId = urlParams.get("clientid"); +const windowId = urlParams.get("windowid"); +const clientId = urlParams.get("clientid"); console.log("Wave Starting"); console.log("clientid", clientId, "windowid", windowId); -let platform = getApi().getPlatform(); +const platform = getApi().getPlatform(); setPlatform(platform); keyutil.setKeyUtilPlatform(platform); diff --git a/package.json b/package.json index 86182f28..0c44c8be 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,18 @@ { "name": "thenextwave", - "private": true, + "author": { + "name": "Command Line Inc", + "email": "info@commandline.dev" + }, + "productName": "TheNextWave", + "description": "An Open-Source, AI-Native, Terminal Built for Seamless Workflows", + "license": "Apache-2.0", "version": "0.0.0", + "homepage": "https://waveterm.dev", + "build": { + "appId": "dev.commandline.thenextwave" + }, + "private": true, "main": "./dist/main/index.js", "type": "module", "scripts": { @@ -12,7 +23,8 @@ "storybook": "storybook dev -p 6006 --no-open", "build-storybook": "storybook build", "coverage": "vitest run --coverage", - "test": "vitest" + "test": "vitest", + "postinstall": "electron-builder install-app-deps" }, "devDependencies": { "@chromatic-com/storybook": "^1.5.0", @@ -27,11 +39,14 @@ "@types/node": "^20.12.12", "@types/papaparse": "^5", "@types/react": "^18.3.2", + "@types/sprintf-js": "^1", "@types/throttle-debounce": "^5", "@types/tinycolor2": "^1", "@types/uuid": "^9.0.8", "@vitejs/plugin-react": "^4.3.0", "@vitest/coverage-istanbul": "^1.6.0", + "electron": "^31.1.0", + "electron-builder": "^24.13.3", "electron-vite": "^2.2.0", "eslint": "^9.2.0", "eslint-config-prettier": "^9.1.0", @@ -65,7 +80,6 @@ "base64-js": "^1.5.1", "clsx": "^2.1.1", "dayjs": "^1.11.11", - "electron": "^31.1.0", "html-to-image": "^1.11.11", "immer": "^10.1.1", "jotai": "^2.8.0", @@ -83,10 +97,12 @@ "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.0", "rxjs": "^7.8.1", + "sprintf-js": "^1.1.3", "throttle-debounce": "^5.0.0", "tinycolor2": "^1.6.0", "use-device-pixel-ratio": "^1.1.2", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "winston": "^3.13.1" }, "packageManager": "yarn@4.3.1" } diff --git a/pkg/wavebase/wavebase.go b/pkg/wavebase/wavebase.go index 7a1509c0..f2e779e1 100644 --- a/pkg/wavebase/wavebase.go +++ b/pkg/wavebase/wavebase.go @@ -22,6 +22,7 @@ import ( const WaveVersion = "v0.1.0" const DefaultWaveHome = "~/.w2" +const DevWaveHome = "~/.w2-dev" const WaveHomeVarName = "WAVETERM_HOME" const WaveDevVarName = "WAVETERM_DEV" const WaveLockFile = "waveterm.lock" @@ -74,6 +75,9 @@ func GetWaveHomeDir() string { if homeVar != "" { return ExpandHomeDir(homeVar) } + if IsDevMode() { + return ExpandHomeDir(DevWaveHome) + } return ExpandHomeDir(DefaultWaveHome) } diff --git a/pkg/web/web.go b/pkg/web/web.go index e773a539..cad06929 100644 --- a/pkg/web/web.go +++ b/pkg/web/web.go @@ -47,10 +47,6 @@ const HttpWriteTimeout = 21 * time.Second const HttpMaxHeaderBytes = 60000 const HttpTimeoutDuration = 21 * time.Second -const MainServerAddr = "127.0.0.1:1719" // wavesrv, P=16+1, S=19, PS=1719 -const WebSocketServerAddr = "127.0.0.1:1723" // wavesrv:websocket, P=16+1, W=23, PW=1723 -const MainServerDevAddr = "127.0.0.1:8190" -const WebSocketServerDevAddr = "127.0.0.1:8191" const WSStateReconnectTime = 30 * time.Second const WSStatePacketChSize = 20 @@ -213,16 +209,13 @@ func WebFnWrap(opts WebFnOpts, fn WebFnType) WebFnType { } } -func MakeTCPListener() (net.Listener, error) { - serverAddr := MainServerAddr - if wavebase.IsDevMode() { - serverAddr = MainServerDevAddr - } +func MakeTCPListener(serviceName string) (net.Listener, error) { + serverAddr := "127.0.0.1:" rtn, err := net.Listen("tcp", serverAddr) if err != nil { return nil, fmt.Errorf("error creating listener at %v: %v", serverAddr, err) } - log.Printf("Server listening on %s\n", serverAddr) + log.Printf("Server [%s] listening on %s\n", serviceName, rtn.Addr()) return rtn, nil } @@ -234,7 +227,7 @@ func MakeUnixListener() (net.Listener, error) { return nil, fmt.Errorf("error creating listener at %v: %v", serverAddr, err) } os.Chmod(serverAddr, 0700) - log.Printf("Server listening on %s\n", serverAddr) + log.Printf("Server [unix-domain] listening on %s\n", serverAddr) return rtn, nil } @@ -244,15 +237,15 @@ func RunWebServer(listener net.Listener) { gr.HandleFunc("/wave/stream-file", WebFnWrap(WebFnOpts{AllowCaching: true}, handleStreamFile)) gr.HandleFunc("/wave/file", WebFnWrap(WebFnOpts{AllowCaching: false}, handleWaveFile)) gr.HandleFunc("/wave/service", WebFnWrap(WebFnOpts{JsonErrors: true}, handleService)) - var allowedOrigins handlers.CORSOption + handler := http.TimeoutHandler(gr, HttpTimeoutDuration, "Timeout") if wavebase.IsDevMode() { - allowedOrigins = handlers.AllowedOrigins([]string{"*"}) + handler = handlers.CORS(handlers.AllowedOrigins([]string{"*"}))(handler) } server := &http.Server{ ReadTimeout: HttpReadTimeout, WriteTimeout: HttpWriteTimeout, MaxHeaderBytes: HttpMaxHeaderBytes, - Handler: handlers.CORS(allowedOrigins)(http.TimeoutHandler(gr, HttpTimeoutDuration, "Timeout")), + Handler: handler, } err := server.Serve(listener) if err != nil { diff --git a/pkg/web/ws.go b/pkg/web/ws.go index 24001209..62594861 100644 --- a/pkg/web/ws.go +++ b/pkg/web/ws.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "log" + "net" "net/http" "runtime/debug" "sync" @@ -31,20 +32,18 @@ const wsInitialPingTime = 1 * time.Second const DefaultCommandTimeout = 2 * time.Second -func RunWebSocketServer() { +func RunWebSocketServer(listener net.Listener) { gr := mux.NewRouter() gr.HandleFunc("/ws", HandleWs) - serverAddr := WebSocketServerDevAddr server := &http.Server{ - Addr: serverAddr, ReadTimeout: HttpReadTimeout, WriteTimeout: HttpWriteTimeout, MaxHeaderBytes: HttpMaxHeaderBytes, Handler: gr, } server.SetKeepAlivesEnabled(false) - log.Printf("Running websocket server on %s\n", serverAddr) - err := server.ListenAndServe() + log.Printf("Running websocket server on %s\n", listener.Addr()) + err := server.Serve(listener) if err != nil { log.Printf("[error] trying to run websocket server: %v\n", err) } diff --git a/yarn.lock b/yarn.lock index ab26a7fb..88b8524f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 8 cacheKey: 10c0 +"7zip-bin@npm:~5.2.0": + version: 5.2.0 + resolution: "7zip-bin@npm:5.2.0" + checksum: 10c0/7f6c69b4cb10c4060fb8fda258ae2ab88d30516b5a52941efa0e2cbd9ce362ab7d8d568549cd85e9f125c1c68f95c7bb076cc314c2f3c0cb306d3b638080c2ce + languageName: node + linkType: hard + "@adobe/css-tools@npm:^4.3.2": version: 4.3.3 resolution: "@adobe/css-tools@npm:4.3.3" @@ -1781,6 +1788,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -1790,6 +1804,27 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe + languageName: node + linkType: hard + +"@develar/schema-utils@npm:~2.6.5": + version: 2.6.5 + resolution: "@develar/schema-utils@npm:2.6.5" + dependencies: + ajv: "npm:^6.12.0" + ajv-keywords: "npm:^3.4.1" + checksum: 10c0/7c6075ce6742dd5c89b3cebf81351ec1d73dafc7c3409748860e4f8262fb26ffe6d998c5baab4eca579cd436e7c6c12c615fe89819c19484a22d25b3e6825cb5 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -1797,6 +1832,19 @@ __metadata: languageName: node linkType: hard +"@electron/asar@npm:^3.2.1": + version: 3.2.10 + resolution: "@electron/asar@npm:3.2.10" + dependencies: + commander: "npm:^5.0.0" + glob: "npm:^7.1.6" + minimatch: "npm:^3.0.4" + bin: + asar: bin/asar.js + checksum: 10c0/5b334162ce40fbc2ad5c5f7649452f53c5dab3600bf5029ab4643e13dd288b1247378e9b4062a0fa9970609b1a2036fee9e9b59dbca781ee49e0e5dba7b1b402 + languageName: node + linkType: hard + "@electron/get@npm:^2.0.0": version: 2.0.3 resolution: "@electron/get@npm:2.0.3" @@ -1816,6 +1864,49 @@ __metadata: languageName: node linkType: hard +"@electron/notarize@npm:2.2.1": + version: 2.2.1 + resolution: "@electron/notarize@npm:2.2.1" + dependencies: + debug: "npm:^4.1.1" + fs-extra: "npm:^9.0.1" + promise-retry: "npm:^2.0.1" + checksum: 10c0/d3fbbaaf26e809d4484f87826f02ba9108eba222a495ff533d9728a58a0cca6e267764baefc5616952318a6674eb6d3b7d07b1136ca0254da1c51012a0e6e6ae + languageName: node + linkType: hard + +"@electron/osx-sign@npm:1.0.5": + version: 1.0.5 + resolution: "@electron/osx-sign@npm:1.0.5" + dependencies: + compare-version: "npm:^0.1.2" + debug: "npm:^4.3.4" + fs-extra: "npm:^10.0.0" + isbinaryfile: "npm:^4.0.8" + minimist: "npm:^1.2.6" + plist: "npm:^3.0.5" + bin: + electron-osx-flat: bin/electron-osx-flat.js + electron-osx-sign: bin/electron-osx-sign.js + checksum: 10c0/9b1099858cfe32c2d9329c16e832c003e246cf14356e541342e91876dcbb7a9bab27c89d1f521c3192d1a1d0fd06a186fa101b45341608c434fe850a3053bfb0 + languageName: node + linkType: hard + +"@electron/universal@npm:1.5.1": + version: 1.5.1 + resolution: "@electron/universal@npm:1.5.1" + dependencies: + "@electron/asar": "npm:^3.2.1" + "@malept/cross-spawn-promise": "npm:^1.1.0" + debug: "npm:^4.3.1" + dir-compare: "npm:^3.0.0" + fs-extra: "npm:^9.0.1" + minimatch: "npm:^3.0.4" + plist: "npm:^3.0.4" + checksum: 10c0/2ba4cfd6c7ba4a475c73ae9b168481b1c106e2f8d618a35185d72cf6bd0b9f6b8051e153fab2b63c2514f4fc9da879cca606e63e253d886b29e0e364a87bf840 + languageName: node + linkType: hard + "@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1": version: 1.0.1 resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" @@ -2496,6 +2587,27 @@ __metadata: languageName: node linkType: hard +"@malept/cross-spawn-promise@npm:^1.1.0": + version: 1.1.1 + resolution: "@malept/cross-spawn-promise@npm:1.1.1" + dependencies: + cross-spawn: "npm:^7.0.1" + checksum: 10c0/74c427a152ffff0f19b74af6479d05bef1e996d5e081cfc3b8c47477b9240bd1c42a930884cbcd0c89ee3835201a3bd88d0b0bfd754c0cbb56fc84a28996a8e7 + languageName: node + linkType: hard + +"@malept/flatpak-bundler@npm:^0.4.0": + version: 0.4.0 + resolution: "@malept/flatpak-bundler@npm:0.4.0" + dependencies: + debug: "npm:^4.1.1" + fs-extra: "npm:^9.0.0" + lodash: "npm:^4.17.15" + tmp-promise: "npm:^3.0.2" + checksum: 10c0/b3c87f6482b1956411af1118c771afb39cd9a0568fbb5e86015547ff6d68d2e73a7f0d74b75a57f0a156391c347c8d0adc1037e75172b92da72b96e0a05a2f4f + languageName: node + linkType: hard + "@mdx-js/react@npm:^3.0.0": version: 3.0.1 resolution: "@mdx-js/react@npm:3.0.1" @@ -3982,6 +4094,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.11 resolution: "@tsconfig/node10@npm:1.0.11" @@ -4107,7 +4226,7 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.0.0": +"@types/debug@npm:^4.0.0, @types/debug@npm:^4.1.6": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" dependencies: @@ -4228,6 +4347,15 @@ __metadata: languageName: node linkType: hard +"@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11": + version: 9.0.13 + resolution: "@types/fs-extra@npm:9.0.13" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/576d4e9d382393316ed815c593f7f5c157408ec5e184521d077fcb15d514b5a985245f153ef52142b9b976cb9bd8f801850d51238153ebd0dc9e96b7a7548588 + languageName: node + linkType: hard + "@types/glob@npm:^7.1.3": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -4357,6 +4485,16 @@ __metadata: languageName: node linkType: hard +"@types/plist@npm:^3.0.1": + version: 3.0.5 + resolution: "@types/plist@npm:3.0.5" + dependencies: + "@types/node": "npm:*" + xmlbuilder: "npm:>=11.0.1" + checksum: 10c0/2a929f4482e3bea8c3288a46ae589a2ae2d01df5b7841ead7032d7baa79d79af6c875a5798c90705eea9306c2fb1544d7ed12ab3c905c5626d5dd5dc9f464b94 + languageName: node + linkType: hard + "@types/pretty-hrtime@npm:^1.0.0": version: 1.0.3 resolution: "@types/pretty-hrtime@npm:1.0.3" @@ -4449,6 +4587,13 @@ __metadata: languageName: node linkType: hard +"@types/sprintf-js@npm:^1": + version: 1.1.4 + resolution: "@types/sprintf-js@npm:1.1.4" + checksum: 10c0/b56aa88876b8c2b00df7f931615f33371231c265328875024071e3dca151021bbce6143833fc2172640a75680dec260a80cca451374976f6fd29d305b108cfe1 + languageName: node + linkType: hard + "@types/throttle-debounce@npm:^5": version: 5.0.2 resolution: "@types/throttle-debounce@npm:5.0.2" @@ -4463,6 +4608,13 @@ __metadata: languageName: node linkType: hard +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + "@types/unist@npm:*, @types/unist@npm:^3.0.0": version: 3.0.2 resolution: "@types/unist@npm:3.0.2" @@ -4484,6 +4636,13 @@ __metadata: languageName: node linkType: hard +"@types/verror@npm:^1.10.3": + version: 1.10.10 + resolution: "@types/verror@npm:1.10.10" + checksum: 10c0/413c0c0370ed6a796d630fbcdae20049ab3e26558c62bc5f53327830ddb0965aaadedb92f4933b28ee8fc8089e1293b742a0efbf6b264d15ce3930c6b83b0984 + languageName: node + linkType: hard + "@types/yauzl@npm:^2.9.1": version: 2.10.3 resolution: "@types/yauzl@npm:2.10.3" @@ -4738,6 +4897,13 @@ __metadata: languageName: node linkType: hard +"@xmldom/xmldom@npm:^0.8.8": + version: 0.8.10 + resolution: "@xmldom/xmldom@npm:0.8.10" + checksum: 10c0/c7647c442502720182b0d65b17d45d2d95317c1c8c497626fe524bda79b4fb768a9aa4fae2da919f308e7abcff7d67c058b102a9d641097e9a57f0b80187851f + languageName: node + linkType: hard + "@xterm/addon-fit@npm:^0.10.0": version: 0.10.0 resolution: "@xterm/addon-fit@npm:0.10.0" @@ -4859,6 +5025,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": version: 7.1.1 resolution: "agent-base@npm:7.1.1" @@ -4878,7 +5053,16 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4": +"ajv-keywords@npm:^3.4.1": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.0, ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -4946,6 +5130,51 @@ __metadata: languageName: node linkType: hard +"app-builder-bin@npm:4.0.0": + version: 4.0.0 + resolution: "app-builder-bin@npm:4.0.0" + checksum: 10c0/9df57b2460aa058971c8619132c4ab5b7b4572449c8f5b562e44c9d6c1c73ec7284f4d1e170549c42eef53cd9e0b7579409fb49fba862ab4d3050433579ef14c + languageName: node + linkType: hard + +"app-builder-lib@npm:24.13.3": + version: 24.13.3 + resolution: "app-builder-lib@npm:24.13.3" + dependencies: + "@develar/schema-utils": "npm:~2.6.5" + "@electron/notarize": "npm:2.2.1" + "@electron/osx-sign": "npm:1.0.5" + "@electron/universal": "npm:1.5.1" + "@malept/flatpak-bundler": "npm:^0.4.0" + "@types/fs-extra": "npm:9.0.13" + async-exit-hook: "npm:^2.0.1" + bluebird-lst: "npm:^1.0.9" + builder-util: "npm:24.13.1" + builder-util-runtime: "npm:9.2.4" + chromium-pickle-js: "npm:^0.2.0" + debug: "npm:^4.3.4" + ejs: "npm:^3.1.8" + electron-publish: "npm:24.13.1" + form-data: "npm:^4.0.0" + fs-extra: "npm:^10.1.0" + hosted-git-info: "npm:^4.1.0" + is-ci: "npm:^3.0.0" + isbinaryfile: "npm:^5.0.0" + js-yaml: "npm:^4.1.0" + lazy-val: "npm:^1.0.5" + minimatch: "npm:^5.1.1" + read-config-file: "npm:6.3.2" + sanitize-filename: "npm:^1.6.3" + semver: "npm:^7.3.8" + tar: "npm:^6.1.12" + temp-file: "npm:^3.4.0" + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + checksum: 10c0/a3ff90e63f738e8a0d8a2f52fc336cd130adf1c00c7fe8e575a3b2bbb23b733135d530589882b45735fb8e43ff9ad8ed19d5992b4ac81029371efbb4bc6ffdb2 + languageName: node + linkType: hard + "app-root-dir@npm:^1.0.2": version: 1.0.2 resolution: "app-root-dir@npm:1.0.2" @@ -5018,6 +5247,13 @@ __metadata: languageName: node linkType: hard +"assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 10c0/b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + "assert@npm:^2.1.0": version: 2.1.0 resolution: "assert@npm:2.1.0" @@ -5047,6 +5283,20 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"async-exit-hook@npm:^2.0.1": + version: 2.0.1 + resolution: "async-exit-hook@npm:2.0.1" + checksum: 10c0/81407a440ef0aab328df2369f1a9d957ee53e9a5a43e3b3dcb2be05151a68de0e4ff5e927f4718c88abf85800731f5b3f69a47a6642ce135f5e7d43ca0fce41d + languageName: node + linkType: hard + "async@npm:^3.2.3": version: 3.2.5 resolution: "async@npm:3.2.5" @@ -5054,6 +5304,20 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -5177,6 +5441,22 @@ __metadata: languageName: node linkType: hard +"bluebird-lst@npm:^1.0.9": + version: 1.0.9 + resolution: "bluebird-lst@npm:1.0.9" + dependencies: + bluebird: "npm:^3.5.5" + checksum: 10c0/701eef18f37a53277adeacb21281a70fc4536e521fe0deb665a284f4d8480056c6932988c3dfa6a0c46b4d55f4599f716a15873f30ed5fc2470928093438f87e + languageName: node + linkType: hard + +"bluebird@npm:^3.5.5": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + "body-parser@npm:1.20.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" @@ -5278,6 +5558,13 @@ __metadata: languageName: node linkType: hard +"buffer-equal@npm:^1.0.0": + version: 1.0.1 + resolution: "buffer-equal@npm:1.0.1" + checksum: 10c0/578f03cc9458f9151f68478ab80ebee99a4203de0647a47b491aa3d5fb821938cb4139119a2dae1a1ef9ed5506e0eee4d6a37178efbf2e2e0ee3a9886898fffd + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -5285,7 +5572,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0": +"buffer@npm:^5.1.0, buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -5295,6 +5582,40 @@ __metadata: languageName: node linkType: hard +"builder-util-runtime@npm:9.2.4": + version: 9.2.4 + resolution: "builder-util-runtime@npm:9.2.4" + dependencies: + debug: "npm:^4.3.4" + sax: "npm:^1.2.4" + checksum: 10c0/858978ffced52935db9c13139235679933616095459796ef2969e86641be53edec8c07bf14cfb42516e017124c653839aa4f66451dd5b41ba84728f54a167c64 + languageName: node + linkType: hard + +"builder-util@npm:24.13.1": + version: 24.13.1 + resolution: "builder-util@npm:24.13.1" + dependencies: + 7zip-bin: "npm:~5.2.0" + "@types/debug": "npm:^4.1.6" + app-builder-bin: "npm:4.0.0" + bluebird-lst: "npm:^1.0.9" + builder-util-runtime: "npm:9.2.4" + chalk: "npm:^4.1.2" + cross-spawn: "npm:^7.0.3" + debug: "npm:^4.3.4" + fs-extra: "npm:^10.1.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.1" + is-ci: "npm:^3.0.0" + js-yaml: "npm:^4.1.0" + source-map-support: "npm:^0.5.19" + stat-mode: "npm:^1.0.0" + temp-file: "npm:^3.4.0" + checksum: 10c0/4f6654a73eaca8cb2a6d83e5a73318d47843df72d0eaa28392cdc0e38d8e343b91c6019bae0274eba4dfde9e82abd94e0eee75157f1fba7e8a8590631624987a + languageName: node + linkType: hard + "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -5527,6 +5848,20 @@ __metadata: languageName: node linkType: hard +"chromium-pickle-js@npm:^0.2.0": + version: 0.2.0 + resolution: "chromium-pickle-js@npm:0.2.0" + checksum: 10c0/0a95bd280acdf05b0e08fa1a0e1db58c815dd24e92d639add8f494d23a8a49c26e4829721224d68f2f0e57a69047714db29bcff6deb5d029332321223416cb29 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + "citty@npm:^0.1.6": version: 0.1.6 resolution: "citty@npm:0.1.6" @@ -5572,6 +5907,27 @@ __metadata: languageName: node linkType: hard +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: 10c0/dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -5606,7 +5962,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -5631,13 +5987,52 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 languageName: node linkType: hard +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + "comma-separated-tokens@npm:^2.0.0": version: 2.0.3 resolution: "comma-separated-tokens@npm:2.0.3" @@ -5652,6 +6047,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^5.0.0": + version: 5.1.0 + resolution: "commander@npm:5.1.0" + checksum: 10c0/da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d + languageName: node + linkType: hard + "commander@npm:^6.2.1": version: 6.2.1 resolution: "commander@npm:6.2.1" @@ -5673,6 +6075,13 @@ __metadata: languageName: node linkType: hard +"compare-version@npm:^0.1.2": + version: 0.1.2 + resolution: "compare-version@npm:0.1.2" + checksum: 10c0/f38b853cf0d244c0af5f444409abde3d2198cd97312efa1dbc4ab41b520009327c2a63db59bbaf2d69288eff6167ef22be9788dc5476157d073ecdff1a8eeb2d + languageName: node + linkType: hard + "compressible@npm:~2.0.16": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -5711,6 +6120,16 @@ __metadata: languageName: node linkType: hard +"config-file-ts@npm:^0.2.4": + version: 0.2.6 + resolution: "config-file-ts@npm:0.2.6" + dependencies: + glob: "npm:^10.3.10" + typescript: "npm:^5.3.3" + checksum: 10c0/ae4c213550aaa1c50671938ff0106495b7610b99a810fed9e35b5ca94dd49fcdd4f22cf132d3368cd19d67e37fff761352d63559f0e8866105a877f476a07be7 + languageName: node + linkType: hard + "consola@npm:^3.2.3": version: 3.2.3 resolution: "consola@npm:3.2.3" @@ -5773,6 +6192,13 @@ __metadata: languageName: node linkType: hard +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 10c0/980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -5780,6 +6206,15 @@ __metadata: languageName: node linkType: hard +"crc@npm:^3.8.0": + version: 3.8.0 + resolution: "crc@npm:3.8.0" + dependencies: + buffer: "npm:^5.1.0" + checksum: 10c0/1a0da36e5f95b19cd2a7b2eab5306a08f1c47bdd22da6f761ab764e2222e8e90a877398907cea94108bd5e41a6d311ea84d7914eaca67da2baa4050bd6384b3d + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -5787,7 +6222,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -6298,6 +6733,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -6392,6 +6834,16 @@ __metadata: languageName: node linkType: hard +"dir-compare@npm:^3.0.0": + version: 3.3.0 + resolution: "dir-compare@npm:3.3.0" + dependencies: + buffer-equal: "npm:^1.0.0" + minimatch: "npm:^3.0.4" + checksum: 10c0/bafcb225a629994f1d5808eeb11b3b8adf49356c86bdc87588b30f22f8709044166e3b368c050b6a72bc54397c52d7e8013d5b5741306ee3511bf6b924f66212 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -6401,6 +6853,42 @@ __metadata: languageName: node linkType: hard +"dmg-builder@npm:24.13.3": + version: 24.13.3 + resolution: "dmg-builder@npm:24.13.3" + dependencies: + app-builder-lib: "npm:24.13.3" + builder-util: "npm:24.13.1" + builder-util-runtime: "npm:9.2.4" + dmg-license: "npm:^1.0.11" + fs-extra: "npm:^10.1.0" + iconv-lite: "npm:^0.6.2" + js-yaml: "npm:^4.1.0" + dependenciesMeta: + dmg-license: + optional: true + checksum: 10c0/1eb9e2d1396a9072d156657e537191ceb9d468e4884ef501ac58931f8d423e02ec48644e417cbb52e916d738d691d8a7254fe487b4882848527d58b8658b94f6 + languageName: node + linkType: hard + +"dmg-license@npm:^1.0.11": + version: 1.0.11 + resolution: "dmg-license@npm:1.0.11" + dependencies: + "@types/plist": "npm:^3.0.1" + "@types/verror": "npm:^1.10.3" + ajv: "npm:^6.10.0" + crc: "npm:^3.8.0" + iconv-corefoundation: "npm:^1.1.7" + plist: "npm:^3.0.4" + smart-buffer: "npm:^4.0.2" + verror: "npm:^1.10.0" + bin: + dmg-license: bin/dmg-license.js + conditions: os=darwin + languageName: node + linkType: hard + "dnd-core@npm:^16.0.1": version: 16.0.1 resolution: "dnd-core@npm:16.0.1" @@ -6442,6 +6930,13 @@ __metadata: languageName: node linkType: hard +"dotenv-expand@npm:^5.1.0": + version: 5.1.0 + resolution: "dotenv-expand@npm:5.1.0" + checksum: 10c0/24ac633de853ef474d0421cc639328b7134109c8dc2baaa5e3afb7495af5e9237136d7e6971e55668e4dce915487eb140967cdd2b3e99aa439e0f6bf8b56faeb + languageName: node + linkType: hard + "dotenv@npm:^16.0.0": version: 16.4.5 resolution: "dotenv@npm:16.4.5" @@ -6449,6 +6944,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^9.0.2": + version: 9.0.2 + resolution: "dotenv@npm:9.0.2" + checksum: 10c0/535f04d59e0bf58fe0c7966886eff42fb5e0227e2f7bfa38d37439bbf6b3c25d1b085bd235c9b98e7e9a032b1cd310904366e5588b320c29335d359660fab0d4 + languageName: node + linkType: hard + "duplexify@npm:^3.5.0, duplexify@npm:^3.6.0": version: 3.7.1 resolution: "duplexify@npm:3.7.1" @@ -6475,7 +6977,7 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^3.1.10": +"ejs@npm:^3.1.10, ejs@npm:^3.1.8": version: 3.1.10 resolution: "ejs@npm:3.1.10" dependencies: @@ -6486,6 +6988,43 @@ __metadata: languageName: node linkType: hard +"electron-builder@npm:^24.13.3": + version: 24.13.3 + resolution: "electron-builder@npm:24.13.3" + dependencies: + app-builder-lib: "npm:24.13.3" + builder-util: "npm:24.13.1" + builder-util-runtime: "npm:9.2.4" + chalk: "npm:^4.1.2" + dmg-builder: "npm:24.13.3" + fs-extra: "npm:^10.1.0" + is-ci: "npm:^3.0.0" + lazy-val: "npm:^1.0.5" + read-config-file: "npm:6.3.2" + simple-update-notifier: "npm:2.0.0" + yargs: "npm:^17.6.2" + bin: + electron-builder: cli.js + install-app-deps: install-app-deps.js + checksum: 10c0/497b83ef6c95e1756eb11f824cc52e434b1a83c3abe24df6958a348b6faf77b274892a09ca21ef60a241aac8d55804b321e443471fc8afdbac2dc563dea321c5 + languageName: node + linkType: hard + +"electron-publish@npm:24.13.1": + version: 24.13.1 + resolution: "electron-publish@npm:24.13.1" + dependencies: + "@types/fs-extra": "npm:^9.0.11" + builder-util: "npm:24.13.1" + builder-util-runtime: "npm:9.2.4" + chalk: "npm:^4.1.2" + fs-extra: "npm:^10.1.0" + lazy-val: "npm:^1.0.5" + mime: "npm:^2.5.2" + checksum: 10c0/d31e14f836c7cb4e56f897fcebedbe4c13c32974688d5c3a77681df882a24229188de4c0d46e9ae4981df6f308889118671a6ef5279105f8e6b920c34e1fcc2c + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.668": version: 1.4.765 resolution: "electron-to-chromium@npm:1.4.765" @@ -6555,6 +7094,13 @@ __metadata: languageName: node linkType: hard +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -6935,7 +7481,7 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.2": +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 @@ -7254,6 +7800,13 @@ __metadata: languageName: node linkType: hard +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 10c0/e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -7306,6 +7859,13 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + "fetch-retry@npm:^5.0.2": version: 5.0.6 resolution: "fetch-retry@npm:5.0.6" @@ -7447,6 +8007,13 @@ __metadata: languageName: node linkType: hard +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -7466,6 +8033,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -7498,6 +8076,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -7520,6 +8109,18 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -7585,6 +8186,13 @@ __metadata: languageName: node linkType: hard +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + "get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": version: 2.0.2 resolution: "get-func-name@npm:2.0.2" @@ -7727,7 +8335,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": +"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -8101,6 +8709,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^4.1.0": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: "npm:^6.0.0" + checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -8156,6 +8773,17 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -8176,6 +8804,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1": version: 7.0.4 resolution: "https-proxy-agent@npm:7.0.4" @@ -8200,6 +8838,16 @@ __metadata: languageName: node linkType: hard +"iconv-corefoundation@npm:^1.1.7": + version: 1.1.7 + resolution: "iconv-corefoundation@npm:1.1.7" + dependencies: + cli-truncate: "npm:^2.1.0" + node-addon-api: "npm:^1.6.3" + conditions: os=darwin + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -8400,6 +9048,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -8435,6 +9090,17 @@ __metadata: languageName: node linkType: hard +"is-ci@npm:^3.0.0": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" + dependencies: + ci-info: "npm:^3.2.0" + bin: + is-ci: bin.js + checksum: 10c0/0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 + languageName: node + linkType: hard + "is-core-module@npm:^2.13.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" @@ -8720,6 +9386,20 @@ __metadata: languageName: node linkType: hard +"isbinaryfile@npm:^4.0.8": + version: 4.0.10 + resolution: "isbinaryfile@npm:4.0.10" + checksum: 10c0/0703d8cfeb69ed79e6d173120f327450011a066755150a6bbf97ffecec1069a5f2092777868315b21359098c84b54984871cad1abce877ad9141fb2caf3dcabf + languageName: node + linkType: hard + +"isbinaryfile@npm:^5.0.0": + version: 5.0.2 + resolution: "isbinaryfile@npm:5.0.2" + checksum: 10c0/9696f20cf995e375ba8bfdba3ff7d1c0435346f6fc5dd9c049a55514c56e9f49342bbf8c240dc9f56e104bd3a69176c0421922bcb34d72b3c943f4117ade3f53 + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -8962,7 +9642,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.2.0, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -9019,6 +9699,13 @@ __metadata: languageName: node linkType: hard +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + "lazy-universal-dotenv@npm:^4.0.0": version: 4.0.0 resolution: "lazy-universal-dotenv@npm:4.0.0" @@ -9030,6 +9717,13 @@ __metadata: languageName: node linkType: hard +"lazy-val@npm:^1.0.4, lazy-val@npm:^1.0.5": + version: 1.0.5 + resolution: "lazy-val@npm:1.0.5" + checksum: 10c0/28ba7a0e704895a444eed47d110274090f485b991f2ea6fff2ab0878c529c53f60f2eb2d944cbbd68b91408e7455eabc62861c48289d4757fa9c818b97454f24 + languageName: node + linkType: hard + "less@npm:^4.2.0": version: 4.2.0 resolution: "less@npm:4.2.0" @@ -9141,7 +9835,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash@npm:^4.17.15, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -9158,6 +9852,20 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.6.0, logform@npm:^2.6.1": + version: 2.6.1 + resolution: "logform@npm:2.6.1" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/c20019336b1da8c08adea67dd7de2b0effdc6e35289c0156722924b571df94ba9f900ef55620c56bceb07cae7cc46057c9859accdee37a131251ba34d6789bce + languageName: node + linkType: hard + "longest-streak@npm:^3.0.0": version: 3.1.0 resolution: "longest-streak@npm:3.1.0" @@ -9208,6 +9916,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + "lz-string@npm:^1.5.0": version: 1.5.0 resolution: "lz-string@npm:1.5.0" @@ -9933,7 +10650,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -9951,6 +10668,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^2.5.2": + version: 2.6.0 + resolution: "mime@npm:2.6.0" + bin: + mime: cli.js + checksum: 10c0/a7f2589900d9c16e3bdf7672d16a6274df903da958c1643c9c45771f0478f3846dcb1097f31eb9178452570271361e2149310931ec705c037210fc69639c8e6c + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -9995,7 +10721,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" dependencies: @@ -10153,7 +10879,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -10202,6 +10928,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^1.6.3": + version: 1.7.2 + resolution: "node-addon-api@npm:1.7.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/bcf526f2ce788182730d3c3df5206585873d1e837a6e1378ff84abccf2f19cf3f93a8274f9c1245af0de63a0dbd1bb95ca2f767ecf5c678d6930326aaf396c4e + languageName: node + linkType: hard + "node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" @@ -10404,6 +11139,15 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + "onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -10803,6 +11547,17 @@ __metadata: languageName: node linkType: hard +"plist@npm:^3.0.4, plist@npm:^3.0.5": + version: 3.1.0 + resolution: "plist@npm:3.1.0" + dependencies: + "@xmldom/xmldom": "npm:^0.8.8" + base64-js: "npm:^1.5.1" + xmlbuilder: "npm:^15.1.1" + checksum: 10c0/db19ba50faafc4103df8e79bcd6b08004a56db2a9dd30b3e5c8b0ef30398ef44344a674e594d012c8fc39e539a2b72cb58c60a76b4b4401cbbc7c8f6b028d93d + languageName: node + linkType: hard + "polished@npm:^4.2.2": version: 4.3.1 resolution: "polished@npm:4.3.1" @@ -11339,6 +12094,20 @@ __metadata: languageName: node linkType: hard +"read-config-file@npm:6.3.2": + version: 6.3.2 + resolution: "read-config-file@npm:6.3.2" + dependencies: + config-file-ts: "npm:^0.2.4" + dotenv: "npm:^9.0.2" + dotenv-expand: "npm:^5.1.0" + js-yaml: "npm:^4.1.0" + json5: "npm:^2.2.0" + lazy-val: "npm:^1.0.4" + checksum: 10c0/b249d165c342e32497ce2ca9f31cddad150111763c2199601e3b9a33b726ff0f7fefbea7680c19c422e2cac810b4b4daf5d1890c06ebf65ed6feef1173238f91 + languageName: node + linkType: hard + "read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -11377,7 +12146,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -11586,6 +12355,13 @@ __metadata: languageName: node linkType: hard +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + "resolve-alpn@npm:^1.0.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -11807,6 +12583,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -11814,6 +12597,15 @@ __metadata: languageName: node linkType: hard +"sanitize-filename@npm:^1.6.3": + version: 1.6.3 + resolution: "sanitize-filename@npm:1.6.3" + dependencies: + truncate-utf8-bytes: "npm:^1.0.0" + checksum: 10c0/16ff47556a6e54e228c28db096bedd303da67b030d4bea4925fd71324932d6b02c7b0446f00ad33987b25b6414f24ae968e01a1a1679ce599542e82c4b07eb1f + languageName: node + linkType: hard + "sax@npm:^1.2.4": version: 1.3.0 resolution: "sax@npm:1.3.0" @@ -11864,6 +12656,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.3.8": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -11997,6 +12798,24 @@ __metadata: languageName: node linkType: hard +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + languageName: node + linkType: hard + +"simple-update-notifier@npm:2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/2a00bd03bfbcbf8a737c47ab230d7920f8bfb92d1159d421bdd194479f6d01ebc995d13fbe13d45dace23066a78a3dc6642999b4e3b38b847e6664191575b20c + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -12018,7 +12837,18 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^4.2.0": +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.0.2, smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 @@ -12053,7 +12883,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.16": +"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.19": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -12127,6 +12957,13 @@ __metadata: languageName: node linkType: hard +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -12134,6 +12971,13 @@ __metadata: languageName: node linkType: hard +"stat-mode@npm:^1.0.0": + version: 1.0.0 + resolution: "stat-mode@npm:1.0.0" + checksum: 10c0/89b66a538dbfd45038fefdaf5b2104dc6e911605af1c201793e9629592ed9fdc7bdd1bca42806d0d4167c6d9cacac1f3fda41ddfe334a5c1f898113da38fae74 + languageName: node + linkType: hard + "state-local@npm:^1.0.6": version: 1.0.7 resolution: "state-local@npm:1.0.7" @@ -12190,7 +13034,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -12381,7 +13225,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": +"tar@npm:^6.1.11, tar@npm:^6.1.12, tar@npm:^6.1.2, tar@npm:^6.2.0": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -12411,6 +13255,16 @@ __metadata: languageName: node linkType: hard +"temp-file@npm:^3.4.0": + version: 3.4.0 + resolution: "temp-file@npm:3.4.0" + dependencies: + async-exit-hook: "npm:^2.0.1" + fs-extra: "npm:^10.0.0" + checksum: 10c0/70e441909097346a930ae02278df9b0133cd02dddf0b49e5ddaade735fef1410a50a448a2a812106f97c045294c99cc19f26943eb88f1d728d41fbc445a40298 + languageName: node + linkType: hard + "temp@npm:^0.8.4": version: 0.8.4 resolution: "temp@npm:0.8.4" @@ -12443,6 +13297,13 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -12474,6 +13335,7 @@ __metadata: "@types/node": "npm:^20.12.12" "@types/papaparse": "npm:^5" "@types/react": "npm:^18.3.2" + "@types/sprintf-js": "npm:^1" "@types/throttle-debounce": "npm:^5" "@types/tinycolor2": "npm:^1" "@types/uuid": "npm:^9.0.8" @@ -12486,6 +13348,7 @@ __metadata: clsx: "npm:^2.1.1" dayjs: "npm:^1.11.11" electron: "npm:^31.1.0" + electron-builder: "npm:^24.13.3" electron-vite: "npm:^2.2.0" eslint: "npm:^9.2.0" eslint-config-prettier: "npm:^9.1.0" @@ -12510,6 +13373,7 @@ __metadata: rehype-raw: "npm:^7.0.0" remark-gfm: "npm:^4.0.0" rxjs: "npm:^7.8.1" + sprintf-js: "npm:^1.1.3" storybook: "npm:^8.1.10" throttle-debounce: "npm:^5.0.0" tinycolor2: "npm:^1.6.0" @@ -12524,6 +13388,7 @@ __metadata: vite-plugin-static-copy: "npm:^1.0.5" vite-tsconfig-paths: "npm:^4.3.2" vitest: "npm:^1.6.0" + winston: "npm:^3.13.1" languageName: unknown linkType: soft @@ -12579,6 +13444,22 @@ __metadata: languageName: node linkType: hard +"tmp-promise@npm:^3.0.2": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: "npm:^0.2.0" + checksum: 10c0/23b47dcb2e82b14bbd8f61ed7a9d9353cdb6a6f09d7716616cfd27d0087040cd40152965a518e598d7aabe1489b9569bf1eebde0c5fadeaf3ec8098adcebea4e + languageName: node + linkType: hard + +"tmp@npm:^0.2.0": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -12623,6 +13504,13 @@ __metadata: languageName: node linkType: hard +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + languageName: node + linkType: hard + "trough@npm:^2.0.0": version: 2.2.0 resolution: "trough@npm:2.2.0" @@ -12630,6 +13518,15 @@ __metadata: languageName: node linkType: hard +"truncate-utf8-bytes@npm:^1.0.0": + version: 1.0.2 + resolution: "truncate-utf8-bytes@npm:1.0.2" + dependencies: + utf8-byte-length: "npm:^1.0.1" + checksum: 10c0/af2b431fc4314f119b551e5fccfad49d4c0ef82e13ba9ca61be6567801195b08e732ce9643542e8ad1b3df44f3df2d7345b3dd34f723954b6bb43a14584d6b3c + languageName: node + linkType: hard + "ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" @@ -12823,6 +13720,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.3.3": + version: 5.5.3 + resolution: "typescript@npm:5.5.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/f52c71ccbc7080b034b9d3b72051d563601a4815bf3e39ded188e6ce60813f75dbedf11ad15dd4d32a12996a9ed8c7155b46c93a9b9c9bad1049766fe614bbdd + languageName: node + linkType: hard + "typescript@npm:^5.4.5": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -12833,6 +13740,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": + version: 5.5.3 + resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/911c7811d61f57f07df79c4a35f56a0f426a65426a020e5fcd792f66559f399017205f5f10255329ab5a3d8c2d1f1d19530aeceffda70758a521fae1d469432e + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.4.5#optional!builtin": version: 5.4.5 resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" @@ -13107,6 +14024,13 @@ __metadata: languageName: node linkType: hard +"utf8-byte-length@npm:^1.0.1": + version: 1.0.5 + resolution: "utf8-byte-length@npm:1.0.5" + checksum: 10c0/e69bda3299608f4cc75976da9fb74ac94801a58b9ca29fdad03a20ec952e7477d7f226c12716b5f36bd4cff8151d1d152d02ee1df3752f017d4b2c725ce3e47a + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -13167,6 +14091,17 @@ __metadata: languageName: node linkType: hard +"verror@npm:^1.10.0": + version: 1.10.1 + resolution: "verror@npm:1.10.1" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 10c0/293fb060a4c9b07965569a0c3e45efa954127818707995a8a4311f691b5d6687be99f972c759838ba6eecae717f9af28e3c49d2afc7bbdf5f0b675238f1426e8 + languageName: node + linkType: hard + "vfile-location@npm:^5.0.0": version: 5.0.2 resolution: "vfile-location@npm:5.0.2" @@ -13462,6 +14397,36 @@ __metadata: languageName: node linkType: hard +"winston-transport@npm:^4.7.0": + version: 4.7.1 + resolution: "winston-transport@npm:4.7.1" + dependencies: + logform: "npm:^2.6.1" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/99b7b55cc2ef7f38988ab1717e7fd946c81b856b42a9530aef8ee725490ef2f2811f9cb06d63aa2f76a85fe99ae15b3bef10a54afde3be8b5059ce325e78481f + languageName: node + linkType: hard + +"winston@npm:^3.13.1": + version: 3.13.1 + resolution: "winston@npm:3.13.1" + dependencies: + "@colors/colors": "npm:^1.6.0" + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.6.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.7.0" + checksum: 10c0/986a542f17b71935b88c14465939bf7eaf64d8d13c18792f74b0eb19b31abdaf472df92049a1d7882405076aba95de13cdb5b3243d0c04c4f9632fac85f57788 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -13476,7 +14441,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -13531,6 +14496,13 @@ __metadata: languageName: node linkType: hard +"xmlbuilder@npm:>=11.0.1, xmlbuilder@npm:^15.1.1": + version: 15.1.1 + resolution: "xmlbuilder@npm:15.1.1" + checksum: 10c0/665266a8916498ff8d82b3d46d3993913477a254b98149ff7cff060d9b7cc0db7cf5a3dae99aed92355254a808c0e2e3ec74ad1b04aa1061bdb8dfbea26c18b8 + languageName: node + linkType: hard + "xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -13538,6 +14510,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -13552,6 +14531,28 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.6.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0"