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"