From 1874d9a252033f522c45a2de1d425178ef02471f Mon Sep 17 00:00:00 2001 From: Mike Sawka Date: Tue, 11 Jun 2024 17:42:10 -0700 Subject: [PATCH] port to electron (#33) --- .gitignore | 2 + Taskfile.old.yml | 431 +++ Taskfile.yml | 420 +-- cmd/generate/main-generate.go | 89 +- cmd/server/main-server.go | 95 + emain/emain.ts | 243 ++ emain/preload.js | 6 + eslint.config.js | 16 +- frontend/app/app.less | 62 + frontend/app/app.tsx | 2 +- frontend/app/element/quickelems.tsx | 1 + {public => frontend/app}/reset.less | 0 frontend/app/store/global.ts | 86 +- frontend/app/store/services.ts | 100 + frontend/app/store/wos.ts | 142 +- frontend/app/store/ws.ts | 254 ++ frontend/app/tab/tab.tsx | 5 +- {public => frontend/app}/term.less | 0 {public => frontend/app}/theme.less | 0 frontend/app/view/codeedit.tsx | 2 +- frontend/app/view/directorypreview.tsx | 1 - frontend/app/view/preview.tsx | 14 +- frontend/app/view/term.tsx | 44 +- frontend/app/workspace/workspace.tsx | 15 +- frontend/faraday/index.ts | 10 +- frontend/faraday/lib/TileLayout.tsx | 16 +- frontend/faraday/lib/layoutAtom.ts | 4 +- frontend/faraday/lib/layoutNode.ts | 4 +- frontend/faraday/lib/layoutState.ts | 8 +- frontend/types/custom.d.ts | 104 - frontend/types/gotypes.d.ts | 174 ++ frontend/util/fontutil.ts | 24 +- frontend/wave.ts | 16 +- go.mod | 43 +- go.sum | 178 +- main.go | 305 -- package.json | 31 +- pkg/blockcontroller/blockcontroller.go | 14 +- pkg/eventbus/eventbus.go | 170 +- pkg/service/blockservice/blockservice.go | 8 + pkg/service/objectservice/objectservice.go | 131 +- pkg/service/service.go | 429 +++ pkg/service/servicemeta/servicemeta.go | 10 + pkg/shellexec/shellexec.go | 1 + pkg/tsgen/tsgen.go | 354 +++ pkg/util/utilfn/utilfn.go | 26 + pkg/waveobj/waveobj.go | 25 + pkg/waveobj/waveobj_gen.go | 160 -- pkg/waveobj/waveobj_test.go | 30 - pkg/web/web.go | 217 ++ pkg/web/ws.go | 215 ++ pkg/wstore/wstore.go | 14 + pkg/wstore/wstore_dbops.go | 3 +- pkg/wstore/wstore_types.go | 68 + prettier.config.js | 3 +- public/index.html | 13 +- tsconfig.json | 2 +- version.js | 5 + webpack.config.js | 30 + webpack/webpack.electron.js | 114 + webpack/webpack.web.js | 154 + yarn.lock | 2970 +++++++++++++++++++- 62 files changed, 6498 insertions(+), 1615 deletions(-) create mode 100644 Taskfile.old.yml create mode 100644 cmd/server/main-server.go create mode 100644 emain/emain.ts create mode 100644 emain/preload.js create mode 100644 frontend/app/app.less rename {public => frontend/app}/reset.less (100%) create mode 100644 frontend/app/store/services.ts create mode 100644 frontend/app/store/ws.ts rename {public => frontend/app}/term.less (100%) rename {public => frontend/app}/theme.less (100%) create mode 100644 frontend/types/gotypes.d.ts delete mode 100644 main.go create mode 100644 pkg/service/service.go create mode 100644 pkg/service/servicemeta/servicemeta.go create mode 100644 pkg/tsgen/tsgen.go delete mode 100644 pkg/waveobj/waveobj_gen.go delete mode 100644 pkg/waveobj/waveobj_test.go create mode 100644 pkg/web/web.go create mode 100644 pkg/web/ws.go create mode 100644 version.js create mode 100644 webpack.config.js create mode 100644 webpack/webpack.electron.js create mode 100644 webpack/webpack.web.js diff --git a/.gitignore b/.gitignore index a911395e..527a721d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .task frontend/dist dist/ +dist-dev/ frontend/node_modules node_modules/ frontend/bindings @@ -11,6 +12,7 @@ bin/ *.exe .DS_Store *~ +out/ # Yarn Modern .pnp.* diff --git a/Taskfile.old.yml b/Taskfile.old.yml new file mode 100644 index 00000000..e8c28220 --- /dev/null +++ b/Taskfile.old.yml @@ -0,0 +1,431 @@ +version: "3" + +vars: + APP_NAME: "NextWave" + BIN_DIR: "bin" + VITE_PORT: "{{.WAILS_VITE_PORT | default 9245}}" + +tasks: + ## -------------------------- Build -------------------------- ## + + build: + summary: Builds the application + cmds: + # Build for current OS + - task: build:{{OS}} + + # Uncomment to build for specific OSes + # - task: build:linux + # - task: build:windows + # - task: build:darwin + + ## ------> Windows <------- + + build:windows: + summary: Builds the application for Windows + deps: + - task: go:mod:tidy + - task: build:frontend + - task: generate:icons + - task: generate:syso + vars: + ARCH: "{{.ARCH}}" + cmds: + - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s -H windowsgui"{{else}}-gcflags=all="-l"{{end}}' + env: + GOOS: windows + CGO_ENABLED: 0 + GOARCH: "{{.ARCH | default ARCH}}" + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + build:windows:prod:arm64: + summary: Creates a production build of the application + cmds: + - task: build:windows + vars: + ARCH: arm64 + PRODUCTION: "true" + + build:windows:prod:amd64: + summary: Creates a production build of the application + cmds: + - task: build:windows + vars: + ARCH: amd64 + PRODUCTION: "true" + + build:windows:debug:arm64: + summary: Creates a debug build of the application + cmds: + - task: build:windows + vars: + ARCH: arm64 + + build:windows:debug:amd64: + summary: Creates a debug build of the application + cmds: + - task: build:windows + vars: + ARCH: amd64 + + ## ------> Darwin <------- + + build:darwin: + summary: Creates a production build of the application + deps: + - task: go:mod:tidy + - task: build:frontend + - task: generate:icons + cmds: + - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}} + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}' + env: + GOOS: darwin + CGO_ENABLED: 1 + GOARCH: "{{.ARCH | default ARCH}}" + CGO_CFLAGS: "-mmacosx-version-min=10.15" + CGO_LDFLAGS: "-mmacosx-version-min=10.15" + MACOSX_DEPLOYMENT_TARGET: "10.15" + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + build:darwin:prod:arm64: + summary: Creates a production build of the application + cmds: + - task: build:darwin + vars: + ARCH: arm64 + PRODUCTION: "true" + + build:darwin:prod:amd64: + summary: Creates a production build of the application + cmds: + - task: build:darwin + vars: + ARCH: amd64 + PRODUCTION: "true" + + build:darwin:debug:arm64: + summary: Creates a debug build of the application + cmds: + - task: build:darwin + vars: + ARCH: arm64 + + build:darwin:debug:amd64: + summary: Creates a debug build of the application + cmds: + - task: build:darwin + vars: + ARCH: amd64 + + ## ------> Linux <------- + + build:linux: + summary: Builds the application for Linux + deps: + - task: go:mod:tidy + - task: build:frontend + - task: generate:icons + vars: + ARCH: "{{.ARCH}}" + cmds: + - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/w2 + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}' + env: + GOOS: linux + CGO_ENABLED: 1 + GOARCH: "{{.ARCH | default ARCH}}" + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + build:linux:prod:arm64: + summary: Creates a production build of the application + cmds: + - task: build:linux + vars: + ARCH: arm64 + PRODUCTION: "true" + + build:linux:prod:amd64: + summary: Creates a production build of the application + cmds: + - task: build:linux + vars: + ARCH: amd64 + PRODUCTION: "true" + + build:linux:debug:arm64: + summary: Creates a debug build of the application + cmds: + - task: build:linux + vars: + ARCH: arm64 + + build:linux:debug:amd64: + summary: Creates a debug build of the application + cmds: + - task: build:linux + vars: + ARCH: amd64 + + ## -------------------------- Package -------------------------- ## + + package: + summary: Packages a production build of the application into a bundle + cmds: + # Package for current OS + - task: package:{{OS}} + + # Package for specific os/arch + # - task: package:darwin:arm64 + # - task: package:darwin:amd64 + # - task: package:windows:arm64 + # - task: package:windows:amd64 + + ## ------> Windows <------ + + package:windows: + summary: Packages a production build of the application into a `.exe` bundle + cmds: + - task: create:nsis:installer + vars: + ARCH: "{{.ARCH}}" + vars: + ARCH: "{{.ARCH | default ARCH}}" + + package:windows:arm64: + summary: Packages a production build of the application into a `.exe` bundle + cmds: + - task: package:windows + vars: + ARCH: arm64 + + package:windows:amd64: + summary: Packages a production build of the application into a `.exe` bundle + cmds: + - task: package:windows + vars: + ARCH: amd64 + + generate:syso: + summary: Generates Windows `.syso` file + dir: build + cmds: + - wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails.syso + vars: + ARCH: "{{.ARCH | default ARCH}}" + + create:nsis:installer: + summary: Creates an NSIS installer + label: "NSIS Installer ({{.ARCH}})" + dir: build/nsis + sources: + - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}.exe" + generates: + - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}-{{.ARCH}}-installer.exe" + deps: + - task: build:windows + vars: + PRODUCTION: "true" + ARCH: "{{.ARCH}}" + cmds: + - makensis -DARG_WAILS_'{{.ARG_FLAG}}'_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi + vars: + ARCH: "{{.ARCH | default ARCH}}" + ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}' + + ## ------> Darwin <------ + + package:darwin: + summary: Packages a production build of the application into a `.app` bundle + platforms: [darwin] + deps: + - task: build:darwin + vars: + PRODUCTION: "true" + cmds: + - task: create:app:bundle + + package:darwin:arm64: + summary: Packages a production build of the application into a `.app` bundle + platforms: [darwin/arm64] + deps: + - task: package:darwin + vars: + ARCH: arm64 + + package:darwin:amd64: + summary: Packages a production build of the application into a `.app` bundle + platforms: [darwin/amd64] + deps: + - task: package:darwin + vars: + ARCH: amd64 + + create:app:bundle: + summary: Creates an `.app` bundle + cmds: + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS + - cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + + ## ------> Linux <------ + + package:linux: + summary: Packages a production build of the application for Linux + platforms: [linux] + deps: + - task: build:linux + vars: + PRODUCTION: "true" + cmds: + - task: create:appimage + + create:appimage: + summary: Creates an AppImage + dir: build/appimage + platforms: [linux] + deps: + - task: build:linux + vars: + PRODUCTION: "true" + - task: generate:linux:dotdesktop + cmds: + # Copy binary + icon to appimage dir + - cp {{.APP_BINARY}} {{.APP_NAME}} + - cp ../appicon.png appicon.png + # Generate AppImage + - wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage + vars: + APP_NAME: "{{.APP_NAME}}" + APP_BINARY: "../../bin/{{.APP_NAME}}" + ICON: "../appicon.png" + DESKTOP_FILE: "{{.APP_NAME}}.desktop" + OUTPUT_DIR: "../../bin" + + generate:linux:dotdesktop: + summary: Generates a `.desktop` file + dir: build + sources: + - "appicon.png" + generates: + - "{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop" + cmds: + - mkdir -p {{.ROOT_DIR}}/build/appimage + # Run `wails3 generate .desktop -help` for all the options + - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}" + # -comment "A comment" + # -terminal "true" + # -version "1.0" + # -genericname "Generic Name" + # -keywords "keyword1;keyword2;" + # -startupnotify "true" + # -mimetype "application/x-extension1;application/x-extension2;" + + vars: + APP_NAME: "{{.APP_NAME}}" + EXEC: "{{.APP_NAME}}" + ICON: "appicon" + CATEGORIES: "Development;" + OUTPUTFILE: "{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop" + + ## -------------------------- Misc -------------------------- ## + + generate:icons: + summary: Generates Windows `.ico` and Mac `.icns` files from an image + dir: build + sources: + - "appicon.png" + generates: + - "icons.icns" + - "icons.ico" + method: timestamp + cmds: + # Generates both .ico and .icns files + # commented out for now + # - wails3 generate icons -input appicon.png + + install:frontend:deps: + summary: Install frontend dependencies + sources: + - package.json + - yarn.lock + generates: + - node_modules/* + preconditions: + - sh: yarn --version + msg: "Looks like yarn isn't installed." + cmds: + - yarn + + build:frontend: + summary: Build the frontend project + sources: + - "**/*" + generates: + - dist/* + deps: + - install:frontend:deps + - generate:bindings + cmds: + - yarn build + + generate:bindings: + summary: Generates bindings for the frontend + sources: + - "**/*.go" + generates: + - "frontend/bindings/**/*" + cmds: + - wails3 generate bindings -silent -ts + # - wails3 generate bindings -silent + + go:mod:tidy: + summary: Runs `go mod tidy` + internal: true + generates: + - go.sum + sources: + - go.mod + cmds: + - go mod tidy + + # ----------------------- dev ----------------------- # + + run: + summary: Runs the application + cmds: + - task: run:{{OS}} + + run:windows: + cmds: + - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe' + + run:linux: + cmds: + - "{{.BIN_DIR}}/{{.APP_NAME}}" + + run:darwin: + cmds: + - "{{.BIN_DIR}}/{{.APP_NAME}}" + + dev:frontend: + summary: Runs the frontend in development mode + deps: + - task: install:frontend:deps + cmds: + - yarn dev --port {{.VITE_PORT}} --strictPort + + dev: + summary: Runs the application in development mode + cmds: + - wails3 dev -config ./build/devmode.config.yaml -port {{.VITE_PORT}} + + dev:reload: + summary: Reloads the application + cmds: + - task: run diff --git a/Taskfile.yml b/Taskfile.yml index e8c28220..1bc1c28c 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -3,386 +3,38 @@ version: "3" vars: APP_NAME: "NextWave" BIN_DIR: "bin" - VITE_PORT: "{{.WAILS_VITE_PORT | default 9245}}" + VERSION: "0.1.0" + tasks: - ## -------------------------- Build -------------------------- ## - - build: - summary: Builds the application + generate: cmds: - # Build for current OS - - task: build:{{OS}} - - # Uncomment to build for specific OSes - # - task: build:linux - # - task: build:windows - # - task: build:darwin - - ## ------> Windows <------- - - build:windows: - summary: Builds the application for Windows - deps: - - task: go:mod:tidy - - task: build:frontend - - task: generate:icons - - task: generate:syso - vars: - ARCH: "{{.ARCH}}" - cmds: - - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe - vars: - BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s -H windowsgui"{{else}}-gcflags=all="-l"{{end}}' - env: - GOOS: windows - CGO_ENABLED: 0 - GOARCH: "{{.ARCH | default ARCH}}" - PRODUCTION: '{{.PRODUCTION | default "false"}}' - - build:windows:prod:arm64: - summary: Creates a production build of the application - cmds: - - task: build:windows - vars: - ARCH: arm64 - PRODUCTION: "true" - - build:windows:prod:amd64: - summary: Creates a production build of the application - cmds: - - task: build:windows - vars: - ARCH: amd64 - PRODUCTION: "true" - - build:windows:debug:arm64: - summary: Creates a debug build of the application - cmds: - - task: build:windows - vars: - ARCH: arm64 - - build:windows:debug:amd64: - summary: Creates a debug build of the application - cmds: - - task: build:windows - vars: - ARCH: amd64 - - ## ------> Darwin <------- - - build:darwin: - summary: Creates a production build of the application - deps: - - task: go:mod:tidy - - task: build:frontend - - task: generate:icons - cmds: - - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}} - vars: - BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}' - env: - GOOS: darwin - CGO_ENABLED: 1 - GOARCH: "{{.ARCH | default ARCH}}" - CGO_CFLAGS: "-mmacosx-version-min=10.15" - CGO_LDFLAGS: "-mmacosx-version-min=10.15" - MACOSX_DEPLOYMENT_TARGET: "10.15" - PRODUCTION: '{{.PRODUCTION | default "false"}}' - - build:darwin:prod:arm64: - summary: Creates a production build of the application - cmds: - - task: build:darwin - vars: - ARCH: arm64 - PRODUCTION: "true" - - build:darwin:prod:amd64: - summary: Creates a production build of the application - cmds: - - task: build:darwin - vars: - ARCH: amd64 - PRODUCTION: "true" - - build:darwin:debug:arm64: - summary: Creates a debug build of the application - cmds: - - task: build:darwin - vars: - ARCH: arm64 - - build:darwin:debug:amd64: - summary: Creates a debug build of the application - cmds: - - task: build:darwin - vars: - ARCH: amd64 - - ## ------> Linux <------- - - build:linux: - summary: Builds the application for Linux - deps: - - task: go:mod:tidy - - task: build:frontend - - task: generate:icons - vars: - ARCH: "{{.ARCH}}" - cmds: - - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/w2 - vars: - BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}' - env: - GOOS: linux - CGO_ENABLED: 1 - GOARCH: "{{.ARCH | default ARCH}}" - PRODUCTION: '{{.PRODUCTION | default "false"}}' - - build:linux:prod:arm64: - summary: Creates a production build of the application - cmds: - - task: build:linux - vars: - ARCH: arm64 - PRODUCTION: "true" - - build:linux:prod:amd64: - summary: Creates a production build of the application - cmds: - - task: build:linux - vars: - ARCH: amd64 - PRODUCTION: "true" - - build:linux:debug:arm64: - summary: Creates a debug build of the application - cmds: - - task: build:linux - vars: - ARCH: arm64 - - build:linux:debug:amd64: - summary: Creates a debug build of the application - cmds: - - task: build:linux - vars: - ARCH: amd64 - - ## -------------------------- Package -------------------------- ## - - package: - summary: Packages a production build of the application into a bundle - cmds: - # Package for current OS - - task: package:{{OS}} - - # Package for specific os/arch - # - task: package:darwin:arm64 - # - task: package:darwin:amd64 - # - task: package:windows:arm64 - # - task: package:windows:amd64 - - ## ------> Windows <------ - - package:windows: - summary: Packages a production build of the application into a `.exe` bundle - cmds: - - task: create:nsis:installer - vars: - ARCH: "{{.ARCH}}" - vars: - ARCH: "{{.ARCH | default ARCH}}" - - package:windows:arm64: - summary: Packages a production build of the application into a `.exe` bundle - cmds: - - task: package:windows - vars: - ARCH: arm64 - - package:windows:amd64: - summary: Packages a production build of the application into a `.exe` bundle - cmds: - - task: package:windows - vars: - ARCH: amd64 - - generate:syso: - summary: Generates Windows `.syso` file - dir: build - cmds: - - wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails.syso - vars: - ARCH: "{{.ARCH | default ARCH}}" - - create:nsis:installer: - summary: Creates an NSIS installer - label: "NSIS Installer ({{.ARCH}})" - dir: build/nsis + - go run cmd/generate/main-generate.go sources: - - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}.exe" - generates: - - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}-{{.ARCH}}-installer.exe" - deps: - - task: build:windows - vars: - PRODUCTION: "true" - ARCH: "{{.ARCH}}" + - "cmd/generate/*.go" + - "pkg/service/**/*.go" + - "pkg/wstore/*.go" + + webpack: cmds: - - makensis -DARG_WAILS_'{{.ARG_FLAG}}'_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi - vars: - ARCH: "{{.ARCH | default ARCH}}" - ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}' + - yarn run webpack --watch --env dev - ## ------> Darwin <------ - - package:darwin: - summary: Packages a production build of the application into a `.app` bundle - platforms: [darwin] - deps: - - task: build:darwin - vars: - PRODUCTION: "true" + electron: cmds: - - task: create:app:bundle - - package:darwin:arm64: - summary: Packages a production build of the application into a `.app` bundle - platforms: [darwin/arm64] + - WAVETERM_DEV=1 yarn run electron dist-dev/emain.js deps: - - task: package:darwin - vars: - ARCH: arm64 + - build:server - package:darwin:amd64: - summary: Packages a production build of the application into a `.app` bundle - platforms: [darwin/amd64] - deps: - - task: package:darwin - vars: - ARCH: amd64 - - create:app:bundle: - summary: Creates an `.app` bundle + build:server: cmds: - - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} - - cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources - - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS - - cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents - - ## ------> Linux <------ - - package:linux: - summary: Packages a production build of the application for Linux - platforms: [linux] - deps: - - task: build:linux - vars: - PRODUCTION: "true" - cmds: - - task: create:appimage - - create:appimage: - summary: Creates an AppImage - dir: build/appimage - platforms: [linux] - deps: - - task: build:linux - vars: - PRODUCTION: "true" - - task: generate:linux:dotdesktop - cmds: - # Copy binary + icon to appimage dir - - cp {{.APP_BINARY}} {{.APP_NAME}} - - cp ../appicon.png appicon.png - # Generate AppImage - - wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage - vars: - APP_NAME: "{{.APP_NAME}}" - APP_BINARY: "../../bin/{{.APP_NAME}}" - ICON: "../appicon.png" - DESKTOP_FILE: "{{.APP_NAME}}.desktop" - OUTPUT_DIR: "../../bin" - - generate:linux:dotdesktop: - summary: Generates a `.desktop` file - dir: build + - go build -o bin/wavesrv cmd/server/main-server.go sources: - - "appicon.png" + - "cmd/server/*.go" + - "pkg/**/*.go" generates: - - "{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop" - cmds: - - mkdir -p {{.ROOT_DIR}}/build/appimage - # Run `wails3 generate .desktop -help` for all the options - - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}" - # -comment "A comment" - # -terminal "true" - # -version "1.0" - # -genericname "Generic Name" - # -keywords "keyword1;keyword2;" - # -startupnotify "true" - # -mimetype "application/x-extension1;application/x-extension2;" - - vars: - APP_NAME: "{{.APP_NAME}}" - EXEC: "{{.APP_NAME}}" - ICON: "appicon" - CATEGORIES: "Development;" - OUTPUTFILE: "{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop" - - ## -------------------------- Misc -------------------------- ## - - generate:icons: - summary: Generates Windows `.ico` and Mac `.icns` files from an image - dir: build - sources: - - "appicon.png" - generates: - - "icons.icns" - - "icons.ico" - method: timestamp - cmds: - # Generates both .ico and .icns files - # commented out for now - # - wails3 generate icons -input appicon.png - - install:frontend:deps: - summary: Install frontend dependencies - sources: - - package.json - - yarn.lock - generates: - - node_modules/* - preconditions: - - sh: yarn --version - msg: "Looks like yarn isn't installed." - cmds: - - yarn - - build:frontend: - summary: Build the frontend project - sources: - - "**/*" - generates: - - dist/* + - bin/wavesrv deps: - - install:frontend:deps - - generate:bindings - cmds: - - yarn build - - generate:bindings: - summary: Generates bindings for the frontend - sources: - - "**/*.go" - generates: - - "frontend/bindings/**/*" - cmds: - - wails3 generate bindings -silent -ts - # - wails3 generate bindings -silent + - go:mod:tidy go:mod:tidy: summary: Runs `go mod tidy` @@ -394,38 +46,4 @@ tasks: cmds: - go mod tidy - # ----------------------- dev ----------------------- # - run: - summary: Runs the application - cmds: - - task: run:{{OS}} - - run:windows: - cmds: - - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe' - - run:linux: - cmds: - - "{{.BIN_DIR}}/{{.APP_NAME}}" - - run:darwin: - cmds: - - "{{.BIN_DIR}}/{{.APP_NAME}}" - - dev:frontend: - summary: Runs the frontend in development mode - deps: - - task: install:frontend:deps - cmds: - - yarn dev --port {{.VITE_PORT}} --strictPort - - dev: - summary: Runs the application in development mode - cmds: - - wails3 dev -config ./build/devmode.config.yaml -port {{.VITE_PORT}} - - dev:reload: - summary: Reloads the application - cmds: - - task: run diff --git a/cmd/generate/main-generate.go b/cmd/generate/main-generate.go index 54b4bd6f..d7548ac8 100644 --- a/cmd/generate/main-generate.go +++ b/cmd/generate/main-generate.go @@ -5,22 +5,87 @@ package main import ( "fmt" + "os" "reflect" + "sort" - "github.com/wavetermdev/thenextwave/pkg/waveobj" - "github.com/wavetermdev/thenextwave/pkg/wstore" + "github.com/wavetermdev/thenextwave/pkg/service" + "github.com/wavetermdev/thenextwave/pkg/tsgen" + "github.com/wavetermdev/thenextwave/pkg/util/utilfn" ) -func main() { - tsTypesMap := make(map[reflect.Type]string) - var waveObj waveobj.WaveObj - waveobj.GenerateTSType(reflect.TypeOf(waveobj.ORef{}), tsTypesMap) - waveobj.GenerateTSType(reflect.TypeOf(&waveObj).Elem(), tsTypesMap) - for _, rtype := range wstore.AllWaveObjTypes() { - waveobj.GenerateTSType(rtype, tsTypesMap) +func generateTypesFile() error { + fd, err := os.Create("frontend/types/gotypes.d.ts") + if err != nil { + return err } - for _, ts := range tsTypesMap { - fmt.Print(ts) - fmt.Print("\n") + defer fd.Close() + fmt.Fprintf(os.Stderr, "generating types file to %s\n", fd.Name()) + tsTypesMap := make(map[reflect.Type]string) + tsgen.GenerateWaveObjTypes(tsTypesMap) + err = tsgen.GenerateServiceTypes(tsTypesMap) + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating service types: %v\n", err) + os.Exit(1) + } + fmt.Fprintf(fd, "// Copyright 2024, Command Line Inc.\n") + fmt.Fprintf(fd, "// SPDX-License-Identifier: Apache-2.0\n\n") + fmt.Fprintf(fd, "// generated by cmd/generate/main-generate.go\n\n") + fmt.Fprintf(fd, "declare global {\n\n") + var keys []reflect.Type + for key := range tsTypesMap { + keys = append(keys, key) + } + sort.Slice(keys, func(i, j int) bool { + iname, _ := tsgen.TypeToTSType(keys[i]) + jname, _ := tsgen.TypeToTSType(keys[j]) + return iname < jname + }) + for _, key := range keys { + tsCode := tsTypesMap[key] + istr := utilfn.IndentString(" ", tsCode) + fmt.Fprint(fd, istr) + } + fmt.Fprintf(fd, "}\n\n") + fmt.Fprintf(fd, "export {}\n") + return nil +} + +func generateServicesFile() error { + fd, err := os.Create("frontend/app/store/services.ts") + if err != nil { + return err + } + defer fd.Close() + fmt.Fprintf(os.Stderr, "generating services file to %s\n", fd.Name()) + fmt.Fprintf(fd, "// Copyright 2024, Command Line Inc.\n") + fmt.Fprintf(fd, "// SPDX-License-Identifier: Apache-2.0\n\n") + fmt.Fprintf(fd, "// generated by cmd/generate/main-generate.go\n\n") + fmt.Fprintf(fd, "import * as WOS from \"./wos\";\n\n") + orderedKeys := utilfn.GetOrderedMapKeys(service.ServiceMap) + for _, serviceName := range orderedKeys { + serviceObj := service.ServiceMap[serviceName] + svcStr := tsgen.GenerateServiceClass(serviceName, serviceObj) + fmt.Fprint(fd, svcStr) + fmt.Fprint(fd, "\n") + } + return nil +} + +func main() { + err := service.ValidateServiceMap() + if err != nil { + fmt.Fprintf(os.Stderr, "Error validating service map: %v\n", err) + os.Exit(1) + } + err = generateTypesFile() + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating types file: %v\n", err) + os.Exit(1) + } + err = generateServicesFile() + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating services file: %v\n", err) + os.Exit(1) } } diff --git a/cmd/server/main-server.go b/cmd/server/main-server.go new file mode 100644 index 00000000..f81d1d1a --- /dev/null +++ b/cmd/server/main-server.go @@ -0,0 +1,95 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "context" + "fmt" + "log" + "os" + "os/signal" + "runtime" + "strconv" + "syscall" + "time" + + "github.com/wavetermdev/thenextwave/pkg/filestore" + "github.com/wavetermdev/thenextwave/pkg/service" + "github.com/wavetermdev/thenextwave/pkg/wavebase" + "github.com/wavetermdev/thenextwave/pkg/web" + "github.com/wavetermdev/thenextwave/pkg/wstore" +) + +const ReadySignalPidVarName = "WAVETERM_READY_SIGNAL_PID" + +func doShutdown(reason string) { + log.Printf("shutting down: %s\n", reason) + ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) + defer cancelFn() + // TODO deal with flush in progress + filestore.WFS.FlushCache(ctx) + time.Sleep(200 * time.Millisecond) + os.Exit(0) +} + +func installShutdownSignalHandlers() { + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGINT) + go func() { + for sig := range sigCh { + doShutdown(fmt.Sprintf("got signal %v", sig)) + break + } + }() +} + +func main() { + err := service.ValidateServiceMap() + if err != nil { + log.Printf("error validating service map: %v\n", err) + return + } + err = wavebase.EnsureWaveHomeDir() + if err != nil { + log.Printf("error ensuring wave home dir: %v\n", err) + return + } + waveLock, err := wavebase.AcquireWaveLock() + if err != nil { + log.Printf("error acquiring wave lock (another instance of Wave is likely running): %v\n", err) + return + } + + log.Printf("wave home dir: %s\n", wavebase.GetWaveHomeDir()) + err = filestore.InitFilestore() + if err != nil { + log.Printf("error initializing filestore: %v\n", err) + return + } + err = wstore.InitWStore() + if err != nil { + log.Printf("error initializing wstore: %v\n", err) + return + } + err = wstore.EnsureInitialData() + if err != nil { + log.Printf("error ensuring initial data: %v\n", err) + return + } + installShutdownSignalHandlers() + + go web.RunWebSocketServer() + go func() { + time.Sleep(30 * time.Millisecond) + pidStr := os.Getenv(ReadySignalPidVarName) + if pidStr != "" { + pid, err := strconv.Atoi(pidStr) + if err == nil { + syscall.Kill(pid, syscall.SIGUSR1) + } + } + }() + web.RunWebServer() // blocking + runtime.KeepAlive(waveLock) +} diff --git a/emain/emain.ts b/emain/emain.ts new file mode 100644 index 00000000..e552efa1 --- /dev/null +++ b/emain/emain.ts @@ -0,0 +1,243 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import * as electron from "electron"; +import * as child_process from "node:child_process"; +import * as path from "path"; +import { debounce } from "throttle-debounce"; +import * as services from "../frontend/app/store/services"; + +const electronApp = electron.app; +const isDev = true; + +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"; +const DistDir = "dist-dev"; + +let waveSrvReadyResolve = (value: boolean) => {}; +let waveSrvReady: Promise = new Promise((resolve, _) => { + waveSrvReadyResolve = resolve; +}); +let waveSrvProc: child_process.ChildProcessWithoutNullStreams | null = null; +electronApp.setName(isDev ? "NextWave (Dev)" : "NextWave"); +const unamePlatform = process.platform; +let unameArch: string = process.arch; +if (unameArch == "x64") { + unameArch = "amd64"; +} + +function getBaseHostPort(): string { + if (isDev) { + return DevServerEndpoint; + } + return ProdServerEndpoint; +} + +// must match golang +function getWaveHomeDir() { + return path.join(process.env.HOME, ".w2"); +} + +function getElectronAppBasePath(): string { + return path.dirname(__dirname); +} + +function getGoAppBasePath(): string { + const appDir = getElectronAppBasePath(); + if (appDir.endsWith(".asar")) { + return `${appDir}.unpacked`; + } else { + return appDir; + } +} + +function getWaveSrvPath(): string { + return path.join(getGoAppBasePath(), "bin", "wavesrv"); +} + +function getWaveSrvCmd(): string { + const waveSrvPath = getWaveSrvPath(); + const waveHome = getWaveHomeDir(); + const logFile = path.join(waveHome, "wavesrv.log"); + return `"${waveSrvPath}" >> "${logFile}" 2>&1`; +} + +function getWaveSrvCwd(): string { + return getWaveHomeDir(); +} + +function runWaveSrv(): Promise { + let pResolve: (value: boolean) => void; + let pReject: (reason?: any) => void; + const rtnPromise = new Promise((argResolve, argReject) => { + pResolve = argResolve; + pReject = argReject; + }); + const envCopy = { ...process.env }; + envCopy[WaveAppPathVarName] = getGoAppBasePath(); + if (isDev) { + envCopy[WaveDevVarName] = "1"; + } + envCopy[WaveSrvReadySignalPidVarName] = process.pid.toString(); + const waveSrvCmd = getWaveSrvCmd(); + console.log("trying to run local server", waveSrvCmd); + const proc = child_process.execFile("bash", ["-c", waveSrvCmd], { + cwd: getWaveSrvCwd(), + env: envCopy, + }); + proc.on("exit", (e) => { + console.log("wavesrv exited, shutting down"); + electronApp.quit(); + }); + proc.on("spawn", (e) => { + console.log("spawnned wavesrv"); + waveSrvProc = proc; + pResolve(true); + }); + proc.on("error", (e) => { + console.log("error running wavesrv", e); + pReject(e); + }); + proc.stdout.on("data", (_) => { + return; + }); + proc.stderr.on("data", (_) => { + return; + }); + return rtnPromise; +} + +function mainResizeHandler(_: any, win: Electron.BrowserWindow) { + if (win == null || win.isDestroyed() || win.fullScreen) { + return; + } + const bounds = win.getBounds(); + const winSize = { width: bounds.width, height: bounds.height, top: bounds.y, left: bounds.x }; + const url = new URL(getBaseHostPort() + "/api/set-winsize"); + // TODO +} + +function shNavHandler(event: Electron.Event, url: string) { + event.preventDefault(); + if (url.startsWith("https://") || url.startsWith("http://") || url.startsWith("file://")) { + console.log("open external, shNav", url); + electron.shell.openExternal(url); + } else { + console.log("navigation canceled", url); + } +} + +function shFrameNavHandler(event: Electron.Event) { + if (!event.frame?.parent) { + // only use this handler to process iframe events (non-iframe events go to shNavHandler) + return; + } + const url = event.url; + console.log(`frame-navigation url=${url} frame=${event.frame.name}`); + if (event.frame.name == "webview") { + // "webview" links always open in new window + // this will *not* effect the initial load because srcdoc does not count as an electron navigation + console.log("open external, frameNav", url); + event.preventDefault(); + electron.shell.openExternal(url); + return; + } + if (event.frame.name == "pdfview" && url.startsWith("blob:file:///")) { + // allowed + return; + } + event.preventDefault(); + console.log("frame navigation canceled"); +} + +function createWindow(client: Client, waveWindow: WaveWindow): Electron.BrowserWindow { + const win = new electron.BrowserWindow({ + x: 200, + y: 200, + titleBarStyle: "hiddenInset", + width: waveWindow.winsize.width, + height: waveWindow.winsize.height, + minWidth: 500, + minHeight: 300, + icon: + unamePlatform == "linux" + ? path.join(getElectronAppBasePath(), "public/logos/wave-logo-dark.png") + : undefined, + webPreferences: { + preload: path.join(getElectronAppBasePath(), DistDir, "preload.js"), + }, + show: false, + autoHideMenuBar: true, + backgroundColor: "#000000", + }); + win.once("ready-to-show", () => { + win.show(); + }); + // const indexHtml = isDev ? "index-dev.html" : "index.html"; + let usp = new URLSearchParams(); + usp.set("clientid", client.oid); + usp.set("windowid", waveWindow.oid); + const indexHtml = "index.html"; + win.loadFile(path.join(getElectronAppBasePath(), "public", indexHtml), { search: usp.toString() }); + win.webContents.on("will-navigate", shNavHandler); + win.webContents.on("will-frame-navigate", shFrameNavHandler); + win.on( + "resize", + debounce(400, (e) => mainResizeHandler(e, win)) + ); + win.on( + "move", + debounce(400, (e) => mainResizeHandler(e, win)) + ); + win.webContents.on("zoom-changed", (e) => { + win.webContents.send("zoom-changed"); + }); + win.webContents.setWindowOpenHandler(({ url, frameName }) => { + if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) { + console.log("openExternal fallback", url); + electron.shell.openExternal(url); + } + console.log("window-open denied", url); + return { action: "deny" }; + }); + return win; +} + +process.on("SIGUSR1", function () { + waveSrvReadyResolve(true); +}); + +(async () => { + const startTs = Date.now(); + const instanceLock = electronApp.requestSingleInstanceLock(); + if (!instanceLock) { + console.log("waveterm-app could not get single-instance-lock, shutting down"); + electronApp.quit(); + return; + } + try { + await runWaveSrv(); + } catch (e) { + console.log(e.toString()); + } + console.log("waiting for wavesrv ready signal (SIGUSR1)"); + const ready = await waveSrvReady; + console.log("wavesrv ready signal received", ready, Date.now() - startTs, "ms"); + + let clientData = await services.ClientService.GetClientData(); + let windowData: WaveWindow = (await services.ObjectService.GetObject( + "window:" + clientData.mainwindowid + )) as WaveWindow; + await electronApp.whenReady(); + await createWindow(clientData, windowData); + + electronApp.on("activate", () => { + if (electron.BrowserWindow.getAllWindows().length === 0) { + createWindow(clientData, windowData); + } + }); +})(); diff --git a/emain/preload.js b/emain/preload.js new file mode 100644 index 00000000..cc4640eb --- /dev/null +++ b/emain/preload.js @@ -0,0 +1,6 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +let { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("api", {}); diff --git a/eslint.config.js b/eslint.config.js index 47a8f6a5..6aa98214 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -4,4 +4,18 @@ import eslint from "@eslint/js"; import eslintConfigPrettier from "eslint-config-prettier"; import tseslint from "typescript-eslint"; -export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommended, eslintConfigPrettier); +const baseConfig = tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommended, eslintConfigPrettier); + +const customConfig = { + ...baseConfig, + overrides: [ + { + files: ["emain/emain.ts", "vite.config.ts", "electron.vite.config.ts"], + env: { + node: true, + }, + }, + ], +}; + +export default customConfig; diff --git a/frontend/app/app.less b/frontend/app/app.less new file mode 100644 index 00000000..fbf28ce5 --- /dev/null +++ b/frontend/app/app.less @@ -0,0 +1,62 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +@import "./reset.less"; +@import "./theme.less"; + +body { + display: flex; + flex-direction: row; + width: 100vw; + height: 100vh; + background-color: var(--main-bg-color); + color: var(--main-text-color); + font: var(--base-font); + overflow: hidden; +} + +*::-webkit-scrollbar { + width: 4px; + height: 4px; +} + +*::-webkit-scrollbar-track { + background-color: var(--scrollbar-background-color) !important; +} + +*::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb-color) !important; + border-radius: 4px; + margin: 0 1px 0 1px; +} + +*::-webkit-scrollbar-thumb:hover { + background-color: var(--scrollbar-thumb-hover-color) !important; +} + +.flex-spacer { + flex-grow: 1; +} + +.text-fixed { + font: var(--fixed-font); +} + +#main, +.mainapp { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.titlebar { + height: 35px; + border-bottom: 1px solid var(--border-color); + flex-shrink: 0; + -webkit-app-region: drag; +} + +.error-boundary { + color: var(--error-color); +} diff --git a/frontend/app/app.tsx b/frontend/app/app.tsx index 290bab85..e1a86261 100644 --- a/frontend/app/app.tsx +++ b/frontend/app/app.tsx @@ -8,7 +8,7 @@ import { Provider } from "jotai"; import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; -import "../../public/style.less"; +import "./app.less"; import { CenteredDiv } from "./element/quickelems"; const App = () => { diff --git a/frontend/app/element/quickelems.tsx b/frontend/app/element/quickelems.tsx index 2777acfe..c4bf8b92 100644 --- a/frontend/app/element/quickelems.tsx +++ b/frontend/app/element/quickelems.tsx @@ -1,6 +1,7 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 +import React from "react"; import "./quickelems.less"; function CenteredLoadingDiv() { diff --git a/public/reset.less b/frontend/app/reset.less similarity index 100% rename from public/reset.less rename to frontend/app/reset.less diff --git a/frontend/app/store/global.ts b/frontend/app/store/global.ts index 52fda46c..026151a1 100644 --- a/frontend/app/store/global.ts +++ b/frontend/app/store/global.ts @@ -1,15 +1,22 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { Events } from "@wailsio/runtime"; import * as jotai from "jotai"; import * as rxjs from "rxjs"; import * as WOS from "./wos"; +import { WSControl } from "./ws"; +// TODO remove the window dependency completely +// we should have the initialization be more orderly -- proceed directly from wave.ts instead of on its own. const globalStore = jotai.createStore(); -const urlParams = new URLSearchParams(window.location.search); -const globalWindowId = urlParams.get("windowid"); -const globalClientId = urlParams.get("clientid"); +let globalWindowId: string = null; +let globalClientId: string = null; +if (typeof window !== "undefined") { + // this if statement allows us to use the code in nodejs as well + const urlParams = new URLSearchParams(window.location.search); + globalWindowId = urlParams.get("windowid") || "74eba2d0-22fc-4221-82ad-d028dd496342"; + globalClientId = urlParams.get("clientid") || "f4bc1713-a364-41b3-a5c4-b000ba10d622"; +} const windowIdAtom = jotai.atom(null) as jotai.PrimitiveAtom; const clientIdAtom = jotai.atom(null) as jotai.PrimitiveAtom; globalStore.set(windowIdAtom, globalWindowId); @@ -18,7 +25,7 @@ const uiContextAtom = jotai.atom((get) => { const windowData = get(windowDataAtom); const uiContext: UIContext = { windowid: get(atoms.windowId), - activetabid: windowData.activetabid, + activetabid: windowData?.activetabid, }; return uiContext; }) as jotai.Atom; @@ -34,7 +41,8 @@ const windowDataAtom: jotai.Atom = jotai.atom((get) => { if (windowId == null) { return null; } - return WOS.getObjectValue(WOS.makeORef("window", windowId), get); + const rtn = WOS.getObjectValue(WOS.makeORef("window", windowId), get); + return rtn; }); const workspaceAtom: jotai.Atom = jotai.atom((get) => { const windowData = get(windowDataAtom); @@ -56,10 +64,10 @@ const atoms = { type SubjectWithRef = rxjs.Subject & { refCount: number; release: () => void }; -const blockSubjects = new Map>(); +const orefSubjects = new Map>(); -function getBlockSubject(blockId: string): SubjectWithRef { - let subject = blockSubjects.get(blockId); +function getORefSubject(oref: string): SubjectWithRef { + let subject = orefSubjects.get(oref); if (subject == null) { subject = new rxjs.Subject() as any; subject.refCount = 0; @@ -67,29 +75,15 @@ function getBlockSubject(blockId: string): SubjectWithRef { subject.refCount--; if (subject.refCount === 0) { subject.complete(); - blockSubjects.delete(blockId); + orefSubjects.delete(oref); } }; - blockSubjects.set(blockId, subject); + orefSubjects.set(oref, subject); } subject.refCount++; return subject; } -Events.On("block:ptydata", (event: any) => { - const data = event?.data; - if (data?.blockid == null) { - console.log("block:ptydata with null blockid"); - return; - } - // we don't use getBlockSubject here because we don't want to create a new subject - const subject = blockSubjects.get(data.blockid); - if (subject == null) { - return; - } - subject.next(data); -}); - const blockCache = new Map>(); function useBlockCache(blockId: string, name: string, makeFn: () => T): T { @@ -123,4 +117,44 @@ function useBlockAtom(blockId: string, name: string, makeFn: () => jotai.Atom return atom as jotai.Atom; } -export { WOS, atoms, getBlockSubject, globalStore, useBlockAtom, useBlockCache }; +function getBackendHostPort(): string { + // TODO deal with dev/production + return "http://localhost:8190"; +} + +function getBackendWSHostPort(): string { + return "ws://localhost:8191"; +} + +let globalWS: WSControl = null; + +function handleWSEventMessage(msg: WSEventType) { + if (msg.oref == null) { + console.log("unsupported event", msg); + return; + } + // we don't use getORefSubject here because we don't want to create a new subject + const subject = orefSubjects.get(msg.oref); + if (subject == null) { + return; + } + subject.next(msg.data); +} + +function handleWSMessage(msg: any) { + if (msg == null) { + return; + } + if (msg.eventtype != null) { + handleWSEventMessage(msg); + } +} + +function initWS() { + globalWS = new WSControl(getBackendWSHostPort(), globalStore, globalWindowId, "", (msg) => { + handleWSMessage(msg); + }); + globalWS.connectNow("initWS"); +} + +export { WOS, atoms, getBackendHostPort, getORefSubject, globalStore, globalWS, initWS, useBlockAtom, useBlockCache }; diff --git a/frontend/app/store/services.ts b/frontend/app/store/services.ts new file mode 100644 index 00000000..d3a14152 --- /dev/null +++ b/frontend/app/store/services.ts @@ -0,0 +1,100 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +// generated by cmd/generate/main-generate.go + +import * as WOS from "./wos"; + +// blockservice.BlockService (block) +class BlockServiceType { + // send command to block + SendCommand(blockid: string, command: MetaType): Promise { + return WOS.callBackendService("block", "SendCommand", Array.from(arguments)) + } +} + +export const BlockService = new BlockServiceType() + +// clientservice.ClientService (client) +class ClientServiceType { + GetClientData(): Promise { + return WOS.callBackendService("client", "GetClientData", Array.from(arguments)) + } + GetTab(arg1: string): Promise { + return WOS.callBackendService("client", "GetTab", Array.from(arguments)) + } + GetWindow(arg1: string): Promise { + return WOS.callBackendService("client", "GetWindow", Array.from(arguments)) + } + GetWorkspace(arg1: string): Promise { + return WOS.callBackendService("client", "GetWorkspace", Array.from(arguments)) + } +} + +export const ClientService = new ClientServiceType() + +// fileservice.FileService (file) +class FileServiceType { + GetWaveFile(arg1: string, arg2: string): Promise { + return WOS.callBackendService("file", "GetWaveFile", Array.from(arguments)) + } + ReadFile(arg1: string): Promise { + return WOS.callBackendService("file", "ReadFile", Array.from(arguments)) + } + StatFile(arg1: string): Promise { + return WOS.callBackendService("file", "StatFile", Array.from(arguments)) + } +} + +export const FileService = new FileServiceType() + +// objectservice.ObjectService (object) +class ObjectServiceType { + // @returns tabId (and object updates) + AddTabToWorkspace(tabName: string, activateTab: boolean): Promise { + return WOS.callBackendService("object", "AddTabToWorkspace", Array.from(arguments)) + } + + // @returns object updates + CloseTab(tabId: string): Promise { + return WOS.callBackendService("object", "CloseTab", Array.from(arguments)) + } + + // @returns blockId (and object updates) + CreateBlock(blockDef: BlockDef, rtOpts: RuntimeOpts): Promise { + return WOS.callBackendService("object", "CreateBlock", Array.from(arguments)) + } + + // @returns object updates + DeleteBlock(blockId: string): Promise { + return WOS.callBackendService("object", "DeleteBlock", Array.from(arguments)) + } + + // get wave object by oref + GetObject(oref: string): Promise { + return WOS.callBackendService("object", "GetObject", Array.from(arguments)) + } + + // @returns objects + GetObjects(orefs: string[]): Promise { + return WOS.callBackendService("object", "GetObjects", Array.from(arguments)) + } + + // @returns object updates + SetActiveTab(tabId: string): Promise { + return WOS.callBackendService("object", "SetActiveTab", Array.from(arguments)) + } + + // @returns object updates + UpdateObject(waveObj: WaveObj, returnUpdates: boolean): Promise { + return WOS.callBackendService("object", "UpdateObject", Array.from(arguments)) + } + + // @returns object updates + UpdateObjectMeta(oref: string, meta: MetaType): Promise { + return WOS.callBackendService("object", "UpdateObjectMeta", Array.from(arguments)) + } +} + +export const ObjectService = new ObjectServiceType() + diff --git a/frontend/app/store/wos.ts b/frontend/app/store/wos.ts index d4952979..2f22a6ba 100644 --- a/frontend/app/store/wos.ts +++ b/frontend/app/store/wos.ts @@ -3,10 +3,13 @@ // WaveObjectStore -import { Call as $Call, Events } from "@wailsio/runtime"; +// import { Call as $Call, Events } from "@wailsio/runtime"; import * as jotai from "jotai"; import * as React from "react"; -import { atoms, globalStore } from "./global"; +import { atoms, getBackendHostPort, globalStore } from "./global"; +import * as services from "./services"; + +const IsElectron = true; type WaveObjectDataItemType = { value: T; @@ -54,7 +57,51 @@ function makeORef(otype: string, oid: string): string { } function GetObject(oref: string): Promise { - return $Call.ByName("github.com/wavetermdev/thenextwave/pkg/service/objectservice.ObjectService.GetObject", oref); + return callBackendService("object", "GetObject", [oref], true); +} + +function callBackendService(service: string, method: string, args: any[], noUIContext?: boolean): Promise { + const startTs = Date.now(); + let uiContext: UIContext = null; + if (!noUIContext) { + uiContext = globalStore.get(atoms.uiContext); + } + let 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(); + usp.set("service", service); + usp.set("method", method); + let fetchPromise = fetch(getBackendHostPort() + "/wave/service?" + usp.toString(), { + method: "POST", + body: JSON.stringify(waveCall), + }); + let prtn = fetchPromise + .then((resp) => { + if (!resp.ok) { + throw new Error(`call ${methodName} failed: ${resp.status} ${resp.statusText}`); + } + return resp.json(); + }) + .then((respData: WebReturnType) => { + if (respData == null) { + return null; + } + if (respData.updates != null) { + updateWaveObjects(respData.updates); + } + if (respData.error != null) { + throw new Error(`call ${methodName} error: ${respData.error}`); + } + console.log("Call", methodName, Date.now() - startTs + "ms"); + return respData.data; + }); + return prtn; } const waveObjectValueCache = new Map>(); @@ -75,6 +122,7 @@ function createWaveValueObject(oref: string, shouldFetch: boo const localPromise = GetObject(oref); wov.pendingPromise = localPromise; localPromise.then((val) => { + console.log("GetObject resolved", oref, val); if (wov.pendingPromise != localPromise) { return; } @@ -187,7 +235,7 @@ function useWaveObject(oref: string): [T, boolean, (val: T) = const [atomVal, setAtomVal] = jotai.useAtom(wov.dataAtom); const simpleSet = (val: T) => { setAtomVal({ value: val, loading: false }); - UpdateObject(val, false); + services.ObjectService.UpdateObject(val, false); }; return [atomVal.value, atomVal.loading, simpleSet]; } @@ -236,48 +284,32 @@ function cleanWaveObjectCache() { } } -Events.On("waveobj:update", (event: any) => { - const data: WaveObjUpdate[] = event?.data; - if (data == null) { - return; - } - if (!Array.isArray(data)) { - console.log("invalid waveobj:update, not an array", data); - return; - } - if (data.length == 0) { - return; - } - updateWaveObjects(data); -}); - -function wrapObjectServiceCall(fnName: string, ...args: any[]): Promise { - const uiContext = globalStore.get(atoms.uiContext); - const startTs = Date.now(); - let prtn = $Call.ByName( - "github.com/wavetermdev/thenextwave/pkg/service/objectservice.ObjectService." + fnName, - uiContext, - ...args - ); - prtn = prtn.then((val) => { - console.log("Call", fnName, Date.now() - startTs + "ms"); - if (val.updates) { - updateWaveObjects(val.updates); - } - return val; - }); - return prtn; -} +// Events.On("waveobj:update", (event: any) => { +// const data: WaveObjUpdate[] = event?.data; +// if (data == null) { +// return; +// } +// if (!Array.isArray(data)) { +// console.log("invalid waveobj:update, not an array", data); +// return; +// } +// if (data.length == 0) { +// return; +// } +// updateWaveObjects(data); +// }); // gets the value of a WaveObject from the cache. // should provide getFn if it is available (e.g. inside of a jotai atom) // otherwise it will use the globalStore.get function function getObjectValue(oref: string, getFn?: jotai.Getter): T { - const wov = waveObjectValueCache.get(oref); - if (wov === undefined) { - return null; + let wov = waveObjectValueCache.get(oref); + if (wov == null) { + console.log("wov is null, creating new wov", oref); + wov = createWaveValueObject(oref, true); + waveObjectValueCache.set(oref, wov); } - if (getFn === undefined) { + if (getFn == null) { getFn = globalStore.get; } const atomVal = getFn(wov.dataAtom); @@ -298,38 +330,12 @@ function setObjectValue(value: T, setFn?: jotai.Setter, pushT } setFn(wov.dataAtom, { value: value, loading: false }); if (pushToServer) { - UpdateObject(value, false); + services.ObjectService.UpdateObject(value, false); } } -export function AddTabToWorkspace(tabName: string, activateTab: boolean): Promise<{ tabId: string }> { - return wrapObjectServiceCall("AddTabToWorkspace", tabName, activateTab); -} - -export function SetActiveTab(tabId: string): Promise { - return wrapObjectServiceCall("SetActiveTab", tabId); -} - -export function CreateBlock(blockDef: BlockDef, rtOpts: RuntimeOpts): Promise<{ blockId: string }> { - return wrapObjectServiceCall("CreateBlock", blockDef, rtOpts); -} - -export function DeleteBlock(blockId: string): Promise { - return wrapObjectServiceCall("DeleteBlock", blockId); -} - -export function CloseTab(tabId: string): Promise { - return wrapObjectServiceCall("CloseTab", tabId); -} - -export function UpdateObjectMeta(blockId: string, meta: MetadataType): Promise { - return wrapObjectServiceCall("UpdateObjectMeta", blockId, meta); -} - -export function UpdateObject(waveObj: WaveObj, returnUpdates: boolean): Promise { - return wrapObjectServiceCall("UpdateObject", waveObj, returnUpdates); -} export { + callBackendService, cleanWaveObjectCache, clearWaveObjectCache, getObjectValue, diff --git a/frontend/app/store/ws.ts b/frontend/app/store/ws.ts new file mode 100644 index 00000000..23c371a9 --- /dev/null +++ b/frontend/app/store/ws.ts @@ -0,0 +1,254 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import * as jotai from "jotai"; +import { sprintf } from "sprintf-js"; +import { v4 as uuidv4 } from "uuid"; + +const MaxWebSocketSendSize = 1024 * 1024; // 1MB + +type RpcEntry = { + reqId: string; + startTs: number; + method: string; + resolve: (any) => void; + reject: (any) => void; + promise: Promise; +}; + +type JotaiStore = { + get: (atom: jotai.Atom) => Value; + set: (atom: jotai.WritableAtom, value: Value) => void; +}; + +class WSControl { + wsConn: any; + open: jotai.WritableAtom; + opening: boolean = false; + reconnectTimes: number = 0; + msgQueue: any[] = []; + windowId: string; + messageCallback: (any) => void = null; + watchSessionId: string = null; + watchScreenId: string = null; + wsLog: string[] = []; + authKey: string; + baseHostPort: string; + lastReconnectTime: number = 0; + rpcMap: Map = new Map(); // reqId -> RpcEntry + jotaiStore: JotaiStore; + + constructor( + baseHostPort: string, + jotaiStore: JotaiStore, + windowId: string, + authKey: string, + messageCallback: (any) => void + ) { + this.baseHostPort = baseHostPort; + this.messageCallback = messageCallback; + this.windowId = windowId; + this.authKey = authKey; + this.open = jotai.atom(false); + this.jotaiStore = jotaiStore; + setInterval(this.sendPing.bind(this), 5000); + } + + log(str: string) { + let ts = Date.now(); + this.wsLog.push("[" + ts + "] " + str); + if (this.wsLog.length > 50) { + this.wsLog.splice(0, this.wsLog.length - 50); + } + } + + setOpen(val: boolean) { + this.jotaiStore.set(this.open, val); + } + + isOpen() { + return this.jotaiStore.get(this.open); + } + + connectNow(desc: string) { + if (this.isOpen()) { + return; + } + this.lastReconnectTime = Date.now(); + this.log(sprintf("try reconnect (%s)", desc)); + this.opening = true; + this.wsConn = new WebSocket(this.baseHostPort + "/ws?windowid=" + this.windowId); + this.wsConn.onopen = this.onopen.bind(this); + this.wsConn.onmessage = this.onmessage.bind(this); + this.wsConn.onclose = this.onclose.bind(this); + // turns out onerror is not necessary (onclose always follows onerror) + // this.wsConn.onerror = this.onerror; + } + + reconnect(forceClose?: boolean) { + if (this.isOpen()) { + if (forceClose) { + this.wsConn.close(); // this will force a reconnect + } + return; + } + this.reconnectTimes++; + if (this.reconnectTimes > 20) { + this.log("cannot connect, giving up"); + return; + } + let timeoutArr = [0, 0, 2, 5, 10, 10, 30, 60]; + let timeout = 60; + if (this.reconnectTimes < timeoutArr.length) { + timeout = timeoutArr[this.reconnectTimes]; + } + if (Date.now() - this.lastReconnectTime < 500) { + timeout = 1; + } + if (timeout > 0) { + this.log(sprintf("sleeping %ds", timeout)); + } + setTimeout(() => { + this.connectNow(String(this.reconnectTimes)); + }, timeout * 1000); + } + + onclose(event: any) { + // console.log("close", event); + if (event.wasClean) { + this.log("connection closed"); + } else { + this.log("connection error/disconnected"); + } + if (this.isOpen() || this.opening) { + this.setOpen(false); + this.opening = false; + this.reconnect(); + } + } + + onopen() { + this.log("connection open"); + this.setOpen(true); + this.opening = false; + this.runMsgQueue(); + // reconnectTimes is reset in onmessage:hello + } + + runMsgQueue() { + if (!this.isOpen()) { + return; + } + if (this.msgQueue.length == 0) { + return; + } + let msg = this.msgQueue.shift(); + this.sendMessage(msg); + setTimeout(() => { + this.runMsgQueue(); + }, 100); + } + + onmessage(event: any) { + let eventData = null; + if (event.data != null) { + eventData = JSON.parse(event.data); + } + if (eventData == null) { + return; + } + if (eventData.type == "ping") { + this.wsConn.send(JSON.stringify({ type: "pong", stime: Date.now() })); + return; + } + if (eventData.type == "pong") { + // nothing + return; + } + if (eventData.type == "hello") { + this.reconnectTimes = 0; + return; + } + if (eventData.type == "rpcresp") { + this.handleRpcResp(eventData); + return; + } + if (this.messageCallback) { + try { + this.messageCallback(eventData); + } catch (e) { + console.log("[error] messageCallback", e); + } + } + } + + sendPing() { + if (!this.isOpen()) { + return; + } + this.wsConn.send(JSON.stringify({ type: "ping", stime: Date.now() })); + } + + handleRpcResp(data: any) { + let reqId = data.reqid; + let rpcEntry = this.rpcMap.get(reqId); + if (rpcEntry == null) { + console.log("rpcresp for unknown reqid", reqId); + return; + } + this.rpcMap.delete(reqId); + console.log("rpcresp", rpcEntry.method, Math.round(performance.now() - rpcEntry.startTs) + "ms"); + if (data.error != null) { + rpcEntry.reject(data.error); + } else { + rpcEntry.resolve(data.data); + } + } + + doRpc(method: string, params: any[]): Promise { + if (!this.isOpen()) { + return Promise.reject("not connected"); + } + let reqId = uuidv4(); + let req = { type: "rpc", method: method, params: params, reqid: reqId }; + let rpcEntry: RpcEntry = { + method: method, + startTs: performance.now(), + reqId: reqId, + resolve: null, + reject: null, + promise: null, + }; + let rpcPromise = new Promise((resolve, reject) => { + rpcEntry.resolve = resolve; + rpcEntry.reject = reject; + }); + rpcEntry.promise = rpcPromise; + this.rpcMap.set(reqId, rpcEntry); + this.wsConn.send(JSON.stringify(req)); + return rpcPromise; + } + + sendMessage(data: any) { + if (!this.isOpen()) { + return; + } + let msg = JSON.stringify(data); + const byteSize = new Blob([msg]).size; + if (byteSize > MaxWebSocketSendSize) { + console.log("ws message too large", byteSize, data.type, msg.substring(0, 100)); + return; + } + this.wsConn.send(msg); + } + + pushMessage(data: any) { + if (!this.isOpen()) { + this.msgQueue.push(data); + return; + } + this.sendMessage(data); + } +} + +export { WSControl }; diff --git a/frontend/app/tab/tab.tsx b/frontend/app/tab/tab.tsx index 2b5fb921..bc09c70d 100644 --- a/frontend/app/tab/tab.tsx +++ b/frontend/app/tab/tab.tsx @@ -2,13 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 import { Block, BlockHeader } from "@/app/block/block"; +import * as services from "@/store/services"; import * as WOS from "@/store/wos"; +import { CenteredDiv, CenteredLoadingDiv } from "@/element/quickelems"; import { TileLayout } from "@/faraday/index"; import { getLayoutStateAtomForTab } from "@/faraday/lib/layoutAtom"; import { useAtomValue } from "jotai"; import { useCallback, useMemo } from "react"; -import { CenteredDiv, CenteredLoadingDiv } from "../element/quickelems"; import "./tab.less"; const TabContent = ({ tabId }: { tabId: string }) => { @@ -34,7 +35,7 @@ const TabContent = ({ tabId }: { tabId: string }) => { const onNodeDelete = useCallback((data: TabLayoutData) => { console.log("onNodeDelete", data); - return WOS.DeleteBlock(data.blockId); + return services.ObjectService.DeleteBlock(data.blockId); }, []); if (tabLoading) { diff --git a/public/term.less b/frontend/app/term.less similarity index 100% rename from public/term.less rename to frontend/app/term.less diff --git a/public/theme.less b/frontend/app/theme.less similarity index 100% rename from public/theme.less rename to frontend/app/theme.less diff --git a/frontend/app/view/codeedit.tsx b/frontend/app/view/codeedit.tsx index ad0f9c9d..de1b160c 100644 --- a/frontend/app/view/codeedit.tsx +++ b/frontend/app/view/codeedit.tsx @@ -15,7 +15,7 @@ declare var monaco: Monaco; let monacoLoadedAtom = jotai.atom(false); function loadMonaco() { - loader.config({ paths: { vs: "./monaco" } }); + loader.config({ paths: { vs: "./dist-dev/monaco" } }); loader .init() .then(() => { diff --git a/frontend/app/view/directorypreview.tsx b/frontend/app/view/directorypreview.tsx index 664475bd..ea2cdb69 100644 --- a/frontend/app/view/directorypreview.tsx +++ b/frontend/app/view/directorypreview.tsx @@ -1,7 +1,6 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { FileInfo } from "@/bindings/fileservice"; import { Table, createColumnHelper, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import clsx from "clsx"; import * as jotai from "jotai"; diff --git a/frontend/app/view/preview.tsx b/frontend/app/view/preview.tsx index 4198676f..7dd01cf4 100644 --- a/frontend/app/view/preview.tsx +++ b/frontend/app/view/preview.tsx @@ -1,9 +1,9 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { FileInfo, FileService, FullFile } from "@/bindings/fileservice"; import { Markdown } from "@/element/markdown"; -import { useBlockAtom, useBlockCache } from "@/store/global"; +import { getBackendHostPort, useBlockAtom, useBlockCache } from "@/store/global"; +import * as services from "@/store/services"; import * as WOS from "@/store/wos"; import * as util from "@/util/util"; import clsx from "clsx"; @@ -69,7 +69,7 @@ function MarkdownPreview({ contentAtom }: { contentAtom: jotai.Atom @@ -114,7 +114,7 @@ function PreviewView({ blockId }: { blockId: string }) { }, (get, set, update) => { const blockId = get(blockAtom)?.oid; - WOS.UpdateObjectMeta(`block:${blockId}`, { file: update }); + services.ObjectService.UpdateObjectMeta(`block:${blockId}`, { file: update }); } ) ); @@ -124,7 +124,8 @@ function PreviewView({ blockId }: { blockId: string }) { if (fileName == null) { return null; } - const statFile = await FileService.StatFile(fileName); + // const statFile = await FileService.StatFile(fileName); + const statFile = await services.FileService.StatFile(fileName); return statFile; }) ); @@ -134,7 +135,8 @@ function PreviewView({ blockId }: { blockId: string }) { if (fileName == null) { return null; } - const file = await FileService.ReadFile(fileName); + // const file = await FileService.ReadFile(fileName); + const file = await services.FileService.ReadFile(fileName); return file; }) ); diff --git a/frontend/app/view/term.tsx b/frontend/app/view/term.tsx index b6387540..347bea65 100644 --- a/frontend/app/view/term.tsx +++ b/frontend/app/view/term.tsx @@ -1,15 +1,14 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { BlockService } from "@/bindings/blockservice"; -import { getBlockSubject } from "@/store/global"; +import { getBackendHostPort, getORefSubject, WOS } from "@/store/global"; +import * as services from "@/store/services"; import { base64ToArray } from "@/util/util"; import { FitAddon } from "@xterm/addon-fit"; import type { ITheme } from "@xterm/xterm"; import { Terminal } from "@xterm/xterm"; import * as React from "react"; -import useResizeObserver from "@react-hook/resize-observer"; import { debounce } from "throttle-debounce"; import "./view.less"; import "/public/xterm.css"; @@ -43,12 +42,15 @@ function getThemeFromCSSVars(el: Element): ITheme { } function handleResize(fitAddon: FitAddon, blockId: string, term: Terminal) { + if (term == null) { + return; + } const oldRows = term.rows; const oldCols = term.cols; fitAddon.fit(); if (oldRows !== term.rows || oldCols !== term.cols) { const resizeCommand = { command: "controller:input", termsize: { rows: term.rows, cols: term.cols } }; - BlockService.SendCommand(blockId, resizeCommand); + services.BlockService.SendCommand(blockId, resizeCommand); } } @@ -61,10 +63,6 @@ const TerminalView = ({ blockId }: { blockId: string }) => { const connectElemRef = React.useRef(null); const termRef = React.useRef(null); const initialLoadRef = React.useRef({ loaded: false, heldData: [] }); - - const [fitAddon, setFitAddon] = React.useState(null); - const [term, setTerm] = React.useState(null); - React.useEffect(() => { console.log("terminal created"); const newTerm = new Terminal({ @@ -80,18 +78,22 @@ const TerminalView = ({ blockId }: { blockId: string }) => { newTerm.loadAddon(newFitAddon); newTerm.open(connectElemRef.current); newFitAddon.fit(); - BlockService.SendCommand(blockId, { + // BlockService.SendCommand(blockId, { + // command: "controller:input", + // termsize: { rows: newTerm.rows, cols: newTerm.cols }, + // }); + services.BlockService.SendCommand(blockId, { command: "controller:input", termsize: { rows: newTerm.rows, cols: newTerm.cols }, }); newTerm.onData((data) => { const b64data = btoa(data); const inputCmd = { command: "controller:input", blockid: blockId, inputdata64: b64data }; - BlockService.SendCommand(blockId, inputCmd); + services.BlockService.SendCommand(blockId, inputCmd); }); // block subject - const blockSubject = getBlockSubject(blockId); + const blockSubject = getORefSubject(WOS.makeORef("block", blockId)); blockSubject.subscribe((data) => { // base64 decode const decodedData = base64ToArray(data.ptydata); @@ -101,10 +103,6 @@ const TerminalView = ({ blockId }: { blockId: string }) => { initialLoadRef.current.heldData.push(decodedData); } }); - - setTerm(newTerm); - setFitAddon(newFitAddon); - // load data from filestore const startTs = Date.now(); let loadedBytes = 0; @@ -112,7 +110,7 @@ const TerminalView = ({ blockId }: { blockId: string }) => { const usp = new URLSearchParams(); usp.set("zoneid", blockId); usp.set("name", "main"); - fetch("/wave/file?" + usp.toString()) + fetch(getBackendHostPort() + "/wave/file?" + usp.toString()) .then((resp) => { if (resp.ok) { return resp.arrayBuffer(); @@ -133,18 +131,20 @@ const TerminalView = ({ blockId }: { blockId: string }) => { console.log(`terminal loaded file ${loadedBytes} bytes, ${Date.now() - startTs}ms`); }); + const resize_debounced = debounce(50, () => { + handleResize(newFitAddon, blockId, newTerm); + }); + const rszObs = new ResizeObserver(() => { + resize_debounced(); + }); + rszObs.observe(connectElemRef.current); + return () => { newTerm.dispose(); blockSubject.release(); }; }, []); - const handleResizeCallback = React.useCallback(() => { - debounce(50, () => handleResize(fitAddon, blockId, term)); - }, [fitAddon, term]); - - useResizeObserver(connectElemRef, handleResizeCallback); - return (
diff --git a/frontend/app/workspace/workspace.tsx b/frontend/app/workspace/workspace.tsx index e8b172bc..27b1a6f2 100644 --- a/frontend/app/workspace/workspace.tsx +++ b/frontend/app/workspace/workspace.tsx @@ -3,6 +3,7 @@ import { TabContent } from "@/app/tab/tab"; import { atoms } from "@/store/global"; +import * as services from "@/store/services"; import * as WOS from "@/store/wos"; import { clsx } from "clsx"; import * as jotai from "jotai"; @@ -21,10 +22,10 @@ function Tab({ tabId }: { tabId: string }) { const windowData = jotai.useAtomValue(atoms.waveWindow); const [tabData, tabLoading] = WOS.useWaveObjectValue(WOS.makeORef("tab", tabId)); function setActiveTab() { - WOS.SetActiveTab(tabId); + services.ObjectService.SetActiveTab(tabId); } function handleCloseTab() { - WOS.CloseTab(tabId); + services.ObjectService.CloseTab(tabId); deleteLayoutStateAtomForTab(tabId); } return ( @@ -45,7 +46,7 @@ function Tab({ tabId }: { tabId: string }) { function TabBar({ workspace }: { workspace: Workspace }) { function handleAddTab() { const newTabName = `Tab-${workspace.tabids.length + 1}`; - WOS.AddTabToWorkspace(newTabName, true); + services.ObjectService.AddTabToWorkspace(newTabName, true); } const tabIds = workspace?.tabids ?? []; return ( @@ -83,7 +84,7 @@ function Widgets() { async function createBlock(blockDef: BlockDef) { const rtOpts: RuntimeOpts = { termsize: { rows: 25, cols: 80 } }; - const { blockId } = await WOS.CreateBlock(blockDef, rtOpts); + const blockId = await services.ObjectService.CreateBlock(blockDef, rtOpts); addBlockToTab(blockId); } @@ -122,13 +123,13 @@ function Widgets() {
clickTerminal()}>
-
clickPreview("README.md")}> +
clickPreview("~/work/wails/thenextwave/README.md")}>
-
clickPreview("go.mod")}> +
clickPreview("~/work/wails/thenextwave/go.mod")}>
-
clickPreview("build/appicon.png")}> +
clickPreview("~/work/wails/thenextwave/build/appicon.png")}>
clickPreview("~")}> diff --git a/frontend/faraday/index.ts b/frontend/faraday/index.ts index 4986378f..81673caf 100644 --- a/frontend/faraday/index.ts +++ b/frontend/faraday/index.ts @@ -1,9 +1,9 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { TileLayout } from "./lib/TileLayout.jsx"; -import { newLayoutTreeStateAtom, useLayoutTreeStateReducerAtom, withLayoutTreeState } from "./lib/layoutAtom.js"; -import { newLayoutNode } from "./lib/layoutNode.js"; +import { TileLayout } from "./lib/TileLayout"; +import { newLayoutTreeStateAtom, useLayoutTreeStateReducerAtom, withLayoutTreeState } from "./lib/layoutAtom"; +import { newLayoutNode } from "./lib/layoutNode"; import type { LayoutNode, LayoutTreeCommitPendingAction, @@ -14,8 +14,8 @@ import type { LayoutTreeState, WritableLayoutNodeAtom, WritableLayoutTreeStateAtom, -} from "./lib/model.js"; -import { LayoutTreeActionType } from "./lib/model.js"; +} from "./lib/model"; +import { LayoutTreeActionType } from "./lib/model"; export { LayoutTreeActionType, diff --git a/frontend/faraday/lib/TileLayout.tsx b/frontend/faraday/lib/TileLayout.tsx index 6d0f5a25..f22d7bf0 100644 --- a/frontend/faraday/lib/TileLayout.tsx +++ b/frontend/faraday/lib/TileLayout.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import clsx from "clsx"; -import { +import React, { CSSProperties, ReactNode, RefObject, @@ -18,8 +18,8 @@ import { useDrag, useDragLayer, useDrop } from "react-dnd"; import useResizeObserver from "@react-hook/resize-observer"; import { toPng } from "html-to-image"; -import { useLayoutTreeStateReducerAtom } from "./layoutAtom.js"; -import { findNode } from "./layoutNode.js"; +import { useLayoutTreeStateReducerAtom } from "./layoutAtom"; +import { findNode } from "./layoutNode"; import { ContentRenderer, LayoutNode, @@ -31,15 +31,9 @@ import { LayoutTreeState, PreviewRenderer, WritableLayoutTreeStateAtom, -} from "./model.js"; +} from "./model"; import "./tilelayout.less"; -import { - Dimensions, - FlexDirection, - setTransform as createTransform, - debounce, - determineDropDirection, -} from "./utils.js"; +import { Dimensions, FlexDirection, setTransform as createTransform, debounce, determineDropDirection } from "./utils"; export interface TileLayoutProps { layoutTreeStateAtom: WritableLayoutTreeStateAtom; diff --git a/frontend/faraday/lib/layoutAtom.ts b/frontend/faraday/lib/layoutAtom.ts index a1e20021..8eb5a3e9 100644 --- a/frontend/faraday/lib/layoutAtom.ts +++ b/frontend/faraday/lib/layoutAtom.ts @@ -1,10 +1,10 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { WOS } from "@/app/store/global.js"; +import { WOS } from "@/app/store/global"; import { Atom, Getter, PrimitiveAtom, WritableAtom, atom, useAtom } from "jotai"; import { useCallback } from "react"; -import { layoutTreeStateReducer, newLayoutTreeState } from "./layoutState.js"; +import { layoutTreeStateReducer, newLayoutTreeState } from "./layoutState"; import { LayoutNode, LayoutNodeWaveObj, diff --git a/frontend/faraday/lib/layoutNode.ts b/frontend/faraday/lib/layoutNode.ts index 0eae9cf9..ef157b1b 100644 --- a/frontend/faraday/lib/layoutNode.ts +++ b/frontend/faraday/lib/layoutNode.ts @@ -1,8 +1,8 @@ // Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 -import { LayoutNode } from "./model.js"; -import { FlexDirection, getCrypto, reverseFlexDirection } from "./utils.js"; +import { LayoutNode } from "./model"; +import { FlexDirection, getCrypto, reverseFlexDirection } from "./utils"; const crypto = getCrypto(); diff --git a/frontend/faraday/lib/layoutState.ts b/frontend/faraday/lib/layoutState.ts index c76a7a1b..39d4d7d6 100644 --- a/frontend/faraday/lib/layoutState.ts +++ b/frontend/faraday/lib/layoutState.ts @@ -9,7 +9,7 @@ import { findNode, findParent, removeChild, -} from "./layoutNode.js"; +} from "./layoutNode"; import { LayoutNode, LayoutTreeAction, @@ -20,14 +20,14 @@ import { LayoutTreeMoveNodeAction, LayoutTreeState, MoveOperation, -} from "./model.js"; -import { DropDirection, FlexDirection, lazy } from "./utils.js"; +} from "./model"; +import { DropDirection, FlexDirection, lazy } from "./utils"; /** * Initializes a layout tree state. * @param rootNode The root node for the tree. * @returns The state of the tree. - * + *t * @template T The type of data associated with the nodes of the tree. */ export function newLayoutTreeState(rootNode: LayoutNode): LayoutTreeState { diff --git a/frontend/types/custom.d.ts b/frontend/types/custom.d.ts index cfa74d35..a472ecc1 100644 --- a/frontend/types/custom.d.ts +++ b/frontend/types/custom.d.ts @@ -2,110 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 declare global { - type UIContext = { - windowid: string; - activetabid: string; - }; - - type MetadataType = { [key: string]: any }; - - type ORef = { - otype: string; - oid: string; - }; - - interface WaveObj { - otype: string; - oid: string; - version: number; - } - - type WaveObjUpdate = { - updatetype: "update" | "delete"; - otype: string; - oid: string; - obj?: WaveObj; - }; - - type Block = WaveObj & { - blockdef: BlockDef; - controller: string; - view: string; - meta?: { [key: string]: any }; - runtimeopts?: RuntimeOpts; - }; - - type BlockDef = { - controller?: string; - view?: string; - files?: { [key: string]: FileDef }; - meta?: { [key: string]: any }; - }; - - type FileDef = { - filetype?: string; - path?: string; - url?: string; - content?: string; - meta?: { [key: string]: any }; - }; - - type TermSize = { - rows: number; - cols: number; - }; - - type Client = { - otype: string; - oid: string; - version: number; - mainwindowid: string; - }; - - type Tab = { - otype: string; - oid: string; - version: number; - name: string; - blockids: string[]; - layoutNode: string; - }; - - type Point = { - x: number; - y: number; - }; - - type WinSize = { - width: number; - height: number; - }; - - type Workspace = { - otype: string; - oid: string; - version: number; - name: string; - tabids: string[]; - }; - - type RuntimeOpts = { - termsize?: TermSize; - winsize?: WinSize; - }; - - type WaveWindow = { - otype: string; - oid: string; - version: number; - workspaceid: string; - activetabid: string; - activeblockmap: { [key: string]: string }; - pos: Point; - winsize: WinSize; - lastfocusts: number; - }; - type TabLayoutData = { blockId: string; }; diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts new file mode 100644 index 00000000..e505a95d --- /dev/null +++ b/frontend/types/gotypes.d.ts @@ -0,0 +1,174 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +// generated by cmd/generate/main-generate.go + +declare global { + + // wstore.Block + type Block = WaveObj & { + blockdef: BlockDef; + controller: string; + view: string; + runtimeopts?: RuntimeOpts; + meta: MetaType; + }; + + // wstore.BlockDef + type BlockDef = { + controller?: string; + view?: string; + files?: {[key: string]: FileDef}; + meta?: MetaType; + }; + + // wstore.Client + type Client = WaveObj & { + mainwindowid: string; + meta: MetaType; + }; + + // wstore.FileDef + type FileDef = { + filetype?: string; + path?: string; + url?: string; + content?: string; + meta?: MetaType; + }; + + // fileservice.FileInfo + type FileInfo = { + path: string; + notfound?: boolean; + size: number; + mode: number; + modtime: number; + isdir?: boolean; + mimetype?: string; + }; + + // fileservice.FullFile + type FullFile = { + info: FileInfo; + data64: string; + }; + + // wstore.LayoutNode + type LayoutNode = WaveObj & { + node?: any; + meta?: MetaType; + }; + + type MetaType = {[key: string]: any} + + // servicemeta.MethodMeta + type MethodMeta = { + Desc: string; + ArgNames: string[]; + ReturnDesc: string; + }; + + // waveobj.ORef + type ORef = { + otype: string; + oid: string; + }; + + // wstore.Point + type Point = { + x: number; + y: number; + }; + + // wstore.RuntimeOpts + type RuntimeOpts = { + termsize?: TermSize; + winsize?: WinSize; + }; + + // wstore.Tab + type Tab = WaveObj & { + name: string; + layoutNode: string; + blockids: string[]; + meta: MetaType; + }; + + // shellexec.TermSize + type TermSize = { + rows: number; + cols: number; + }; + + // wstore.UIContext + type UIContext = { + windowid: string; + activetabid: string; + }; + + // eventbus.WSEventType + type WSEventType = { + eventtype: string; + oref?: string; + data: any; + }; + + // waveobj.WaveObj + type WaveObj = { + otype: string; + oid: string; + version: number; + }; + + // wstore.WaveObjUpdate + type WaveObjUpdate = { + updatetype: string; + otype: string; + oid: string; + obj?: WaveObj; + }; + + // service.WebCallType + type WebCallType = { + service: string; + method: string; + uicontext?: UIContext; + args: any[]; + }; + + // service.WebReturnType + type WebReturnType = { + success?: boolean; + error?: string; + data?: any; + updates?: WaveObjUpdate[]; + }; + + // wstore.WinSize + type WinSize = { + width: number; + height: number; + }; + + // wstore.Window + type WaveWindow = WaveObj & { + workspaceid: string; + activetabid: string; + activeblockmap: {[key: string]: string}; + pos: Point; + winsize: WinSize; + lastfocusts: number; + meta: MetaType; + }; + + // wstore.Workspace + type Workspace = WaveObj & { + name: string; + tabids: string[]; + meta: MetaType; + }; + +} + +export {} diff --git a/frontend/util/fontutil.ts b/frontend/util/fontutil.ts index aa9d4afe..bdf9258b 100644 --- a/frontend/util/fontutil.ts +++ b/frontend/util/fontutil.ts @@ -17,15 +17,15 @@ function loadJetBrainsMonoFont() { return; } isJetBrainsMonoLoaded = true; - const jbmFontNormal = new FontFace("JetBrains Mono", "url('/fonts/jetbrains-mono-v13-latin-regular.woff2')", { + const jbmFontNormal = new FontFace("JetBrains Mono", "url('public/fonts/jetbrains-mono-v13-latin-regular.woff2')", { style: "normal", weight: "400", }); - const jbmFont200 = new FontFace("JetBrains Mono", "url('/fonts/jetbrains-mono-v13-latin-200.woff2')", { + const jbmFont200 = new FontFace("JetBrains Mono", "url('public/fonts/jetbrains-mono-v13-latin-200.woff2')", { style: "normal", weight: "200", }); - const jbmFont700 = new FontFace("JetBrains Mono", "url('/fonts/jetbrains-mono-v13-latin-700.woff2')", { + const jbmFont700 = new FontFace("JetBrains Mono", "url('public/fonts/jetbrains-mono-v13-latin-700.woff2')", { style: "normal", weight: "700", }); @@ -42,11 +42,11 @@ function loadLatoFont() { return; } isLatoFontLoaded = true; - const latoFont = new FontFace("Lato", "url('/fonts/lato-regular.woff')", { + const latoFont = new FontFace("Lato", "url('public/fonts/lato-regular.woff')", { style: "normal", weight: "400", }); - const latoFontBold = new FontFace("Lato", "url('/fonts/lato-bold.woff')", { + const latoFontBold = new FontFace("Lato", "url('public/fonts/lato-bold.woff')", { style: "normal", weight: "700", }); @@ -61,11 +61,11 @@ function loadFiraCodeFont() { return; } isFiraCodeLoaded = true; - const firaCodeRegular = new FontFace("Fira Code", "url('/fonts/firacode-regular.woff2')", { + const firaCodeRegular = new FontFace("Fira Code", "url('public/fonts/firacode-regular.woff2')", { style: "normal", weight: "400", }); - const firaCodeBold = new FontFace("Fira Code", "url('/fonts/firacode-bold.woff2')", { + const firaCodeBold = new FontFace("Fira Code", "url('public/fonts/firacode-bold.woff2')", { style: "normal", weight: "700", }); @@ -80,19 +80,19 @@ function loadHackFont() { return; } isHackFontLoaded = true; - const hackRegular = new FontFace("Hack", "url('/fonts/hack-regular.woff2')", { + const hackRegular = new FontFace("Hack", "url('public/fonts/hack-regular.woff2')", { style: "normal", weight: "400", }); - const hackBold = new FontFace("Hack", "url('/fonts/hack-bold.woff2')", { + const hackBold = new FontFace("Hack", "url('public/fonts/hack-bold.woff2')", { style: "normal", weight: "700", }); - const hackItalic = new FontFace("Hack", "url('/fonts/hack-italic.woff2')", { + const hackItalic = new FontFace("Hack", "url('public/fonts/hack-italic.woff2')", { style: "italic", weight: "400", }); - const hackBoldItalic = new FontFace("Hack", "url('/fonts/hack-bolditalic.woff2')", { + const hackBoldItalic = new FontFace("Hack", "url('public/fonts/hack-bolditalic.woff2')", { style: "italic", weight: "700", }); @@ -111,7 +111,7 @@ function loadBaseFonts() { return; } isBaseFontsLoaded = true; - const mmFont = new FontFace("Martian Mono", "url(/fonts/MartianMono-VariableFont_wdth,wght.ttf)", { + const mmFont = new FontFace("Martian Mono", "url('public/fonts/MartianMono-VariableFont_wdth,wght.ttf')", { style: "normal", weight: "normal", }); diff --git a/frontend/wave.ts b/frontend/wave.ts index 892f4d19..7a24e3bc 100644 --- a/frontend/wave.ts +++ b/frontend/wave.ts @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { Client } from "@/gopkg/wstore"; -import { globalStore } from "@/store/global"; +import { globalStore, globalWS, initWS } from "@/store/global"; +import * as services from "@/store/services"; import * as WOS from "@/store/wos"; import * as React from "react"; import { createRoot } from "react-dom/client"; @@ -10,13 +11,15 @@ import { App } from "./app/app"; import { loadFonts } from "./util/fontutil"; const urlParams = new URLSearchParams(window.location.search); -const windowId = urlParams.get("windowid"); -const clientId = urlParams.get("clientid"); - -loadFonts(); +let windowId = urlParams.get("windowid"); +let clientId = urlParams.get("clientid"); console.log("Wave Starting"); +console.log("clientid", clientId, "windowid", windowId); +loadFonts(); +initWS(); +(window as any).globalWS = globalWS; (window as any).WOS = WOS; (window as any).globalStore = globalStore; @@ -30,9 +33,10 @@ matchViewportSize(); document.addEventListener("DOMContentLoaded", async () => { console.log("DOMContentLoaded"); // ensures client/window/workspace are loaded into the cache before rendering - await WOS.loadAndPinWaveObject(WOS.makeORef("client", clientId)); + const client = await WOS.loadAndPinWaveObject(WOS.makeORef("client", clientId)); const waveWindow = await WOS.loadAndPinWaveObject(WOS.makeORef("window", windowId)); await WOS.loadAndPinWaveObject(WOS.makeORef("workspace", waveWindow.workspaceid)); + services.ObjectService.SetActiveTab(waveWindow.activetabid); // no need to wait const reactElem = React.createElement(App, null, null); const elem = document.getElementById("main"); const root = createRoot(elem); diff --git a/go.mod b/go.mod index e630cfd5..c9a2267b 100644 --- a/go.mod +++ b/go.mod @@ -8,58 +8,21 @@ require ( github.com/creack/pty v1.1.18 github.com/golang-migrate/migrate/v4 v4.17.1 github.com/google/uuid v1.4.0 + github.com/gorilla/mux v1.8.0 + github.com/gorilla/websocket v1.5.0 github.com/jmoiron/sqlx v1.4.0 github.com/mattn/go-sqlite3 v1.14.22 github.com/mitchellh/mapstructure v1.5.0 github.com/sawka/txwrap v0.2.0 - github.com/wailsapp/wails/v3 v3.0.0-alpha.0 github.com/wavetermdev/waveterm/wavesrv v0.0.0-20240508181017-d07068c09d94 golang.org/x/sys v0.20.0 ) require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect - github.com/bep/debounce v1.2.1 // indirect - github.com/cloudflare/circl v1.3.7 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/ebitengine/purego v0.4.0-alpha.4 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.11.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/leaanthony/go-ansi-parser v1.6.1 // indirect - github.com/leaanthony/u v1.1.0 // indirect - github.com/lmittmann/tint v1.0.4 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/sergi/go-diff v1.2.0 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect - github.com/wailsapp/go-webview2 v1.0.9 // indirect - github.com/wailsapp/mimetype v1.4.1 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/stretchr/testify v1.8.4 // indirect go.uber.org/atomic v1.7.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/tools v0.21.0 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect ) replace github.com/wailsapp/wails/v3 => ../wails/v3 diff --git a/go.sum b/go.sum index a346f06c..f1e2ec57 100644 --- a/go.sum +++ b/go.sum @@ -1,216 +1,46 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= -github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes= -github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= -github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= -github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= -github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI= -github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc= -github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sawka/txwrap v0.2.0 h1:V3LfvKVLULxcYSxdMguLwFyQFMEU9nFDJopg0ZkL+94= github.com/sawka/txwrap v0.2.0/go.mod h1:wwQ2SQiN4U+6DU/iVPhbvr7OzXAtgZlQCIGuvOswEfA= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs= -github.com/wailsapp/go-webview2 v1.0.9/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= -github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= -github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/wavetermdev/waveterm/wavesrv v0.0.0-20240508181017-d07068c09d94 h1:/SPCxd4KHlS4eRTreYEXWFRr8WfRFBcChlV5cgkaO58= github.com/wavetermdev/waveterm/wavesrv v0.0.0-20240508181017-d07068c09d94/go.mod h1:ywoo7DXdYueQ0tTPhVoB+wzRTgERSE19EA3mR6KGRaI= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go deleted file mode 100644 index 216a60b6..00000000 --- a/main.go +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright 2024, Command Line Inc. -// SPDX-License-Identifier: Apache-2.0 - -package main - -// Note, main.go needs to be in the root of the project for the go:embed directive to work. - -import ( - "context" - "embed" - "encoding/base64" - "encoding/json" - "fmt" - "io/fs" - "log" - "net/http" - "os" - "os/signal" - "runtime" - "strings" - "syscall" - "time" - - "github.com/google/uuid" - "github.com/wavetermdev/thenextwave/pkg/eventbus" - "github.com/wavetermdev/thenextwave/pkg/filestore" - "github.com/wavetermdev/thenextwave/pkg/service/blockservice" - "github.com/wavetermdev/thenextwave/pkg/service/clientservice" - "github.com/wavetermdev/thenextwave/pkg/service/fileservice" - "github.com/wavetermdev/thenextwave/pkg/service/objectservice" - "github.com/wavetermdev/thenextwave/pkg/wavebase" - "github.com/wavetermdev/thenextwave/pkg/wstore" - - "github.com/wailsapp/wails/v3/pkg/application" - "github.com/wailsapp/wails/v3/pkg/events" -) - -//go:embed dist -var assets embed.FS - -//go:embed build/icons.icns -var appIcon []byte - -func createAppMenu(app *application.App) *application.Menu { - menu := application.NewMenu() - menu.AddRole(application.AppMenu) - fileMenu := menu.AddSubmenu("File") - // newWindow := fileMenu.Add("New Window") - // newWindow.OnClick(func(appContext *application.Context) { - // createWindow(app) - // }) - closeWindow := fileMenu.Add("Close Window") - closeWindow.OnClick(func(appContext *application.Context) { - app.CurrentWindow().Close() - }) - menu.AddRole(application.EditMenu) - menu.AddRole(application.ViewMenu) - menu.AddRole(application.WindowMenu) - menu.AddRole(application.HelpMenu) - return menu -} - -func storeWindowSizeAndPos(windowId string, window *application.WebviewWindow) { - ctx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second) - defer cancelFn() - windowData, err := wstore.DBGet[*wstore.Window](ctx, windowId) - if err != nil { - log.Printf("error getting window data: %v\n", err) - return - } - winWidth, winHeight := window.Size() - windowData.WinSize.Width = winWidth - windowData.WinSize.Height = winHeight - x, y := window.AbsolutePosition() - windowData.Pos.X = x - windowData.Pos.Y = y - err = wstore.DBUpdate(ctx, windowData) - if err != nil { - log.Printf("error updating window size: %v\n", err) - } -} - -func createWindow(windowData *wstore.Window, app *application.App) { - client, err := wstore.DBGetSingleton[*wstore.Client](context.Background()) - if err != nil { - panic(fmt.Errorf("error getting client data: %w", err)) - } - // TODO: x/y pos is not getting restored correctly. window seems to ignore the x/y values on startup - window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ - Title: "Wave Terminal", - Mac: application.MacWindow{ - InvisibleTitleBarHeight: 50, - Backdrop: application.MacBackdropTranslucent, - TitleBar: application.MacTitleBarHiddenInset, - }, - BackgroundColour: application.NewRGBA(0, 0, 0, 255), - URL: "/public/index.html?windowid=" + windowData.OID + "&clientid=" + client.OID, - X: windowData.Pos.X, - Y: windowData.Pos.Y, - Width: windowData.WinSize.Width, - Height: windowData.WinSize.Height, - ZoomControlEnabled: true, - }) - eventbus.RegisterWailsWindow(window, windowData.OID) - window.On(events.Common.WindowClosing, func(event *application.WindowEvent) { - eventbus.UnregisterWailsWindow(window.ID()) - }) - window.On(events.Mac.WindowDidResize, func(event *application.WindowEvent) { - storeWindowSizeAndPos(windowData.OID, window) - }) - window.On(events.Mac.WindowDidMove, func(event *application.WindowEvent) { - storeWindowSizeAndPos(windowData.OID, window) - }) - window.Show() - go func() { - time.Sleep(100 * time.Millisecond) - objectService := &objectservice.ObjectService{} - uiContext := wstore.UIContext{ - WindowId: windowData.OID, - ActiveTabId: windowData.ActiveTabId, - } - _, err := objectService.SetActiveTab(uiContext, windowData.ActiveTabId) - if err != nil { - log.Printf("error setting active tab for new window: %v\n", err) - } - }() -} - -type waveAssetHandler struct { - AssetHandler http.Handler -} - -func serveWaveFile(w http.ResponseWriter, r *http.Request) { - zoneId := r.URL.Query().Get("zoneid") - name := r.URL.Query().Get("name") - if _, err := uuid.Parse(zoneId); err != nil { - http.Error(w, fmt.Sprintf("invalid zoneid: %v", err), http.StatusBadRequest) - return - } - if name == "" { - http.Error(w, "name is required", http.StatusBadRequest) - return - - } - file, err := filestore.WFS.Stat(r.Context(), zoneId, name) - if err == fs.ErrNotExist { - http.NotFound(w, r) - return - } - if err != nil { - http.Error(w, fmt.Sprintf("error getting file info: %v", err), http.StatusInternalServerError) - return - } - jsonFileBArr, err := json.Marshal(file) - if err != nil { - http.Error(w, fmt.Sprintf("error serializing file info: %v", err), http.StatusInternalServerError) - } - w.Header().Set("Content-Type", "application/octet-stream") - w.Header().Set("Content-Length", fmt.Sprintf("%d", file.Size)) - w.Header().Set("X-ZoneFileInfo", base64.StdEncoding.EncodeToString(jsonFileBArr)) - w.Header().Set("Last-Modified", time.UnixMilli(file.ModTs).UTC().Format(http.TimeFormat)) - if file.Size == 0 { - w.WriteHeader(http.StatusOK) - return - } - for offset := file.DataStartIdx(); offset < file.Size; offset += filestore.DefaultPartDataSize { - _, data, err := filestore.WFS.ReadAt(r.Context(), zoneId, name, offset, filestore.DefaultPartDataSize) - if err != nil { - if offset == 0 { - http.Error(w, fmt.Sprintf("error reading file: %v", err), http.StatusInternalServerError) - } else { - // nothing to do, the headers have already been sent - log.Printf("error reading file %s/%s @ %d: %v\n", zoneId, name, offset, err) - } - return - } - w.Write(data) - } -} - -func serveWaveUrls(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-cache") - if r.URL.Path == "/wave/stream-file" { - fileName := r.URL.Query().Get("path") - fileName = wavebase.ExpandHomeDir(fileName) - http.ServeFile(w, r, fileName) - return - } - if r.URL.Path == "/wave/file" { - serveWaveFile(w, r) - return - } - http.NotFound(w, r) -} - -func (wah waveAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" && strings.HasPrefix(r.URL.Path, "/wave/") { - serveWaveUrls(w, r) - return - } - wah.AssetHandler.ServeHTTP(w, r) -} - -func doShutdown(reason string) { - log.Printf("shutting down: %s\n", reason) - ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) - defer cancelFn() - // TODO deal with flush in progress - filestore.WFS.FlushCache(ctx) - time.Sleep(200 * time.Millisecond) - os.Exit(0) -} - -func installShutdownSignalHandlers() { - sigCh := make(chan os.Signal, 1) - signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGINT) - go func() { - for sig := range sigCh { - doShutdown(fmt.Sprintf("got signal %v", sig)) - break - } - }() -} - -func main() { - err := wavebase.EnsureWaveHomeDir() - if err != nil { - log.Printf("error ensuring wave home dir: %v\n", err) - return - } - waveLock, err := wavebase.AcquireWaveLock() - if err != nil { - log.Printf("error acquiring wave lock (another instance of Wave is likely running): %v\n", err) - return - } - - log.Printf("wave home dir: %s\n", wavebase.GetWaveHomeDir()) - err = filestore.InitFilestore() - if err != nil { - log.Printf("error initializing filestore: %v\n", err) - return - } - err = wstore.InitWStore() - if err != nil { - log.Printf("error initializing wstore: %v\n", err) - return - } - err = wstore.EnsureInitialData() - if err != nil { - log.Printf("error ensuring initial data: %v\n", err) - return - } - installShutdownSignalHandlers() - - app := application.New(application.Options{ - Name: "NextWave", - Description: "The Next Wave Terminal", - Services: []application.Service{ - application.NewService(&fileservice.FileService{}), - application.NewService(&blockservice.BlockService{}), - application.NewService(&clientservice.ClientService{}), - application.NewService(&objectservice.ObjectService{}), - }, - Icon: appIcon, - Assets: application.AssetOptions{ - Handler: waveAssetHandler{AssetHandler: application.AssetFileServerFS(assets)}, - }, - Mac: application.MacOptions{ - ApplicationShouldTerminateAfterLastWindowClosed: true, - }, - }) - menu := createAppMenu(app) - app.SetMenu(menu) - eventbus.RegisterWailsApp(app) - - setupCtx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second) - defer cancelFn() - client, err := wstore.DBGetSingleton[*wstore.Client](setupCtx) - if err != nil { - log.Printf("error getting client data: %v\n", err) - return - } - mainWindow, err := wstore.DBGet[*wstore.Window](setupCtx, client.MainWindowId) - if err != nil { - log.Printf("error getting main window: %v\n", err) - return - } - if mainWindow == nil { - log.Printf("no main window data\n") - return - } - createWindow(mainWindow, app) - - eventbus.Start() - defer eventbus.Shutdown() - - // blocking - err = app.Run() - - // If an error occurred while running the application, log it and exit. - if err != nil { - log.Printf("run error: %v\n", err) - } - runtime.KeepAlive(waveLock) -} diff --git a/package.json b/package.json index d8019d35..7c9be8eb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "name": "thenextwave", "private": true, "version": "0.0.0", - "type": "module", + "main": "dist/emain.js", + "browser": "dist/wave.js", "scripts": { "dev": "vite", "build": "vite build --minify false --mode development", @@ -14,6 +15,16 @@ "test": "vitest" }, "devDependencies": { + "@babel/core": "^7.24.7", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-decorators": "^7.24.7", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "@babel/preset-react": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", "@chromatic-com/storybook": "^1.5.0", "@eslint/js": "^9.2.0", "@storybook/addon-essentials": "^8.1.4", @@ -24,6 +35,9 @@ "@storybook/react": "^8.1.4", "@storybook/react-vite": "^8.1.4", "@storybook/test": "^8.1.4", + "@types/babel__core": "^7", + "@types/babel__plugin-transform-runtime": "^7", + "@types/babel__preset-env": "^7", "@types/node": "^20.12.12", "@types/react": "^18.3.2", "@types/throttle-debounce": "^5", @@ -31,21 +45,32 @@ "@vitejs/plugin-react": "^4.3.0", "@vitest/coverage-istanbul": "^1.6.0", "@wailsio/runtime": "^3.0.0-alpha.24", + "babel-loader": "^9.1.3", + "babel-plugin-jsx-control-statements": "^4.1.2", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^7.1.2", + "electron-vite": "^2.2.0", "eslint": "^9.2.0", "eslint-config-prettier": "^9.1.0", "less": "^4.2.0", + "less-loader": "^12.2.0", + "mini-css-extract-plugin": "^2.9.0", "prettier": "^3.2.5", "prettier-plugin-jsdoc": "^1.3.0", "prettier-plugin-organize-imports": "^3.2.4", "storybook": "^8.1.4", + "style-loader": "^4.0.0", "ts-node": "^10.9.2", + "tsconfig-paths-webpack-plugin": "^4.1.0", "tslib": "^2.6.2", "typescript": "^5.4.5", "typescript-eslint": "^7.8.0", "vite": "^5.0.0", "vite-plugin-static-copy": "^1.0.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.6.0" + "vitest": "^1.6.0", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" }, "dependencies": { "@monaco-editor/loader": "^1.4.0", @@ -57,6 +82,8 @@ "@xterm/xterm": "^5.5.0", "base64-js": "^1.5.1", "clsx": "^2.1.1", + "dayjs": "^1.11.11", + "electron": "^30.1.0", "html-to-image": "^1.11.11", "immer": "^10.1.1", "jotai": "^2.8.0", diff --git a/pkg/blockcontroller/blockcontroller.go b/pkg/blockcontroller/blockcontroller.go index a7580617..e9fafb26 100644 --- a/pkg/blockcontroller/blockcontroller.go +++ b/pkg/blockcontroller/blockcontroller.go @@ -15,10 +15,10 @@ import ( "time" "github.com/creack/pty" - "github.com/wailsapp/wails/v3/pkg/application" "github.com/wavetermdev/thenextwave/pkg/eventbus" "github.com/wavetermdev/thenextwave/pkg/filestore" "github.com/wavetermdev/thenextwave/pkg/shellexec" + "github.com/wavetermdev/thenextwave/pkg/waveobj" "github.com/wavetermdev/thenextwave/pkg/wstore" ) @@ -97,8 +97,9 @@ func (bc *BlockController) handleShellProcData(data []byte, seqNum int) error { if err != nil { return fmt.Errorf("error appending to blockfile: %w", err) } - eventbus.SendEvent(application.WailsEvent{ - Name: "block:ptydata", + eventbus.SendEvent(eventbus.WSEventType{ + EventType: "block:ptydata", + ORef: waveobj.MakeORef(wstore.OType_Block, bc.BlockId).String(), Data: map[string]any{ "blockid": bc.BlockId, "blockfile": "main", @@ -210,9 +211,10 @@ func (bc *BlockController) Run(bdata *wstore.Block) { bc.Status = "done" } }) - eventbus.SendEvent(application.WailsEvent{ - Name: "block:done", - Data: nil, + eventbus.SendEvent(eventbus.WSEventType{ + EventType: "block:done", + ORef: waveobj.MakeORef(wstore.OType_Block, bc.BlockId).String(), + Data: nil, }) globalLock.Lock() defer globalLock.Unlock() diff --git a/pkg/eventbus/eventbus.go b/pkg/eventbus/eventbus.go index 41a8933f..34cea81c 100644 --- a/pkg/eventbus/eventbus.go +++ b/pkg/eventbus/eventbus.go @@ -4,164 +4,74 @@ package eventbus import ( - "errors" - "fmt" - "log" - "runtime/debug" "sync" - "github.com/wailsapp/wails/v3/pkg/application" "github.com/wavetermdev/thenextwave/pkg/waveobj" ) -const EventBufferSize = 50 - -var EventCh chan application.WailsEvent = make(chan application.WailsEvent, EventBufferSize) -var WindowEventCh chan WindowEvent = make(chan WindowEvent, EventBufferSize) -var shutdownCh chan struct{} = make(chan struct{}) -var ErrQueueFull = errors.New("event queue full") - -type WindowEvent struct { - WindowId uint - Event application.WailsEvent +type WSEventType struct { + EventType string `json:"eventtype"` + ORef string `json:"oref,omitempty"` + Data any `json:"data"` } type WindowWatchData struct { - Window *application.WebviewWindow - WaveWindowId string - WailsWindowId uint - WatchedORefs map[waveobj.ORef]bool + WindowWSCh chan any + WaveWindowId string + WatchedORefs map[waveobj.ORef]bool } var globalLock = &sync.Mutex{} -var wailsApp *application.App -var wailsWindowMap = make(map[uint]*WindowWatchData) +var wsMap = make(map[string]*WindowWatchData) // websocketid => WindowWatchData -func Start() { - go processEvents() -} - -func Shutdown() { - close(shutdownCh) -} - -func RegisterWailsApp(app *application.App) { +func RegisterWSChannel(connId string, windowId string, ch chan any) { globalLock.Lock() defer globalLock.Unlock() - wailsApp = app + wsMap[connId] = &WindowWatchData{ + WindowWSCh: ch, + WaveWindowId: windowId, + WatchedORefs: make(map[waveobj.ORef]bool), + } } -func RegisterWailsWindow(window *application.WebviewWindow, windowId string) { +func UnregisterWSChannel(connId string) { globalLock.Lock() defer globalLock.Unlock() - if _, found := wailsWindowMap[window.ID()]; found { - panic(fmt.Errorf("wails window already registered with eventbus: %d", window.ID())) - } - wailsWindowMap[window.ID()] = &WindowWatchData{ - Window: window, - WailsWindowId: window.ID(), - WaveWindowId: "", - WatchedORefs: make(map[waveobj.ORef]bool), - } + delete(wsMap, connId) } -func UnregisterWailsWindow(windowId uint) { +func getWindowWatchesForWindowId(windowId string) []*WindowWatchData { globalLock.Lock() defer globalLock.Unlock() - delete(wailsWindowMap, windowId) -} - -func emitEventToWindow(event WindowEvent) { - globalLock.Lock() - wdata := wailsWindowMap[event.WindowId] - globalLock.Unlock() - if wdata != nil { - wdata.Window.DispatchWailsEvent(&event.Event) - } -} - -func emitEventToAllWindows(event *application.WailsEvent) { - globalLock.Lock() - wins := make([]*application.WebviewWindow, 0, len(wailsWindowMap)) - for _, wdata := range wailsWindowMap { - wins = append(wins, wdata.Window) - } - globalLock.Unlock() - for _, window := range wins { - window.DispatchWailsEvent(event) - } -} - -func SendEvent(event application.WailsEvent) { - EventCh <- event -} - -func findWindowIdsByORef(oref waveobj.ORef) []uint { - globalLock.Lock() - defer globalLock.Unlock() - var ids []uint - for _, wdata := range wailsWindowMap { - if wdata.WatchedORefs[oref] { - ids = append(ids, wdata.WailsWindowId) + var watches []*WindowWatchData + for _, wdata := range wsMap { + if wdata.WaveWindowId == windowId { + watches = append(watches, wdata) } } - return ids + return watches } -func SendORefEvent(oref waveobj.ORef, event application.WailsEvent) { - wins := findWindowIdsByORef(oref) - for _, windowId := range wins { - SendWindowEvent(windowId, event) +func getAllWatches() []*WindowWatchData { + globalLock.Lock() + defer globalLock.Unlock() + watches := make([]*WindowWatchData, 0, len(wsMap)) + for _, wdata := range wsMap { + watches = append(watches, wdata) + } + return watches +} + +func SendEventToWindow(windowId string, event WSEventType) { + wwdArr := getWindowWatchesForWindowId(windowId) + for _, wdata := range wwdArr { + wdata.WindowWSCh <- event } } -func SendEventNonBlocking(event application.WailsEvent) error { - select { - case EventCh <- event: - return nil - default: - return ErrQueueFull - } -} - -func SendWindowEvent(windowId uint, event application.WailsEvent) { - WindowEventCh <- WindowEvent{ - WindowId: windowId, - Event: event, - } -} - -func SendWindowEventNonBlocking(windowId uint, event application.WailsEvent) error { - select { - case WindowEventCh <- WindowEvent{ - WindowId: windowId, - Event: event, - }: - return nil - default: - return ErrQueueFull - } -} - -func processEvents() { - defer func() { - if r := recover(); r != nil { - log.Printf("eventbus panic: %v\n", r) - debug.PrintStack() - } - }() - - log.Printf("eventbus starting\n") - for { - select { - case event := <-EventCh: - emitEventToAllWindows(&event) - case windowEvent := <-WindowEventCh: - emitEventToWindow(windowEvent) - - case <-shutdownCh: - log.Printf("eventbus shutting down\n") - return - } +func SendEvent(event WSEventType) { + wwdArr := getAllWatches() + for _, wdata := range wwdArr { + wdata.WindowWSCh <- event } } diff --git a/pkg/service/blockservice/blockservice.go b/pkg/service/blockservice/blockservice.go index e5fe2522..b9b14548 100644 --- a/pkg/service/blockservice/blockservice.go +++ b/pkg/service/blockservice/blockservice.go @@ -9,12 +9,20 @@ import ( "time" "github.com/wavetermdev/thenextwave/pkg/blockcontroller" + "github.com/wavetermdev/thenextwave/pkg/service/servicemeta" ) type BlockService struct{} const DefaultTimeout = 2 * time.Second +func (bs *BlockService) SendCommand_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + Desc: "send command to block", + ArgNames: []string{"blockid", "command"}, + } +} + func (bs *BlockService) SendCommand(blockId string, cmdMap map[string]any) error { cmd, err := blockcontroller.ParseCmdMap(cmdMap) if err != nil { diff --git a/pkg/service/objectservice/objectservice.go b/pkg/service/objectservice/objectservice.go index fcffe6e4..8d5e0d25 100644 --- a/pkg/service/objectservice/objectservice.go +++ b/pkg/service/objectservice/objectservice.go @@ -12,6 +12,7 @@ import ( "time" "github.com/wavetermdev/thenextwave/pkg/blockcontroller" + "github.com/wavetermdev/thenextwave/pkg/service/servicemeta" "github.com/wavetermdev/thenextwave/pkg/waveobj" "github.com/wavetermdev/thenextwave/pkg/wstore" ) @@ -28,7 +29,14 @@ func parseORef(oref string) (*waveobj.ORef, error) { return &waveobj.ORef{OType: fields[0], OID: fields[1]}, nil } -func (svc *ObjectService) GetObject(orefStr string) (any, error) { +func (svc *ObjectService) GetObject_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + Desc: "get wave object by oref", + ArgNames: []string{"oref"}, + } +} + +func (svc *ObjectService) GetObject(orefStr string) (waveobj.WaveObj, error) { oref, err := parseORef(orefStr) if err != nil { return nil, err @@ -39,11 +47,17 @@ func (svc *ObjectService) GetObject(orefStr string) (any, error) { if err != nil { return nil, fmt.Errorf("error getting object: %w", err) } - rtn, err := waveobj.ToJsonMap(obj) - return rtn, err + return obj, nil } -func (svc *ObjectService) GetObjects(orefStrArr []string) (any, error) { +func (svc *ObjectService) GetObjects_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"orefs"}, + ReturnDesc: "objects", + } +} + +func (svc *ObjectService) GetObjects(orefStrArr []string) ([]waveobj.WaveObj, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() @@ -78,30 +92,41 @@ func updatesRtn(ctx context.Context, rtnVal map[string]any) (any, error) { return rtnVal, nil } -func (svc *ObjectService) AddTabToWorkspace(uiContext wstore.UIContext, tabName string, activateTab bool) (any, error) { +func (svc *ObjectService) AddTabToWorkspace_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "tabName", "activateTab"}, + ReturnDesc: "tabId", + } +} + +func (svc *ObjectService) AddTabToWorkspace(uiContext wstore.UIContext, tabName string, activateTab bool) (string, wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) windowData, err := wstore.DBMustGet[*wstore.Window](ctx, uiContext.WindowId) if err != nil { - return nil, fmt.Errorf("error getting window: %w", err) + return "", nil, fmt.Errorf("error getting window: %w", err) } tab, err := wstore.CreateTab(ctx, windowData.WorkspaceId, tabName) if err != nil { - return nil, fmt.Errorf("error creating tab: %w", err) + return "", nil, fmt.Errorf("error creating tab: %w", err) } if activateTab { err = wstore.SetActiveTab(ctx, uiContext.WindowId, tab.OID) if err != nil { - return nil, fmt.Errorf("error setting active tab: %w", err) + return "", nil, fmt.Errorf("error setting active tab: %w", err) } } - rtn := make(map[string]any) - rtn["tabid"] = waveobj.GetOID(tab) - return updatesRtn(ctx, rtn) + return tab.OID, wstore.ContextGetUpdatesRtn(ctx), nil } -func (svc *ObjectService) SetActiveTab(uiContext wstore.UIContext, tabId string) (any, error) { +func (svc *ObjectService) SetActiveTab_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "tabId"}, + } +} + +func (svc *ObjectService) SetActiveTab(uiContext wstore.UIContext, tabId string) (wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) @@ -122,32 +147,51 @@ func (svc *ObjectService) SetActiveTab(uiContext wstore.UIContext, tabId string) continue } } - return updatesRtn(ctx, nil) + blockORefs := tab.GetBlockORefs() + blocks, err := wstore.DBSelectORefs(ctx, blockORefs) + if err != nil { + return nil, fmt.Errorf("error getting tab blocks: %w", err) + } + updates := wstore.ContextGetUpdatesRtn(ctx) + updates = append(updates, wstore.MakeUpdate(tab)) + updates = append(updates, wstore.MakeUpdates(blocks)...) + return updates, nil } -func (svc *ObjectService) CreateBlock(uiContext wstore.UIContext, blockDef *wstore.BlockDef, rtOpts *wstore.RuntimeOpts) (any, error) { +func (svc *ObjectService) CreateBlock_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "blockDef", "rtOpts"}, + ReturnDesc: "blockId", + } +} + +func (svc *ObjectService) CreateBlock(uiContext wstore.UIContext, blockDef *wstore.BlockDef, rtOpts *wstore.RuntimeOpts) (string, wstore.UpdatesRtnType, error) { if uiContext.ActiveTabId == "" { - return nil, fmt.Errorf("no active tab") + return "", nil, fmt.Errorf("no active tab") } ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) blockData, err := wstore.CreateBlock(ctx, uiContext.ActiveTabId, blockDef, rtOpts) if err != nil { - return nil, fmt.Errorf("error creating block: %w", err) + return "", nil, fmt.Errorf("error creating block: %w", err) } if blockData.Controller != "" { err = blockcontroller.StartBlockController(ctx, blockData.OID) if err != nil { - return nil, fmt.Errorf("error starting block controller: %w", err) + return "", nil, fmt.Errorf("error starting block controller: %w", err) } } - rtn := make(map[string]any) - rtn["blockId"] = blockData.OID - return updatesRtn(ctx, rtn) + return blockData.OID, wstore.ContextGetUpdatesRtn(ctx), nil } -func (svc *ObjectService) DeleteBlock(uiContext wstore.UIContext, blockId string) (any, error) { +func (svc *ObjectService) DeleteBlock_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "blockId"}, + } +} + +func (svc *ObjectService) DeleteBlock(uiContext wstore.UIContext, blockId string) (wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) @@ -156,10 +200,16 @@ func (svc *ObjectService) DeleteBlock(uiContext wstore.UIContext, blockId string return nil, fmt.Errorf("error deleting block: %w", err) } blockcontroller.StopBlockController(blockId) - return updatesRtn(ctx, nil) + return wstore.ContextGetUpdatesRtn(ctx), nil } -func (svc *ObjectService) CloseTab(uiContext wstore.UIContext, tabId string) (any, error) { +func (svc *ObjectService) CloseTab_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "tabId"}, + } +} + +func (svc *ObjectService) CloseTab(uiContext wstore.UIContext, tabId string) (wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) @@ -191,10 +241,16 @@ func (svc *ObjectService) CloseTab(uiContext wstore.UIContext, tabId string) (an } wstore.SetActiveTab(ctx, uiContext.WindowId, newActiveTabId) } - return updatesRtn(ctx, nil) + return wstore.ContextGetUpdatesRtn(ctx), nil } -func (svc *ObjectService) UpdateObjectMeta(uiContext wstore.UIContext, orefStr string, meta map[string]any) (any, error) { +func (svc *ObjectService) UpdateObjectMeta_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "oref", "meta"}, + } +} + +func (svc *ObjectService) UpdateObjectMeta(uiContext wstore.UIContext, orefStr string, meta map[string]any) (wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) @@ -206,18 +262,23 @@ func (svc *ObjectService) UpdateObjectMeta(uiContext wstore.UIContext, orefStr s if err != nil { return nil, fmt.Errorf("error updateing %q meta: %w", orefStr, err) } - return updatesRtn(ctx, nil) + return wstore.ContextGetUpdatesRtn(ctx), nil } -func (svc *ObjectService) UpdateObject(uiContext wstore.UIContext, objData map[string]any, returnUpdates bool) (any, error) { +func (svc *ObjectService) UpdateObject_Meta() servicemeta.MethodMeta { + return servicemeta.MethodMeta{ + ArgNames: []string{"uiContext", "waveObj", "returnUpdates"}, + } +} + +func (svc *ObjectService) UpdateObject(uiContext wstore.UIContext, waveObj waveobj.WaveObj, returnUpdates bool) (wstore.UpdatesRtnType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout) defer cancelFn() ctx = wstore.ContextWithUpdates(ctx) - - oref, err := waveobj.ORefFromMap(objData) - if err != nil { - return nil, fmt.Errorf("objData is not a valid object, requires otype and oid: %w", err) + if waveObj == nil { + return nil, fmt.Errorf("update wavobj is nil") } + oref := waveobj.ORefFromWaveObj(waveObj) found, err := wstore.DBExistsORef(ctx, *oref) if err != nil { return nil, fmt.Errorf("error getting object: %w", err) @@ -225,16 +286,12 @@ func (svc *ObjectService) UpdateObject(uiContext wstore.UIContext, objData map[s if !found { return nil, fmt.Errorf("object not found: %s", oref) } - newObj, err := waveobj.FromJsonMap(objData) - if err != nil { - return nil, fmt.Errorf("error converting data to valid wave object: %w", err) - } - err = wstore.DBUpdate(ctx, newObj) + err = wstore.DBUpdate(ctx, waveObj) if err != nil { return nil, fmt.Errorf("error updating object: %w", err) } if returnUpdates { - return updatesRtn(ctx, nil) + return wstore.ContextGetUpdatesRtn(ctx), nil } return nil, nil } diff --git a/pkg/service/service.go b/pkg/service/service.go new file mode 100644 index 00000000..5ddfc156 --- /dev/null +++ b/pkg/service/service.go @@ -0,0 +1,429 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "context" + "fmt" + "reflect" + "strings" + + "github.com/wavetermdev/thenextwave/pkg/service/blockservice" + "github.com/wavetermdev/thenextwave/pkg/service/clientservice" + "github.com/wavetermdev/thenextwave/pkg/service/fileservice" + "github.com/wavetermdev/thenextwave/pkg/service/objectservice" + "github.com/wavetermdev/thenextwave/pkg/service/servicemeta" + "github.com/wavetermdev/thenextwave/pkg/waveobj" + "github.com/wavetermdev/thenextwave/pkg/wstore" +) + +var ServiceMap = map[string]any{ + "block": &blockservice.BlockService{}, + "object": &objectservice.ObjectService{}, + "file": &fileservice.FileService{}, + "client": &clientservice.ClientService{}, +} + +var contextRType = reflect.TypeOf((*context.Context)(nil)).Elem() +var errorRType = reflect.TypeOf((*error)(nil)).Elem() +var updatesRType = reflect.TypeOf(([]wstore.WaveObjUpdate{})) +var waveObjRType = reflect.TypeOf((*waveobj.WaveObj)(nil)).Elem() +var waveObjSliceRType = reflect.TypeOf([]waveobj.WaveObj{}) +var waveObjMapRType = reflect.TypeOf(map[string]waveobj.WaveObj{}) +var methodMetaRType = reflect.TypeOf(servicemeta.MethodMeta{}) +var waveObjUpdateRType = reflect.TypeOf(wstore.WaveObjUpdate{}) +var uiContextRType = reflect.TypeOf((*wstore.UIContext)(nil)).Elem() + +type WebCallType struct { + Service string `json:"service"` + Method string `json:"method"` + UIContext *wstore.UIContext `json:"uicontext,omitempty"` + Args []any `json:"args"` +} + +type WebReturnType struct { + Success bool `json:"success,omitempty"` + Error string `json:"error,omitempty"` + Data any `json:"data,omitempty"` + Updates []wstore.WaveObjUpdate `json:"updates,omitempty"` +} + +func convertNumber(argType reflect.Type, jsonArg float64) (any, error) { + switch argType.Kind() { + case reflect.Int: + return int(jsonArg), nil + case reflect.Int8: + return int8(jsonArg), nil + case reflect.Int16: + return int16(jsonArg), nil + case reflect.Int32: + return int32(jsonArg), nil + case reflect.Int64: + return int64(jsonArg), nil + case reflect.Uint: + return uint(jsonArg), nil + case reflect.Uint8: + return uint8(jsonArg), nil + case reflect.Uint16: + return uint16(jsonArg), nil + case reflect.Uint32: + return uint32(jsonArg), nil + case reflect.Uint64: + return uint64(jsonArg), nil + case reflect.Float32: + return float32(jsonArg), nil + case reflect.Float64: + return jsonArg, nil + } + return nil, fmt.Errorf("invalid number type %s", argType) +} + +func convertComplex(argType reflect.Type, jsonArg any) (any, error) { + nativeArgVal := reflect.New(argType) + err := waveobj.DoMapStucture(nativeArgVal.Interface(), jsonArg) + if err != nil { + return nil, err + } + return nativeArgVal.Elem().Interface(), nil +} + +func isSpecialWaveArgType(argType reflect.Type) bool { + return argType == waveObjRType || argType == waveObjSliceRType || argType == waveObjMapRType +} + +func convertSpecial(argType reflect.Type, jsonArg any) (any, error) { + jsonType := reflect.TypeOf(jsonArg) + if argType == waveObjRType { + if jsonType.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + return waveobj.FromJsonMap(jsonArg.(map[string]any)) + } else if argType == waveObjSliceRType { + if jsonType.Kind() != reflect.Slice { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + sliceArg := jsonArg.([]any) + nativeSlice := make([]waveobj.WaveObj, len(sliceArg)) + for idx, elem := range sliceArg { + elemMap, ok := elem.(map[string]any) + if !ok { + return nil, fmt.Errorf("cannot convert %T to %s (idx %d is not a map, is %T)", jsonArg, waveObjSliceRType, idx, elem) + } + nativeObj, err := waveobj.FromJsonMap(elemMap) + if err != nil { + return nil, fmt.Errorf("cannot convert %T to %s (idx %d) error: %v", jsonArg, waveObjSliceRType, idx, err) + } + nativeSlice[idx] = nativeObj + } + return nativeSlice, nil + } else if argType == waveObjMapRType { + if jsonType.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + mapArg := jsonArg.(map[string]any) + nativeMap := make(map[string]waveobj.WaveObj) + for key, elem := range mapArg { + elemMap, ok := elem.(map[string]any) + if !ok { + return nil, fmt.Errorf("cannot convert %T to %s (key %s is not a map, is %T)", jsonArg, waveObjMapRType, key, elem) + } + nativeObj, err := waveobj.FromJsonMap(elemMap) + if err != nil { + return nil, fmt.Errorf("cannot convert %T to %s (key %s) error: %v", jsonArg, waveObjMapRType, key, err) + } + nativeMap[key] = nativeObj + } + return nativeMap, nil + } else { + return nil, fmt.Errorf("invalid special wave argument type %s", argType) + } +} + +func convertSpecialForReturn(argType reflect.Type, nativeArg any) (any, error) { + if argType == waveObjRType { + return waveobj.ToJsonMap(nativeArg.(waveobj.WaveObj)) + } else if argType == waveObjSliceRType { + nativeSlice := nativeArg.([]waveobj.WaveObj) + jsonSlice := make([]map[string]any, len(nativeSlice)) + for idx, elem := range nativeSlice { + elemMap, err := waveobj.ToJsonMap(elem) + if err != nil { + return nil, err + } + jsonSlice[idx] = elemMap + } + return jsonSlice, nil + } else if argType == waveObjMapRType { + nativeMap := nativeArg.(map[string]waveobj.WaveObj) + jsonMap := make(map[string]map[string]any) + for key, elem := range nativeMap { + elemMap, err := waveobj.ToJsonMap(elem) + if err != nil { + return nil, err + } + jsonMap[key] = elemMap + } + return jsonMap, nil + } else { + return nil, fmt.Errorf("invalid special wave argument type %s", argType) + } +} + +func convertArgument(argType reflect.Type, jsonArg any) (any, error) { + if jsonArg == nil { + return nil, nil + } + if isSpecialWaveArgType(argType) { + return convertSpecial(argType, jsonArg) + } + jsonType := reflect.TypeOf(jsonArg) + switch argType.Kind() { + case reflect.String: + if jsonType.Kind() == reflect.String { + return jsonArg, nil + } + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + + case reflect.Bool: + if jsonType.Kind() == reflect.Bool { + return jsonArg, nil + } + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + if jsonType.Kind() == reflect.Float64 { + return convertNumber(argType, jsonArg.(float64)) + } + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + + case reflect.Map: + if argType.Key().Kind() != reflect.String { + return nil, fmt.Errorf("invalid map key type %s", argType.Key()) + } + if jsonType.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + return convertComplex(argType, jsonArg) + + case reflect.Slice: + if jsonType.Kind() != reflect.Slice { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + return convertComplex(argType, jsonArg) + + case reflect.Struct: + if jsonType.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + return convertComplex(argType, jsonArg) + + case reflect.Ptr: + if argType.Elem().Kind() != reflect.Struct { + return nil, fmt.Errorf("invalid pointer type %s", argType) + } + if jsonType.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot convert %T to %s", jsonArg, argType) + } + return convertComplex(argType, jsonArg) + + default: + return nil, fmt.Errorf("invalid argument type %s", argType) + } +} + +func isNilable(val reflect.Value) bool { + switch val.Kind() { + case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Interface, reflect.Chan, reflect.Func: + return true + } + return false + +} + +func convertReturnValues(rtnVals []reflect.Value) *WebReturnType { + rtn := &WebReturnType{} + if len(rtnVals) == 0 { + return rtn + } + for _, val := range rtnVals { + if isNilable(val) && val.IsNil() { + continue + } + valType := val.Type() + if valType == errorRType { + rtn.Error = val.Interface().(error).Error() + continue + } + if valType == updatesRType { + // has a special MarshalJSON method + rtn.Updates = val.Interface().([]wstore.WaveObjUpdate) + continue + } + if isSpecialWaveArgType(valType) { + jsonVal, err := convertSpecialForReturn(valType, val.Interface()) + if err != nil { + rtn.Error = fmt.Errorf("cannot convert special return value: %v", err).Error() + continue + } + rtn.Data = jsonVal + continue + } + rtn.Data = val.Interface() + } + if rtn.Error == "" { + rtn.Success = true + } + return rtn +} + +func webErrorRtn(err error) *WebReturnType { + return &WebReturnType{ + Error: err.Error(), + } +} + +func CallService(ctx context.Context, webCall WebCallType) *WebReturnType { + svcObj := ServiceMap[webCall.Service] + if svcObj == nil { + return webErrorRtn(fmt.Errorf("invalid service: %q", webCall.Service)) + } + method := reflect.ValueOf(svcObj).MethodByName(webCall.Method) + if !method.IsValid() { + return webErrorRtn(fmt.Errorf("invalid method: %s.%s", webCall.Service, webCall.Method)) + } + var valueArgs []reflect.Value + argIdx := 0 + for idx := 0; idx < method.Type().NumIn(); idx++ { + argType := method.Type().In(idx) + if idx == 0 && argType == contextRType { + valueArgs = append(valueArgs, reflect.ValueOf(ctx)) + continue + } + if argType == uiContextRType { + if webCall.UIContext == nil { + return webErrorRtn(fmt.Errorf("missing UIContext for %s.%s", webCall.Service, webCall.Method)) + } + valueArgs = append(valueArgs, reflect.ValueOf(*webCall.UIContext)) + continue + } + if argIdx >= len(webCall.Args) { + return webErrorRtn(fmt.Errorf("not enough arguments passed %s.%s idx:%d (type %T)", webCall.Service, webCall.Method, idx, argType)) + } + nativeArg, err := convertArgument(argType, webCall.Args[argIdx]) + if err != nil { + return webErrorRtn(fmt.Errorf("cannot convert argument %s.%s type:%T idx:%d error:%v", webCall.Service, webCall.Method, argType, idx, err)) + } + valueArgs = append(valueArgs, reflect.ValueOf(nativeArg)) + argIdx++ + } + retValArr := method.Call(valueArgs) + return convertReturnValues(retValArr) +} + +// ValidateServiceArg validates the argument type for a service method +// does not allow interfaces (and the obvious invalid types) +// arguments + return values have special handling for wave objects +func baseValidateServiceArg(argType reflect.Type) error { + if argType == waveObjUpdateRType { + // has special MarshalJSON method, so it is safe + return nil + } + switch argType.Kind() { + case reflect.Ptr, reflect.Slice, reflect.Array: + return baseValidateServiceArg(argType.Elem()) + case reflect.Map: + if argType.Key().Kind() != reflect.String { + return fmt.Errorf("invalid map key type %s", argType.Key()) + } + return baseValidateServiceArg(argType.Elem()) + case reflect.Struct: + for idx := 0; idx < argType.NumField(); idx++ { + if err := baseValidateServiceArg(argType.Field(idx).Type); err != nil { + return err + } + } + case reflect.Interface: + return fmt.Errorf("invalid argument type %s: contains interface", argType) + + case reflect.Chan, reflect.Func, reflect.Complex128, reflect.Complex64, reflect.Invalid, reflect.Uintptr, reflect.UnsafePointer: + return fmt.Errorf("invalid argument type %s", argType) + } + return nil +} + +func validateMethodReturnArg(retType reflect.Type) error { + // specifically allow waveobj.WaveObj, []waveobj.WaveObj, map[string]waveobj.WaveObj, and error + if isSpecialWaveArgType(retType) || retType == errorRType { + return nil + } + return baseValidateServiceArg(retType) +} + +func validateMethodArg(argType reflect.Type) error { + // specifically allow waveobj.WaveObj, []waveobj.WaveObj, map[string]waveobj.WaveObj, and context.Context + if isSpecialWaveArgType(argType) || argType == contextRType { + return nil + } + return baseValidateServiceArg(argType) +} + +func validateServiceMethod(service string, method reflect.Method) error { + for idx := 0; idx < method.Type.NumOut(); idx++ { + if err := validateMethodReturnArg(method.Type.Out(idx)); err != nil { + return fmt.Errorf("invalid return type %s.%s %s: %v", service, method.Name, method.Type.Out(idx), err) + } + } + for idx := 1; idx < method.Type.NumIn(); idx++ { + // skip the first argument which is the receiver + if err := validateMethodArg(method.Type.In(idx)); err != nil { + return fmt.Errorf("invalid argument type %s.%s %s: %v", service, method.Name, method.Type.In(idx), err) + } + } + return nil +} + +func validateServiceMetaMethod(service string, method reflect.Method) error { + if method.Type.NumIn() != 1 { + return fmt.Errorf("invalid number of arguments %s.%s: got:%d, expected just the receiver", service, method.Name, method.Type.NumIn()) + } + if method.Type.NumOut() != 1 && method.Type.Out(0) != methodMetaRType { + return fmt.Errorf("invalid return type %s.%s: got:%s, expected servicemeta.MethodMeta", service, method.Name, method.Type.Out(0)) + } + return nil +} + +func ValidateService(serviceName string, svcObj any) error { + svcType := reflect.TypeOf(svcObj) + if svcType.Kind() != reflect.Ptr { + return fmt.Errorf("service object %q must be a pointer", serviceName) + } + svcType = svcType.Elem() + if svcType.Kind() != reflect.Struct { + return fmt.Errorf("service object %q must be a ptr to struct", serviceName) + } + for idx := 0; idx < svcType.NumMethod(); idx++ { + method := svcType.Method(idx) + if strings.HasSuffix(method.Name, "_Meta") { + err := validateServiceMetaMethod(serviceName, method) + if err != nil { + return err + } + } + if err := validateServiceMethod(serviceName, method); err != nil { + return err + } + } + return nil +} + +func ValidateServiceMap() error { + for svcName, svcObj := range ServiceMap { + if err := ValidateService(svcName, svcObj); err != nil { + return err + } + } + return nil +} diff --git a/pkg/service/servicemeta/servicemeta.go b/pkg/service/servicemeta/servicemeta.go new file mode 100644 index 00000000..a6a59fa2 --- /dev/null +++ b/pkg/service/servicemeta/servicemeta.go @@ -0,0 +1,10 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package servicemeta + +type MethodMeta struct { + Desc string + ArgNames []string + ReturnDesc string +} diff --git a/pkg/shellexec/shellexec.go b/pkg/shellexec/shellexec.go index 890f946c..5cd8089f 100644 --- a/pkg/shellexec/shellexec.go +++ b/pkg/shellexec/shellexec.go @@ -38,6 +38,7 @@ func StartShellProc(termSize TermSize) (*ShellProc, error) { shellPath := shellutil.DetectLocalShellPath() ecmd := exec.Command(shellPath, "-i", "-l") ecmd.Env = os.Environ() + ecmd.Dir = wavebase.GetHomeDir() envToAdd := shellutil.WaveshellEnvVars(shellutil.DefaultTermType) if os.Getenv("LANG") == "" { envToAdd["LANG"] = wavebase.DetermineLang() diff --git a/pkg/tsgen/tsgen.go b/pkg/tsgen/tsgen.go new file mode 100644 index 00000000..4d794bc1 --- /dev/null +++ b/pkg/tsgen/tsgen.go @@ -0,0 +1,354 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package tsgen + +import ( + "bytes" + "context" + "fmt" + "reflect" + "strings" + + "github.com/wavetermdev/thenextwave/pkg/eventbus" + "github.com/wavetermdev/thenextwave/pkg/service" + "github.com/wavetermdev/thenextwave/pkg/service/servicemeta" + "github.com/wavetermdev/thenextwave/pkg/waveobj" + "github.com/wavetermdev/thenextwave/pkg/wstore" +) + +var contextRType = reflect.TypeOf((*context.Context)(nil)).Elem() +var errorRType = reflect.TypeOf((*error)(nil)).Elem() +var anyRType = reflect.TypeOf((*interface{})(nil)).Elem() +var metaRType = reflect.TypeOf((*map[string]any)(nil)).Elem() +var uiContextRType = reflect.TypeOf((*wstore.UIContext)(nil)).Elem() +var waveObjRType = reflect.TypeOf((*waveobj.WaveObj)(nil)).Elem() +var updatesRtnRType = reflect.TypeOf(wstore.UpdatesRtnType{}) + +func generateTSMethodTypes(method reflect.Method, tsTypesMap map[reflect.Type]string) error { + for idx := 1; idx < method.Type.NumIn(); idx++ { + // skip receiver + inType := method.Type.In(idx) + GenerateTSType(inType, tsTypesMap) + } + for idx := 0; idx < method.Type.NumOut(); idx++ { + outType := method.Type.Out(idx) + GenerateTSType(outType, tsTypesMap) + } + return nil +} + +func getTSFieldName(field reflect.StructField) string { + jsonTag := field.Tag.Get("json") + if jsonTag != "" { + parts := strings.Split(jsonTag, ",") + namePart := parts[0] + if namePart != "" { + if namePart == "-" { + return "" + } + return namePart + } + // if namePart is empty, still uses default + } + return field.Name +} + +func isFieldOmitEmpty(field reflect.StructField) bool { + jsonTag := field.Tag.Get("json") + if jsonTag != "" { + parts := strings.Split(jsonTag, ",") + if len(parts) > 1 { + for _, part := range parts[1:] { + if part == "omitempty" { + return true + } + } + } + } + return false +} + +func TypeToTSType(t reflect.Type) (string, []reflect.Type) { + switch t.Kind() { + case reflect.String: + return "string", nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + return "number", nil + case reflect.Bool: + return "boolean", nil + case reflect.Slice, reflect.Array: + elemType, subTypes := TypeToTSType(t.Elem()) + if elemType == "" { + return "", nil + } + return fmt.Sprintf("%s[]", elemType), subTypes + case reflect.Map: + if t.Key().Kind() != reflect.String { + return "", nil + } + if t == metaRType { + return "MetaType", nil + } + elemType, subTypes := TypeToTSType(t.Elem()) + if elemType == "" { + return "", nil + } + return fmt.Sprintf("{[key: string]: %s}", elemType), subTypes + case reflect.Struct: + return t.Name(), []reflect.Type{t} + case reflect.Ptr: + return TypeToTSType(t.Elem()) + case reflect.Interface: + if t == waveObjRType { + return "WaveObj", nil + } + return "any", nil + default: + return "", nil + } +} + +var tsRenameMap = map[string]string{ + "Window": "WaveWindow", +} + +func generateTSTypeInternal(rtype reflect.Type) (string, []reflect.Type) { + var buf bytes.Buffer + waveObjType := reflect.TypeOf((*waveobj.WaveObj)(nil)).Elem() + tsTypeName := rtype.Name() + if tsRename, ok := tsRenameMap[tsTypeName]; ok { + tsTypeName = tsRename + } + var isWaveObj bool + buf.WriteString(fmt.Sprintf("// %s\n", rtype.String())) + if rtype.Implements(waveObjType) || reflect.PointerTo(rtype).Implements(waveObjType) { + isWaveObj = true + buf.WriteString(fmt.Sprintf("type %s = WaveObj & {\n", tsTypeName)) + } else { + buf.WriteString(fmt.Sprintf("type %s = {\n", tsTypeName)) + } + var subTypes []reflect.Type + for i := 0; i < rtype.NumField(); i++ { + field := rtype.Field(i) + if field.PkgPath != "" { + continue + } + fieldName := getTSFieldName(field) + if fieldName == "" { + continue + } + if isWaveObj && (fieldName == waveobj.OTypeKeyName || fieldName == waveobj.OIDKeyName || fieldName == waveobj.VersionKeyName) { + continue + } + optMarker := "" + if isFieldOmitEmpty(field) { + optMarker = "?" + } + tsTypeTag := field.Tag.Get("tstype") + if tsTypeTag != "" { + buf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsTypeTag)) + continue + } + tsType, fieldSubTypes := TypeToTSType(field.Type) + if tsType == "" { + continue + } + subTypes = append(subTypes, fieldSubTypes...) + if tsType == "UIContext" { + optMarker = "?" + } + buf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsType)) + } + buf.WriteString("};\n") + return buf.String(), subTypes +} + +func GenerateWaveObjTSType() string { + var buf bytes.Buffer + buf.WriteString("// waveobj.WaveObj\n") + buf.WriteString("type WaveObj = {\n") + buf.WriteString(" otype: string;\n") + buf.WriteString(" oid: string;\n") + buf.WriteString(" version: number;\n") + buf.WriteString("};\n") + return buf.String() +} + +func GenerateMetaType() string { + return "type MetaType = {[key: string]: any}\n" + +} + +func GenerateTSType(rtype reflect.Type, tsTypesMap map[reflect.Type]string) { + if rtype == nil { + return + } + if rtype == metaRType { + tsTypesMap[metaRType] = GenerateMetaType() + return + } + if rtype == contextRType || rtype == errorRType || rtype == anyRType { + return + } + if rtype.Kind() == reflect.Slice { + rtype = rtype.Elem() + } + if rtype.Kind() == reflect.Map { + rtype = rtype.Elem() + } + if rtype.Kind() == reflect.Ptr { + rtype = rtype.Elem() + } + if _, ok := tsTypesMap[rtype]; ok { + return + } + if rtype == waveObjRType { + tsTypesMap[rtype] = GenerateWaveObjTSType() + return + } + if rtype.Kind() != reflect.Struct { + return + } + tsType, subTypes := generateTSTypeInternal(rtype) + tsTypesMap[rtype] = tsType + for _, subType := range subTypes { + GenerateTSType(subType, tsTypesMap) + } +} + +func hasUpdatesReturn(method reflect.Method) bool { + for idx := 0; idx < method.Type.NumOut(); idx++ { + outType := method.Type.Out(idx) + if outType == updatesRtnRType { + return true + } + } + return false +} + +func GenerateMethodSignature(serviceName string, method reflect.Method, meta servicemeta.MethodMeta, isFirst bool) string { + var sb strings.Builder + mayReturnUpdates := hasUpdatesReturn(method) + if (meta.Desc != "" || meta.ReturnDesc != "" || mayReturnUpdates) && !isFirst { + sb.WriteString("\n") + } + if meta.Desc != "" { + sb.WriteString(fmt.Sprintf(" // %s\n", meta.Desc)) + } + if mayReturnUpdates || meta.ReturnDesc != "" { + if mayReturnUpdates && meta.ReturnDesc != "" { + sb.WriteString(fmt.Sprintf(" // @returns %s (and object updates)\n", meta.ReturnDesc)) + } else if mayReturnUpdates { + sb.WriteString(" // @returns object updates\n") + } else { + sb.WriteString(fmt.Sprintf(" // @returns %s\n", meta.ReturnDesc)) + } + } + sb.WriteString(" ") + sb.WriteString(method.Name) + sb.WriteString("(") + wroteArg := false + // skip first arg, which is the receiver + for idx := 1; idx < method.Type.NumIn(); idx++ { + if wroteArg { + sb.WriteString(", ") + } + inType := method.Type.In(idx) + if inType == contextRType || inType == uiContextRType { + continue + } + tsTypeName, _ := TypeToTSType(inType) + var argName string + if idx-1 < len(meta.ArgNames) { + argName = meta.ArgNames[idx-1] // subtract 1 for receiver + } else { + argName = fmt.Sprintf("arg%d", idx) + } + sb.WriteString(fmt.Sprintf("%s: %s", argName, tsTypeName)) + wroteArg = true + } + sb.WriteString("): ") + wroteRtn := false + for idx := 0; idx < method.Type.NumOut(); idx++ { + outType := method.Type.Out(idx) + if outType == errorRType { + continue + } + if outType == updatesRtnRType { + continue + } + tsTypeName, _ := TypeToTSType(outType) + sb.WriteString(fmt.Sprintf("Promise<%s>", tsTypeName)) + wroteRtn = true + } + if !wroteRtn { + sb.WriteString("Promise") + } + sb.WriteString(" {\n") + return sb.String() +} + +func GenerateMethodBody(serviceName string, method reflect.Method, meta servicemeta.MethodMeta) string { + return fmt.Sprintf(" return WOS.callBackendService(%q, %q, Array.from(arguments))\n", serviceName, method.Name) +} + +func GenerateServiceClass(serviceName string, serviceObj any) string { + serviceType := reflect.TypeOf(serviceObj) + var sb strings.Builder + tsServiceName := serviceType.Elem().Name() + sb.WriteString(fmt.Sprintf("// %s (%s)\n", serviceType.Elem().String(), serviceName)) + sb.WriteString("class ") + sb.WriteString(tsServiceName + "Type") + sb.WriteString(" {\n") + isFirst := true + for midx := 0; midx < serviceType.NumMethod(); midx++ { + method := serviceType.Method(midx) + if strings.HasSuffix(method.Name, "_Meta") { + continue + } + var meta servicemeta.MethodMeta + metaMethod, found := serviceType.MethodByName(method.Name + "_Meta") + if found { + serviceObjVal := reflect.ValueOf(serviceObj) + metaVal := metaMethod.Func.Call([]reflect.Value{serviceObjVal}) + meta = metaVal[0].Interface().(servicemeta.MethodMeta) + } + sb.WriteString(GenerateMethodSignature(serviceName, method, meta, isFirst)) + sb.WriteString(GenerateMethodBody(serviceName, method, meta)) + sb.WriteString(" }\n") + isFirst = false + } + sb.WriteString("}\n\n") + sb.WriteString(fmt.Sprintf("export const %s = new %sType()\n", tsServiceName, tsServiceName)) + return sb.String() +} + +func GenerateWaveObjTypes(tsTypesMap map[reflect.Type]string) { + GenerateTSType(reflect.TypeOf(waveobj.ORef{}), tsTypesMap) + GenerateTSType(reflect.TypeOf((*waveobj.WaveObj)(nil)).Elem(), tsTypesMap) + GenerateTSType(reflect.TypeOf(map[string]any{}), tsTypesMap) + GenerateTSType(reflect.TypeOf(service.WebCallType{}), tsTypesMap) + GenerateTSType(reflect.TypeOf(service.WebReturnType{}), tsTypesMap) + GenerateTSType(reflect.TypeOf(wstore.UIContext{}), tsTypesMap) + GenerateTSType(reflect.TypeOf(eventbus.WSEventType{}), tsTypesMap) + for _, rtype := range wstore.AllWaveObjTypes() { + GenerateTSType(rtype, tsTypesMap) + } +} + +func GenerateServiceTypes(tsTypesMap map[reflect.Type]string) error { + for _, serviceObj := range service.ServiceMap { + serviceType := reflect.TypeOf(serviceObj) + for midx := 0; midx < serviceType.NumMethod(); midx++ { + method := serviceType.Method(midx) + err := generateTSMethodTypes(method, tsTypesMap) + if err != nil { + return fmt.Errorf("error generating TS method types for %s.%s: %v", serviceType, method.Name, err) + } + } + } + return nil +} diff --git a/pkg/util/utilfn/utilfn.go b/pkg/util/utilfn/utilfn.go index f37ac6ad..69bd63ba 100644 --- a/pkg/util/utilfn/utilfn.go +++ b/pkg/util/utilfn/utilfn.go @@ -710,3 +710,29 @@ func StructToJsonMap(v interface{}) (map[string]any, error) { } return m, nil } + +func IndentString(indent string, str string) string { + splitArr := strings.Split(str, "\n") + var rtn strings.Builder + for _, line := range splitArr { + if line == "" { + rtn.WriteByte('\n') + continue + } + rtn.WriteString(indent) + rtn.WriteString(line) + rtn.WriteByte('\n') + } + return rtn.String() +} + +func PrintIndentedStr(indent string, str string) { + splitArr := strings.Split(str, "\n") + for _, line := range splitArr { + if line == "" { + fmt.Printf("\n") + continue + } + fmt.Printf("%s%s\n", indent, line) + } +} diff --git a/pkg/waveobj/waveobj.go b/pkg/waveobj/waveobj.go index fac10a89..99395886 100644 --- a/pkg/waveobj/waveobj.go +++ b/pkg/waveobj/waveobj.go @@ -32,6 +32,13 @@ func (oref ORef) String() string { return fmt.Sprintf("%s:%s", oref.OType, oref.OID) } +func MakeORef(otype string, oid string) ORef { + return ORef{ + OType: otype, + OID: oid, + } +} + type WaveObj interface { GetOType() string // should not depend on object state (should work with nil value) } @@ -155,6 +162,18 @@ func SetMeta(waveObj WaveObj, meta map[string]any) { reflect.ValueOf(waveObj).Elem().FieldByIndex(desc.MetaField.Index).Set(reflect.ValueOf(meta)) } +func DoMapStucture(out any, input any) error { + dconfig := &mapstructure.DecoderConfig{ + Result: out, + TagName: "json", + } + decoder, err := mapstructure.NewDecoder(dconfig) + if err != nil { + return err + } + return decoder.Decode(input) +} + func ToJsonMap(w WaveObj) (map[string]any, error) { if w == nil { return nil, nil @@ -227,7 +246,13 @@ func ORefFromMap(m map[string]any) (*ORef, error) { return nil, err } return &oref, nil +} +func ORefFromWaveObj(w WaveObj) *ORef { + return &ORef{ + OType: w.GetOType(), + OID: GetOID(w), + } } func FromJsonGen[T WaveObj](data []byte) (T, error) { diff --git a/pkg/waveobj/waveobj_gen.go b/pkg/waveobj/waveobj_gen.go deleted file mode 100644 index a27bf37c..00000000 --- a/pkg/waveobj/waveobj_gen.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2024, Command Line Inc. -// SPDX-License-Identifier: Apache-2.0 - -package waveobj - -import ( - "bytes" - "fmt" - "reflect" - "strings" -) - -func getTSFieldName(field reflect.StructField) string { - jsonTag := field.Tag.Get("json") - if jsonTag != "" { - parts := strings.Split(jsonTag, ",") - namePart := parts[0] - if namePart != "" { - if namePart == "-" { - return "" - } - return namePart - } - // if namePart is empty, still uses default - } - return field.Name -} - -func isFieldOmitEmpty(field reflect.StructField) bool { - jsonTag := field.Tag.Get("json") - if jsonTag != "" { - parts := strings.Split(jsonTag, ",") - if len(parts) > 1 { - for _, part := range parts[1:] { - if part == "omitempty" { - return true - } - } - } - } - return false -} - -func typeToTSType(t reflect.Type) (string, []reflect.Type) { - switch t.Kind() { - case reflect.String: - return "string", nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - return "number", nil - case reflect.Bool: - return "boolean", nil - case reflect.Slice, reflect.Array: - elemType, subTypes := typeToTSType(t.Elem()) - if elemType == "" { - return "", nil - } - return fmt.Sprintf("%s[]", elemType), subTypes - case reflect.Map: - if t.Key().Kind() != reflect.String { - return "", nil - } - elemType, subTypes := typeToTSType(t.Elem()) - if elemType == "" { - return "", nil - } - return fmt.Sprintf("{[key: string]: %s}", elemType), subTypes - case reflect.Struct: - return t.Name(), []reflect.Type{t} - case reflect.Ptr: - return typeToTSType(t.Elem()) - case reflect.Interface: - return "any", nil - default: - return "", nil - } -} - -var tsRenameMap = map[string]string{ - "Window": "WaveWindow", -} - -func generateTSTypeInternal(rtype reflect.Type) (string, []reflect.Type) { - var buf bytes.Buffer - waveObjType := reflect.TypeOf((*WaveObj)(nil)).Elem() - tsTypeName := rtype.Name() - if tsRename, ok := tsRenameMap[tsTypeName]; ok { - tsTypeName = tsRename - } - var isWaveObj bool - if rtype.Implements(waveObjType) || reflect.PointerTo(rtype).Implements(waveObjType) { - isWaveObj = true - buf.WriteString(fmt.Sprintf("type %s = WaveObj & {\n", tsTypeName)) - } else { - buf.WriteString(fmt.Sprintf("type %s = {\n", tsTypeName)) - } - var subTypes []reflect.Type - for i := 0; i < rtype.NumField(); i++ { - field := rtype.Field(i) - if field.PkgPath != "" { - continue - } - fieldName := getTSFieldName(field) - if fieldName == "" { - continue - } - if isWaveObj && (fieldName == OTypeKeyName || fieldName == OIDKeyName || fieldName == VersionKeyName) { - continue - } - optMarker := "" - if isFieldOmitEmpty(field) { - optMarker = "?" - } - tsTypeTag := field.Tag.Get("tstype") - if tsTypeTag != "" { - buf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsTypeTag)) - continue - } - tsType, fieldSubTypes := typeToTSType(field.Type) - if tsType == "" { - continue - } - subTypes = append(subTypes, fieldSubTypes...) - buf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsType)) - } - buf.WriteString("};\n") - return buf.String(), subTypes -} - -func GenerateWaveObjTSType() string { - var buf bytes.Buffer - buf.WriteString("type WaveObj = {\n") - buf.WriteString(" otype: string;\n") - buf.WriteString(" oid: string;\n") - buf.WriteString(" version: number;\n") - buf.WriteString("};\n") - return buf.String() -} - -func GenerateTSType(rtype reflect.Type, tsTypesMap map[reflect.Type]string) { - if rtype == nil { - return - } - if rtype.Kind() == reflect.Ptr { - rtype = rtype.Elem() - } - if _, ok := tsTypesMap[rtype]; ok { - return - } - if rtype == waveObjRType { - tsTypesMap[rtype] = GenerateWaveObjTSType() - return - } - tsType, subTypes := generateTSTypeInternal(rtype) - tsTypesMap[rtype] = tsType - for _, subType := range subTypes { - GenerateTSType(subType, tsTypesMap) - } -} diff --git a/pkg/waveobj/waveobj_test.go b/pkg/waveobj/waveobj_test.go deleted file mode 100644 index d7db8059..00000000 --- a/pkg/waveobj/waveobj_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2024, Command Line Inc. -// SPDX-License-Identifier: Apache-2.0 - -package waveobj - -import ( - "log" - "reflect" - "testing" -) - -type TestBlock struct { - BlockId string `json:"blockid" waveobj:"oid"` - Name string `json:"name"` -} - -func (TestBlock) GetOType() string { - return "block" -} - -func TestGenerate(t *testing.T) { - log.Printf("Testing Generate\n") - tsMap := make(map[reflect.Type]string) - var waveObj WaveObj - GenerateTSType(reflect.TypeOf(&waveObj).Elem(), tsMap) - GenerateTSType(reflect.TypeOf(TestBlock{}), tsMap) - for k, v := range tsMap { - log.Printf("Type: %v, TS:\n%s\n", k, v) - } -} diff --git a/pkg/web/web.go b/pkg/web/web.go new file mode 100644 index 00000000..de512c5e --- /dev/null +++ b/pkg/web/web.go @@ -0,0 +1,217 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package web + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "io/fs" + "log" + "net/http" + "runtime/debug" + "time" + + "github.com/google/uuid" + "github.com/gorilla/mux" + "github.com/wavetermdev/thenextwave/pkg/filestore" + "github.com/wavetermdev/thenextwave/pkg/service" + "github.com/wavetermdev/thenextwave/pkg/wavebase" +) + +type WebFnType = func(http.ResponseWriter, *http.Request) + +// Header constants +const ( + CacheControlHeaderKey = "Cache-Control" + CacheControlHeaderNoCache = "no-cache" + + ContentTypeHeaderKey = "Content-Type" + ContentTypeJson = "application/json" + ContentTypeBinary = "application/octet-stream" + + ContentLengthHeaderKey = "Content-Length" + LastModifiedHeaderKey = "Last-Modified" + + WaveZoneFileInfoHeaderKey = "X-ZoneFileInfo" +) + +const HttpReadTimeout = 5 * time.Second +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 + +type WebFnOpts struct { + AllowCaching bool + JsonErrors bool +} + +func handleService(w http.ResponseWriter, r *http.Request) { + bodyData, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "Unable to read request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + if r.Method != http.MethodPost { + http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) + return + } + var webCall service.WebCallType + err = json.Unmarshal(bodyData, &webCall) + if err != nil { + http.Error(w, fmt.Sprintf("invalid request body: %v", err), http.StatusBadRequest) + } + + rtn := service.CallService(r.Context(), webCall) + jsonRtn, err := json.Marshal(rtn) + if err != nil { + http.Error(w, fmt.Sprintf("error serializing response: %v", err), http.StatusInternalServerError) + } + w.Header().Set(ContentTypeHeaderKey, ContentTypeJson) + w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", len(jsonRtn))) + w.WriteHeader(http.StatusOK) + w.Write(jsonRtn) +} + +func marshalReturnValue(data any, err error) []byte { + var mapRtn = make(map[string]any) + if err != nil { + mapRtn["error"] = err.Error() + } else { + mapRtn["success"] = true + mapRtn["data"] = data + } + rtn, err := json.Marshal(mapRtn) + if err != nil { + return marshalReturnValue(nil, fmt.Errorf("error serializing response: %v", err)) + } + return rtn +} + +func handleWaveFile(w http.ResponseWriter, r *http.Request) { + zoneId := r.URL.Query().Get("zoneid") + name := r.URL.Query().Get("name") + if _, err := uuid.Parse(zoneId); err != nil { + http.Error(w, fmt.Sprintf("invalid zoneid: %v", err), http.StatusBadRequest) + return + } + if name == "" { + http.Error(w, "name is required", http.StatusBadRequest) + return + + } + file, err := filestore.WFS.Stat(r.Context(), zoneId, name) + if err == fs.ErrNotExist { + http.NotFound(w, r) + return + } + if err != nil { + http.Error(w, fmt.Sprintf("error getting file info: %v", err), http.StatusInternalServerError) + return + } + jsonFileBArr, err := json.Marshal(file) + if err != nil { + http.Error(w, fmt.Sprintf("error serializing file info: %v", err), http.StatusInternalServerError) + } + // can make more efficient by checking modtime + If-Modified-Since headers to allow caching + w.Header().Set(ContentTypeHeaderKey, ContentTypeBinary) + w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", file.Size)) + w.Header().Set(WaveZoneFileInfoHeaderKey, base64.StdEncoding.EncodeToString(jsonFileBArr)) + w.Header().Set(LastModifiedHeaderKey, time.UnixMilli(file.ModTs).UTC().Format(http.TimeFormat)) + if file.Size == 0 { + w.WriteHeader(http.StatusOK) + return + } + for offset := file.DataStartIdx(); offset < file.Size; offset += filestore.DefaultPartDataSize { + _, data, err := filestore.WFS.ReadAt(r.Context(), zoneId, name, offset, filestore.DefaultPartDataSize) + if err != nil { + if offset == 0 { + http.Error(w, fmt.Sprintf("error reading file: %v", err), http.StatusInternalServerError) + } else { + // nothing to do, the headers have already been sent + log.Printf("error reading file %s/%s @ %d: %v\n", zoneId, name, offset, err) + } + return + } + w.Write(data) + } +} + +func handleStreamFile(w http.ResponseWriter, r *http.Request) { + fileName := r.URL.Query().Get("path") + fileName = wavebase.ExpandHomeDir(fileName) + http.ServeFile(w, r, fileName) +} + +func WebFnWrap(opts WebFnOpts, fn WebFnType) WebFnType { + return func(w http.ResponseWriter, r *http.Request) { + defer func() { + recErr := recover() + if recErr == nil { + return + } + panicStr := fmt.Sprintf("panic: %v", recErr) + log.Printf("panic: %v\n", recErr) + debug.PrintStack() + if opts.JsonErrors { + jsonRtn := marshalReturnValue(nil, fmt.Errorf(panicStr)) + w.Header().Set(ContentTypeHeaderKey, ContentTypeJson) + w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", len(jsonRtn))) + w.WriteHeader(http.StatusOK) + w.Write(jsonRtn) + } else { + http.Error(w, panicStr, http.StatusInternalServerError) + } + }() + if !opts.AllowCaching { + w.Header().Set(CacheControlHeaderKey, CacheControlHeaderNoCache) + } + // reqAuthKey := r.Header.Get("X-AuthKey") + // if reqAuthKey == "" { + // w.WriteHeader(http.StatusInternalServerError) + // w.Write([]byte("no x-authkey header")) + // return + // } + // if reqAuthKey != scbase.WaveAuthKey { + // w.WriteHeader(http.StatusInternalServerError) + // w.Write([]byte("x-authkey header is invalid")) + // return + // } + fn(w, r) + } +} + +// blocking +// TODO: create listener separately and use http.Serve, so we can signal SIGUSR1 in a better way +func RunWebServer() { + gr := mux.NewRouter() + 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)) + serverAddr := MainServerAddr + if wavebase.IsDevMode() { + serverAddr = MainServerDevAddr + } + server := &http.Server{ + Addr: serverAddr, + ReadTimeout: HttpReadTimeout, + WriteTimeout: HttpWriteTimeout, + MaxHeaderBytes: HttpMaxHeaderBytes, + Handler: http.TimeoutHandler(gr, HttpTimeoutDuration, "Timeout"), + } + log.Printf("Running main server on %s\n", serverAddr) + err := server.ListenAndServe() + if err != nil { + log.Printf("ERROR: %v\n", err) + } +} diff --git a/pkg/web/ws.go b/pkg/web/ws.go new file mode 100644 index 00000000..cdf67ec0 --- /dev/null +++ b/pkg/web/ws.go @@ -0,0 +1,215 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package web + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "runtime/debug" + "sync" + "time" + + "github.com/google/uuid" + "github.com/gorilla/mux" + "github.com/gorilla/websocket" + "github.com/wavetermdev/thenextwave/pkg/eventbus" +) + +const wsReadWaitTimeout = 15 * time.Second +const wsWriteWaitTimeout = 10 * time.Second +const wsPingPeriodTickTime = 10 * time.Second +const wsInitialPingTime = 1 * time.Second + +func RunWebSocketServer() { + 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() + if err != nil { + log.Printf("[error] trying to run websocket server: %v\n", err) + } +} + +var WebSocketUpgrader = websocket.Upgrader{ + ReadBufferSize: 4 * 1024, + WriteBufferSize: 32 * 1024, + HandshakeTimeout: 1 * time.Second, + CheckOrigin: func(r *http.Request) bool { return true }, +} + +func HandleWs(w http.ResponseWriter, r *http.Request) { + err := HandleWsInternal(w, r) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +func getMessageType(jmsg map[string]any) string { + if str, ok := jmsg["type"].(string); ok { + return str + } + return "" +} + +func getStringFromMap(jmsg map[string]any, key string) string { + if str, ok := jmsg[key].(string); ok { + return str + } + return "" +} + +func processMessage(jmsg map[string]any, outputCh chan any) { + msgType := getMessageType(jmsg) + if msgType != "rpc" { + return + } + reqId := getStringFromMap(jmsg, "reqid") + var rtnErr error + defer func() { + r := recover() + if r != nil { + rtnErr = fmt.Errorf("panic: %v", r) + log.Printf("panic in processMessage: %v\n", r) + debug.PrintStack() + } + if rtnErr == nil { + return + } + rtn := map[string]any{"type": "rpcresp", "reqid": reqId, "error": rtnErr.Error()} + outputCh <- rtn + }() + method := getStringFromMap(jmsg, "method") + rtnErr = fmt.Errorf("unknown method %q", method) +} + +func ReadLoop(conn *websocket.Conn, outputCh chan any, closeCh chan any) { + readWait := wsReadWaitTimeout + conn.SetReadLimit(64 * 1024) + conn.SetReadDeadline(time.Now().Add(readWait)) + defer close(closeCh) + for { + _, message, err := conn.ReadMessage() + if err != nil { + log.Printf("ReadPump error: %v\n", err) + break + } + jmsg := map[string]any{} + err = json.Unmarshal(message, &jmsg) + if err != nil { + log.Printf("Error unmarshalling json: %v\n", err) + break + } + conn.SetReadDeadline(time.Now().Add(readWait)) + msgType := getMessageType(jmsg) + if msgType == "pong" { + // nothing + continue + } + if msgType == "ping" { + now := time.Now() + pongMessage := map[string]interface{}{"type": "pong", "stime": now.UnixMilli()} + outputCh <- pongMessage + continue + } + go processMessage(jmsg, outputCh) + } +} + +func WritePing(conn *websocket.Conn) error { + now := time.Now() + pingMessage := map[string]interface{}{"type": "ping", "stime": now.UnixMilli()} + jsonVal, _ := json.Marshal(pingMessage) + _ = conn.SetWriteDeadline(time.Now().Add(wsWriteWaitTimeout)) // no error + err := conn.WriteMessage(websocket.TextMessage, jsonVal) + if err != nil { + return err + } + return nil +} + +func WriteLoop(conn *websocket.Conn, outputCh chan any, closeCh chan any) { + ticker := time.NewTicker(wsInitialPingTime) + defer ticker.Stop() + initialPing := true + for { + select { + case msg := <-outputCh: + var barr []byte + var err error + if _, ok := msg.([]byte); ok { + barr = msg.([]byte) + } else { + barr, err = json.Marshal(msg) + if err != nil { + log.Printf("cannot marshal websocket message: %v\n", err) + // just loop again + break + } + } + err = conn.WriteMessage(websocket.TextMessage, barr) + if err != nil { + conn.Close() + log.Printf("WritePump error: %v\n", err) + return + } + + case <-ticker.C: + err := WritePing(conn) + if err != nil { + log.Printf("WritePump error: %v\n", err) + return + } + if initialPing { + initialPing = false + ticker.Reset(wsPingPeriodTickTime) + } + + case <-closeCh: + return + } + } +} + +func HandleWsInternal(w http.ResponseWriter, r *http.Request) error { + windowId := r.URL.Query().Get("windowid") + if windowId == "" { + return fmt.Errorf("windowid is required") + } + conn, err := WebSocketUpgrader.Upgrade(w, r, nil) + if err != nil { + return fmt.Errorf("WebSocket Upgrade Failed: %v", err) + } + defer conn.Close() + wsConnId := uuid.New().String() + log.Printf("New websocket connection: windowid:%s connid:%s\n", windowId, wsConnId) + outputCh := make(chan any, 100) + closeCh := make(chan any) + eventbus.RegisterWSChannel(wsConnId, windowId, outputCh) + defer eventbus.UnregisterWSChannel(wsConnId) + wg := &sync.WaitGroup{} + wg.Add(2) + go func() { + // read loop + defer wg.Done() + ReadLoop(conn, outputCh, closeCh) + }() + go func() { + // write loop + defer wg.Done() + WriteLoop(conn, outputCh, closeCh) + }() + wg.Wait() + return nil +} diff --git a/pkg/wstore/wstore.go b/pkg/wstore/wstore.go index 24747dd3..7815ca13 100644 --- a/pkg/wstore/wstore.go +++ b/pkg/wstore/wstore.go @@ -16,6 +16,8 @@ import ( var waveObjUpdateKey = struct{}{} +type UpdatesRtnType = []WaveObjUpdate + func init() { for _, rtype := range AllWaveObjTypes() { waveobj.RegisterType(rtype) @@ -67,6 +69,18 @@ func ContextGetUpdates(ctx context.Context) map[waveobj.ORef]WaveObjUpdate { return rtn } +func ContextGetUpdatesRtn(ctx context.Context) UpdatesRtnType { + updatesMap := ContextGetUpdates(ctx) + if updatesMap == nil { + return nil + } + rtn := make(UpdatesRtnType, 0, len(updatesMap)) + for _, v := range updatesMap { + rtn = append(rtn, v) + } + return rtn +} + func ContextGetUpdate(ctx context.Context, oref waveobj.ORef) *WaveObjUpdate { updatesVal := ctx.Value(waveObjUpdateKey) if updatesVal == nil { diff --git a/pkg/wstore/wstore_dbops.go b/pkg/wstore/wstore_dbops.go index 9536fdcd..43e61984 100644 --- a/pkg/wstore/wstore_dbops.go +++ b/pkg/wstore/wstore_dbops.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/wavetermdev/thenextwave/pkg/waveobj" + "github.com/wavetermdev/waveterm/wavesrv/pkg/dbutil" ) var ErrNotFound = fmt.Errorf("not found") @@ -121,7 +122,7 @@ func dbSelectOIDs(ctx context.Context, otype string, oids []string) ([]waveobj.W table := tableNameFromOType(otype) query := fmt.Sprintf("SELECT oid, version, data FROM %s WHERE oid IN (SELECT value FROM json_each(?))", table) var rows []idDataType - tx.Select(&rows, query, oids) + tx.Select(&rows, query, dbutil.QuickJson(oids)) rtn := make([]waveobj.WaveObj, 0, len(rows)) for _, row := range rows { waveObj, err := waveobj.FromJson(row.Data) diff --git a/pkg/wstore/wstore_types.go b/pkg/wstore/wstore_types.go index 356e5626..d408f81e 100644 --- a/pkg/wstore/wstore_types.go +++ b/pkg/wstore/wstore_types.go @@ -5,6 +5,7 @@ package wstore import ( "encoding/json" + "fmt" "reflect" "github.com/wavetermdev/thenextwave/pkg/shellexec" @@ -52,6 +53,65 @@ func (update WaveObjUpdate) MarshalJSON() ([]byte, error) { return json.Marshal(rtn) } +func MakeUpdate(obj waveobj.WaveObj) WaveObjUpdate { + return WaveObjUpdate{ + UpdateType: UpdateType_Update, + OType: obj.GetOType(), + OID: waveobj.GetOID(obj), + Obj: obj, + } +} + +func MakeUpdates(objs []waveobj.WaveObj) []WaveObjUpdate { + rtn := make([]WaveObjUpdate, 0, len(objs)) + for _, obj := range objs { + rtn = append(rtn, MakeUpdate(obj)) + } + return rtn +} + +func (update *WaveObjUpdate) UnmarshalJSON(data []byte) error { + var objMap map[string]any + err := json.Unmarshal(data, &objMap) + if err != nil { + return err + } + var ok1, ok2, ok3 bool + if _, found := objMap["updatetype"]; !found { + return fmt.Errorf("missing updatetype (in WaveObjUpdate)") + } + update.UpdateType, ok1 = objMap["updatetype"].(string) + if !ok1 { + return fmt.Errorf("in WaveObjUpdate bad updatetype type %T", objMap["updatetype"]) + } + if _, found := objMap["otype"]; !found { + return fmt.Errorf("missing otype (in WaveObjUpdate)") + } + update.OType, ok2 = objMap["otype"].(string) + if !ok2 { + return fmt.Errorf("in WaveObjUpdate bad otype type %T", objMap["otype"]) + } + if _, found := objMap["oid"]; !found { + return fmt.Errorf("missing oid (in WaveObjUpdate)") + } + update.OID, ok3 = objMap["oid"].(string) + if !ok3 { + return fmt.Errorf("in WaveObjUpdate bad oid type %T", objMap["oid"]) + } + if _, found := objMap["obj"]; found { + objMap, ok := objMap["obj"].(map[string]any) + if !ok { + return fmt.Errorf("in WaveObjUpdate bad obj type %T", objMap["obj"]) + } + waveObj, err := waveobj.FromJsonMap(objMap) + if err != nil { + return fmt.Errorf("in WaveObjUpdate error decoding obj: %w", err) + } + update.Obj = waveObj + } + return nil +} + type Client struct { OID string `json:"oid"` Version int `json:"version"` @@ -106,6 +166,14 @@ func (*Tab) GetOType() string { return OType_Tab } +func (t *Tab) GetBlockORefs() []waveobj.ORef { + rtn := make([]waveobj.ORef, 0, len(t.BlockIds)) + for _, blockId := range t.BlockIds { + rtn = append(rtn, waveobj.ORef{OType: OType_Block, OID: blockId}) + } + return rtn +} + type LayoutNode struct { OID string `json:"oid"` Version int `json:"version"` diff --git a/prettier.config.js b/prettier.config.js index 5d8d9a7a..3cfb47d5 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,8 +1,9 @@ /** @type {import("prettier").Config} */ -export default { +module.exports = { plugins: ["prettier-plugin-jsdoc", "prettier-plugin-organize-imports"], printWidth: 120, trailingComma: "es5", + useTabs: false, jsdocVerticalAlignment: true, jsdocSeparateReturnsFromParam: true, jsdocSeparateTagGroups: true, diff --git a/public/index.html b/public/index.html index 3e68fbf1..5a61918a 100644 --- a/public/index.html +++ b/public/index.html @@ -5,12 +5,13 @@ Wails App - - - - - - + + + + + + +
diff --git a/tsconfig.json b/tsconfig.json index 05f554e8..3a32ff9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["frontend/**/*"], + "include": ["frontend/**/*", "emain/**/*"], "compilerOptions": { "target": "es6", "module": "commonjs", diff --git a/version.js b/version.js new file mode 100644 index 00000000..1884c00b --- /dev/null +++ b/version.js @@ -0,0 +1,5 @@ +const path = require("path"); +const packageJson = require(path.resolve(__dirname, "package.json")); + +const VERSION = `${packageJson.version}`; +module.exports = VERSION; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..801ab5f7 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,30 @@ +const { webDev, webProd } = require("./webpack/webpack.web.js"); +const { electronDev, electronProd } = require("./webpack/webpack.electron.js"); + +module.exports = (env) => { + if (env.prod) { + console.log("using PROD (web+electron) webpack environment"); + return [webProd, electronProd]; + } + if (env["prod:web"]) { + console.log("using PROD (web) webpack environment"); + return webProd; + } + if (env["prod:electron"]) { + console.log("using PROD (electron) webpack environment"); + return electronProd; + } + if (env.dev) { + console.log("using DEV (web+electron) webpack environment"); + return [webDev, electronDev]; + } + if (env["dev:web"]) { + console.log("using DEV (web) webpack environment"); + return webDev; + } + if (env["dev:electron"]) { + console.log("using DEV (electron) webpack environment"); + return electronDev; + } + console.log("must specify a webpack environment using --env [dev|prod]"); +}; diff --git a/webpack/webpack.electron.js b/webpack/webpack.electron.js new file mode 100644 index 00000000..131c80f0 --- /dev/null +++ b/webpack/webpack.electron.js @@ -0,0 +1,114 @@ +const webpack = require("webpack"); +const webpackMerge = require("webpack-merge"); +const path = require("path"); +const moment = require("dayjs"); +const VERSION = require("../version.js"); +const CopyPlugin = require("copy-webpack-plugin"); + +function makeBuildStr() { + let buildStr = moment().format("YYYYMMDD-HHmmss"); + // console.log("waveterm:electron " + VERSION + " build " + buildStr); + return buildStr; +} + +const BUILD = makeBuildStr(); + +var electronCommon = { + entry: { + emain: ["./emain/emain.ts"], + }, + target: "electron-main", + externals: { + fs: "require('fs')", + "fs-ext": "require('fs-ext')", + }, + devtool: "source-map", + module: { + rules: [ + { + test: /\.tsx?$/, + // exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: [ + [ + "@babel/preset-env", + { + targets: + "defaults and not ie > 0 and not op_mini all and not op_mob > 0 and not kaios > 0 and not and_qq > 0 and not and_uc > 0 and not baidu > 0", + }, + ], + "@babel/preset-react", + "@babel/preset-typescript", + ], + plugins: [ + ["@babel/transform-runtime", { regenerator: true }], + "@babel/plugin-transform-react-jsx", + ["@babel/plugin-proposal-decorators", { legacy: true }], + ["@babel/plugin-proposal-class-properties", { loose: true }], + ["@babel/plugin-proposal-private-methods", { loose: true }], + ["@babel/plugin-proposal-private-property-in-object", { loose: true }], + "babel-plugin-jsx-control-statements", + ], + }, + }, + }, + ], + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + alias: { + "@/app": path.resolve(__dirname, "../src/app/"), + "@/util": path.resolve(__dirname, "../src/util/"), + "@/models": path.resolve(__dirname, "../src/models/"), + "@/common": path.resolve(__dirname, "../src/app/common/"), + "@/elements": path.resolve(__dirname, "../src/app/common/elements/"), + "@/modals": path.resolve(__dirname, "../src/app/common/modals/"), + "@/assets": path.resolve(__dirname, "../src/app/assets/"), + "@/plugins": path.resolve(__dirname, "../src/plugins/"), + "@/autocomplete": path.resolve(__dirname, "../src/autocomplete/"), + }, + }, +}; + +var electronDev = webpackMerge.merge(electronCommon, { + mode: "development", + output: { + path: path.resolve(__dirname, "../dist-dev"), + filename: "[name].js", + }, + plugins: [ + new CopyPlugin({ + patterns: [{ from: "emain/preload.js", to: "preload.js" }], + }), + new webpack.DefinePlugin({ + __WAVETERM_DEV__: "true", + __WAVETERM_VERSION__: JSON.stringify(VERSION), + __WAVETERM_BUILD__: JSON.stringify("devbuild"), + }), + ], +}); + +var electronProd = webpackMerge.merge(electronCommon, { + mode: "production", + output: { + path: path.resolve(__dirname, "../dist"), + filename: "[name].js", + }, + plugins: [ + new CopyPlugin({ + patterns: [{ from: "src/electron/preload.js", to: "preload.js" }], + }), + new webpack.DefinePlugin({ + __WAVETERM_DEV__: "false", + __WAVETERM_VERSION__: JSON.stringify(VERSION), + __WAVETERM_BUILD__: JSON.stringify(BUILD), + }), + ], + optimization: { + minimize: true, + }, +}); + +module.exports = { electronDev: electronDev, electronProd: electronProd }; diff --git a/webpack/webpack.web.js b/webpack/webpack.web.js new file mode 100644 index 00000000..51767fbd --- /dev/null +++ b/webpack/webpack.web.js @@ -0,0 +1,154 @@ +const webpack = require("webpack"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const CopyPlugin = require("copy-webpack-plugin"); +const webpackMerge = require("webpack-merge"); +const path = require("path"); +const moment = require("dayjs"); +const VERSION = require("../version.js"); +const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); + +function makeBuildStr() { + let buildStr = moment().format("YYYYMMDD-HHmmss"); + // console.log("waveterm:web " + VERSION + " build " + buildStr); + return buildStr; +} + +const BUILD = makeBuildStr(); + +let BundleAnalyzerPlugin = null; +if (process.env.WEBPACK_ANALYZE) { + BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; +} + +var webCommon = { + entry: { + wave: ["./frontend/wave.ts"], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + // exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: [ + [ + "@babel/preset-env", + { + targets: + "defaults and not ie > 0 and not op_mini all and not op_mob > 0 and not kaios > 0 and not and_qq > 0 and not and_uc > 0 and not baidu > 0", + }, + ], + "@babel/preset-react", + "@babel/preset-typescript", + ], + plugins: [ + ["@babel/transform-runtime", { regenerator: true }], + "@babel/plugin-transform-react-jsx", + ["@babel/plugin-proposal-decorators", { legacy: true }], + ["@babel/plugin-proposal-class-properties", { loose: true }], + ["@babel/plugin-proposal-private-methods", { loose: true }], + ["@babel/plugin-proposal-private-property-in-object", { loose: true }], + "babel-plugin-jsx-control-statements", + ], + }, + }, + }, + { + test: /\.css$/, + use: ["style-loader", "css-loader"], + }, + { + test: /\.less$/, + use: [{ loader: MiniCssExtractPlugin.loader }, "css-loader", "less-loader"], + }, + { + test: /\.svg$/, + use: [{ loader: "@svgr/webpack", options: { icon: true, svgo: false } }, "file-loader"], + }, + { + test: /\.md$/, + type: "asset/source", + }, + { + test: /\.(png|jpe?g|gif)$/i, + type: "asset/resource", + }, + ], + }, + resolve: { + extensions: [".ts", ".tsx", ".js", ".mjs", ".cjs", ".wasm", ".json", ".less", ".css"], + plugins: [ + new TsconfigPathsPlugin({ + configFile: path.resolve(__dirname, "../tsconfig.json"), + }), + ], + }, +}; + +var webDev = webpackMerge.merge(webCommon, { + mode: "development", + output: { + path: path.resolve(__dirname, "../dist-dev"), + filename: "[name].js", + }, + devtool: "source-map", + devServer: { + static: { + directory: path.join(__dirname, "../public"), + }, + port: 9000, + headers: { + "Cache-Control": "no-store", + }, + }, + plugins: [ + new MiniCssExtractPlugin({ filename: "[name].css", ignoreOrder: true }), + new CopyPlugin({ + patterns: [ + { + from: "min/vs", + to: "monaco", + context: "node_modules/monaco-editor/", + }, + ], + }), + new webpack.ProvidePlugin({ + React: 'react' + }), + new webpack.DefinePlugin({ + __WAVETERM_DEV__: "true", + __WAVETERM_VERSION__: JSON.stringify(VERSION), + __WAVETERM_BUILD__: JSON.stringify("devbuild"), + }), + ], + watchOptions: { + aggregateTimeout: 200, + }, +}); + +var webProd = webpackMerge.merge(webCommon, { + mode: "production", + output: { + path: path.resolve(__dirname, "../dist"), + filename: "[name].js", + }, + devtool: "source-map", + plugins: [ + new MiniCssExtractPlugin({ filename: "[name].css", ignoreOrder: true }), + new webpack.DefinePlugin({ + __WAVETERM_DEV__: "false", + __WAVETERM_VERSION__: JSON.stringify(VERSION), + __WAVETERM_BUILD__: JSON.stringify(BUILD), + }), + ], + optimization: { + minimize: true, + }, +}); +if (BundleAnalyzerPlugin != null) { + webProd.plugins.push(new BundleAnalyzerPlugin()); +} + +module.exports = { webDev: webDev, webProd: webProd }; diff --git a/yarn.lock b/yarn.lock index d0df0e83..3d848c92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43,6 +43,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": "npm:^7.24.7" + picocolors: "npm:^1.0.0" + checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.6": version: 7.24.6 resolution: "@babel/compat-data@npm:7.24.6" @@ -50,6 +60,36 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/compat-data@npm:7.24.7" + checksum: 10c0/dcd93a5632b04536498fbe2be5af1057f635fd7f7090483d8e797878559037e5130b26862ceb359acbae93ed27e076d395ddb4663db6b28a665756ffd02d324f + languageName: node + linkType: hard + +"@babel/core@npm:^7.1.2, @babel/core@npm:^7.23.5, @babel/core@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/core@npm:7.24.7" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.7" + "@babel/generator": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helpers": "npm:^7.24.7" + "@babel/parser": "npm:^7.24.7" + "@babel/template": "npm:^7.24.7" + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/4004ba454d3c20a46ea66264e06c15b82e9f6bdc35f88819907d24620da70dbf896abac1cb4cc4b6bb8642969e45f4d808497c9054a1388a386cf8c12e9b9e0d + languageName: node + linkType: hard + "@babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.24.5": version: 7.24.6 resolution: "@babel/core@npm:7.24.6" @@ -85,6 +125,27 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/generator@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/06b1f3350baf527a3309e50ffd7065f7aee04dd06e1e7db794ddfde7fe9d81f28df64edd587173f8f9295496a7ddb74b9a185d4bf4de7bb619e6d4ec45c8fd35 + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-annotate-as-pure@npm:7.24.6" @@ -103,6 +164,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/0ed84abf848c79fb1cd4c1ddac12c771d32c1904d87fc3087f33cfdeb0c2e0db4e7892b74b407d9d8d0c000044f3645a7391a781f788da8410c290bb123a1f13 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-compilation-targets@npm:7.24.6" @@ -116,6 +187,38 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-compilation-targets@npm:7.24.7" + dependencies: + "@babel/compat-data": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + browserslist: "npm:^4.22.2" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/1d580a9bcacefe65e6bf02ba1dafd7ab278269fef45b5e281d8354d95c53031e019890464e7f9351898c01502dd2e633184eb0bcda49ed2ecd538675ce310f51 + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-function-name": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.7" + "@babel/helper-optimise-call-expression": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-split-export-declaration": "npm:^7.24.7" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/6b7b47d70b41c00f39f86790cff67acf2bce0289d52a7c182b28e797f4e0e6d69027e3d06eccf1d54dddc2e5dde1df663bb1932437e5f447aeb8635d8d64a6ab + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-create-class-features-plugin@npm:7.24.6" @@ -148,6 +251,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + regexpu-core: "npm:^5.3.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ed611a7eb0c71843f9cdc471eeb38767972229f9225f7aaa90d124d7ee0062cf6908fd53ee9c34f731394c429594f06049a7738a71d342e0191d4047b2fc0ac2 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": version: 0.6.2 resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" @@ -170,6 +286,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/36ece78882b5960e2d26abf13cf15ff5689bf7c325b10a2895a74a499e712de0d305f8d78bb382dd3c05cfba7e47ec98fe28aab5674243e0625cd38438dd0b2d + languageName: node + linkType: hard + "@babel/helper-function-name@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-function-name@npm:7.24.6" @@ -180,6 +305,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" + dependencies: + "@babel/template": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/e5e41e6cf86bd0f8bf272cbb6e7c5ee0f3e9660414174435a46653efba4f2479ce03ce04abff2aa2ef9359cf057c79c06cb7b134a565ad9c0e8a50dcdc3b43c4 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-hoist-variables@npm:7.24.6" @@ -189,6 +324,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-hoist-variables@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/19ee37563bbd1219f9d98991ad0e9abef77803ee5945fd85aa7aa62a67c69efca9a801696a1b58dda27f211e878b3327789e6fd2a6f6c725ccefe36774b5ce95 + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-member-expression-to-functions@npm:7.24.6" @@ -198,6 +342,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/9638c1d33cf6aba028461ccd3db6061c76ff863ca0d5013dd9a088bf841f2f77c46956493f9da18355c16759449d23b74cc1de4da357ade5c5c34c858f840f0a + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-module-imports@npm:7.24.6" @@ -207,6 +361,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-module-transforms@npm:7.24.6" @@ -222,6 +386,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-transforms@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-simple-access": "npm:^7.24.7" + "@babel/helper-split-export-declaration": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4f311755fcc3b4cbdb689386309cdb349cf0575a938f0b9ab5d678e1a81bbb265aa34ad93174838245f2ac7ff6d5ddbd0104638a75e4e961958ed514355687b6 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-optimise-call-expression@npm:7.24.6" @@ -231,6 +410,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/ca6a9884705dea5c95a8b3ce132d1e3f2ae951ff74987d400d1d9c215dae9c0f9e29924d8f8e131e116533d182675bc261927be72f6a9a2968eaeeaa51eb1d0f + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.24.6 resolution: "@babel/helper-plugin-utils@npm:7.24.6" @@ -238,6 +426,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-plugin-utils@npm:7.24.7" + checksum: 10c0/c3d38cd9b3520757bb4a279255cc3f956fc0ac1c193964bd0816ebd5c86e30710be8e35252227e0c9d9e0f4f56d9b5f916537f2bc588084b0988b4787a967d31 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-remap-async-to-generator@npm:7.24.6" @@ -251,6 +446,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-wrap-function": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4e7fa2cdcbc488e41c27066c16e562857ef3c5c2bfe70d2f1e32e9ee7546b17c3fc1c20d05bf2a7f1c291bd9e7a0a219f6a9fa387209013294be79a26fcfe64d + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-replace-supers@npm:7.24.6" @@ -264,6 +472,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-replace-supers@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.7" + "@babel/helper-optimise-call-expression": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0e133bb03371dee78e519c334a09c08e1493103a239d9628db0132dfaac3fc16380479ca3c590d278a9b71b624030a338c18ebbfe6d430ebb2e4653775c4b3e3 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-simple-access@npm:7.24.6" @@ -273,6 +494,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-simple-access@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.6" @@ -282,6 +513,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/e3a9b8ac9c262ac976a1bcb5fe59694db5e6f0b4f9e7bdba5c7693b8b5e28113c23bdaa60fe8d3ec32a337091b67720b2053bcb3d5655f5406536c3d0584242b + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-split-export-declaration@npm:7.24.6" @@ -291,6 +532,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/0254577d7086bf09b01bbde98f731d4fcf4b7c3fa9634fdb87929801307c1f6202a1352e3faa5492450fa8da4420542d44de604daf540704ff349594a78184f6 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.24.1": version: 7.24.1 resolution: "@babel/helper-string-parser@npm:7.24.1" @@ -305,6 +555,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-string-parser@npm:7.24.7" + checksum: 10c0/47840c7004e735f3dc93939c77b099bb41a64bf3dda0cae62f60e6f74a5ff80b63e9b7cf77b5ec25a324516381fc994e1f62f922533236a8e3a6af57decb5e1e + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.24.5": version: 7.24.5 resolution: "@babel/helper-validator-identifier@npm:7.24.5" @@ -319,6 +576,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-validator-option@npm:7.24.6" @@ -326,6 +590,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-option@npm:7.24.7" + checksum: 10c0/21aea2b7bc5cc8ddfb828741d5c8116a84cbc35b4a3184ec53124f08e09746f1f67a6f9217850188995ca86059a7942e36d8965a6730784901def777b7e8a436 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helper-wrap-function@npm:7.24.6" @@ -337,6 +608,18 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-wrap-function@npm:7.24.7" + dependencies: + "@babel/helper-function-name": "npm:^7.24.7" + "@babel/template": "npm:^7.24.7" + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/d5689f031bf0eb38c0d7fad6b7e320ddef4bfbdf08d12d7d76ef41b7ca365a32721e74cb5ed5a9a9ec634bc20f9b7a27314fa6fb08f1576b8f6d8330fcea6f47 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.24.6": version: 7.24.6 resolution: "@babel/helpers@npm:7.24.6" @@ -347,6 +630,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helpers@npm:7.24.7" + dependencies: + "@babel/template": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/aa8e230f6668773e17e141dbcab63e935c514b4b0bf1fed04d2eaefda17df68e16b61a56573f7f1d4d1e605ce6cc162b5f7e9fdf159fde1fd9b77c920ae47d27 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.24.6": version: 7.24.6 resolution: "@babel/highlight@npm:7.24.6" @@ -359,6 +652,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.7" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7": version: 7.24.5 resolution: "@babel/parser@npm:7.24.5" @@ -377,6 +682,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/parser@npm:7.24.7" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/8b244756872185a1c6f14b979b3535e682ff08cb5a2a5fd97cc36c017c7ef431ba76439e95e419d43000c5b07720495b00cf29a7f0d9a483643d08802b58819b + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.6" @@ -389,6 +703,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/394c30e2b708ad385fa1219528e039066a1f1cb40f47986f283878848fd354c745e6397f588b4e5a046ee8d64bfdf4c208e4c3dfbdcfb2fd34315ec67c64e7af + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.6" @@ -400,6 +726,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/a36307428ecc1a01b00cf90812335eed1575d13f211ab24fe4d0c55c28a2fcbd4135f142efabc3b277b2a8e09ee05df594a1272353f061b63829495b5dcfdb96 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.6" @@ -413,6 +750,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/aeb6e7aa363a47f815cf956ea1053c5dd8b786a17799f065c9688ba4b0051fe7565d258bbe9400bfcbfb3114cb9fda66983e10afe4d750bc70ff75403e15dd36 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.6" @@ -425,6 +775,55 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/2b52a73e444f6adc73f927b623e53a4cf64397170dd1071268536df1b3db1e02131418c8dc91351af48837a6298212118f4a72d5407f8005cf9a732370a315b0 + languageName: node + linkType: hard + +"@babel/plugin-proposal-class-properties@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.18.6" + "@babel/helper-plugin-utils": "npm:^7.18.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d5172ac6c9948cdfc387e94f3493ad86cb04035cf7433f86b5d358270b1b9752dc25e176db0c5d65892a246aca7bdb4636672e15626d7a7de4bc0bd0040168d9 + languageName: node + linkType: hard + +"@babel/plugin-proposal-decorators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-proposal-decorators@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-decorators": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fb4e4711f90fed63aa4dfe34fc5f5a5d0af175725181678f462ee0df2b78a23ae83b9424403c6b957edbc07d2abc80f82f3b9f91baf568bdaf85e8196a9138d5 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-methods@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.18.6" + "@babel/helper-plugin-utils": "npm:^7.18.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1c273d0ec3d49d0fe80bd754ec0191016e5b3ab4fb1e162ac0c014e9d3c1517a5d973afbf8b6dc9f9c98a8605c79e5f9e8b5ee158a4313fa68d1ff7b02084b6a + languageName: node + linkType: hard + "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -434,6 +833,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-private-property-in-object@npm:^7.21.11": + version: 7.21.11 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.18.6" + "@babel/helper-create-class-features-plugin": "npm:^7.21.0" + "@babel/helper-plugin-utils": "npm:^7.20.2" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3c8c9ea175101b1cbb2b0e8fee20fcbdd03eb0700d3581aa826ac3573c9b002f39b1512c2af9fd1903ff921bcc864da95ad3cdeba53c9fbcfb3dc23916eacf47 + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -467,6 +880,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-decorators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-decorators@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d1ecc334af7a5418a6e8ad5e711bf5d5a892ba00e04ba05b90077b9da735585ff8d4141e4fc3ae781b854f48eda9f3a9cfa9f1c80f5f4a697dbded01058a8b63 + languageName: node + linkType: hard + "@babel/plugin-syntax-dynamic-import@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" @@ -511,6 +935,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b82c53e095274ee71c248551352d73441cf65b3b3fc0107258ba4e9aef7090772a425442b3ed1c396fa207d0efafde8929c87a17d3c885b3ca2021316e87e246 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.6" @@ -522,6 +957,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/eccc54d0f03c96d0eec7a6e2fa124dadbc7298345b62ffc4238f173308c4325b5598f139695ff05a95cf78412ef6903599e4b814496612bf39aad4715a16375b + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -555,6 +1001,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -654,6 +1111,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cdabd2e8010fb0ad15b49c2c270efc97c4bfe109ead36c7bbcf22da7a74bc3e49702fc4f22f12d2d6049e8e22a5769258df1fd05f0420ae45e11bdd5bc07805a + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -666,6 +1134,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.23.3, @babel/plugin-transform-arrow-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6ac05a54e5582f34ac6d5dc26499e227227ec1c7fa6fc8de1f3d40c275f140d3907f79bbbd49304da2d7008a5ecafb219d0b71d78ee3290ca22020d878041245 + languageName: node + linkType: hard + "@babel/plugin-transform-arrow-functions@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.6" @@ -691,6 +1170,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6b5e33ae66dce0afce9b06d8dace6fa052528e60f7622aa6cfd3e71bd372ca5079d426e78336ca564bc0d5f37acbcda1b21f4fe656fcb642f1a93a697ab39742 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.6" @@ -704,6 +1197,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/83c82e243898875af8457972a26ab29baf8a2078768ee9f35141eb3edff0f84b165582a2ff73e90a9e08f5922bf813dbf15a85c1213654385198f4591c0dc45d + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.6" @@ -715,6 +1221,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/113e86de4612ae91773ff5cb6b980f01e1da7e26ae6f6012127415d7ae144e74987bc23feb97f63ba4bc699331490ddea36eac004d76a20d5369e4cc6a7f61cd + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-block-scoping@npm:7.24.6" @@ -726,6 +1243,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/dcbc5e385c0ca5fb5736b1c720c90755cffe9f91d8c854f82e61e59217dd3f6c91b3633eeee4b55a89d3f59e5275d0f5b0b1b1363d4fa70c49c468b55aa87700 + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-class-properties@npm:7.24.6" @@ -738,6 +1266,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/75018a466c7ede3d2397e158891c224ba7fca72864506ce067ddbc02fc65191d44da4d6379c996d0c7f09019e26b5c3f5f1d3a639cd98366519723886f0689d0 + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-class-static-block@npm:7.24.6" @@ -751,6 +1291,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/b0ade39a3d09dce886f79dbd5907c3d99b48167eddb6b9bbde24a0598129654d7017e611c20494cdbea48b07ac14397cd97ea34e3754bbb2abae4e698128eccb + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-classes@npm:7.24.6" @@ -769,6 +1322,24 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-classes@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-function-name": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.24.7" + "@babel/helper-split-export-declaration": "npm:^7.24.7" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e51dba7ce8b770d1eee929e098d5a3be3efc3e8b941e22dda7d0097dc4e7be5feabd2da7b707ac06fcac5661b31223c541941dec08ce76c1faa55544d87d06ec + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-computed-properties@npm:7.24.6" @@ -781,6 +1352,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/template": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/25636dbc1f605c0b8bc60aa58628a916b689473d11551c9864a855142e36742fe62d4a70400ba3b74902338e77fb3d940376c0a0ba154b6b7ec5367175233b49 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-destructuring@npm:7.24.6" @@ -792,6 +1375,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/929f07a807fb62230bfbf881cfcedf187ac5daf2f1b01da94a75c7a0f6f72400268cf4bcfee534479e43260af8193e42c31ee03c8b0278ba77d0036ed6709c27 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.6" @@ -804,6 +1398,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/793f14c9494972d294b7e7b97b747f47874b6d57d7804d3443c701becf5db192c9311be6a1835c07664486df1f5c60d33196c36fb7e11a53015e476b4c145b33 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.6" @@ -815,6 +1421,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/75ff7ec1117ac500e77bf20a144411d39c0fdd038f108eec061724123ce6d1bb8d5bd27968e466573ee70014f8be0043361cdb0ef388f8a182d1d97ad67e51b9 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.6" @@ -827,6 +1444,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/eeda48372efd0a5103cb22dadb13563c975bce18ae85daafbb47d57bb9665d187da9d4fe8d07ac0a6e1288afcfcb73e4e5618bf75ff63fddf9736bfbf225203b + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.6" @@ -839,6 +1468,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ace3e11c94041b88848552ba8feb39ae4d6cad3696d439ff51445bd2882d8b8775d85a26c2c0edb9b5e38c9e6013cc11b0dea89ec8f93c7d9d7ee95e3645078c + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.6" @@ -851,6 +1492,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4e144d7f1c57bc63b4899dbbbdfed0880f2daa75ea9c7251c7997f106e4b390dc362175ab7830f11358cb21f6b972ca10a43a2e56cd789065f7606b082674c0c + languageName: node + linkType: hard + "@babel/plugin-transform-flow-strip-types@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.6" @@ -875,6 +1528,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-for-of@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/77629b1173e55d07416f05ba7353caa09d2c2149da2ca26721ab812209b63689d1be45116b68eadc011c49ced59daf5320835b15245eb7ae93ae0c5e8277cfc0 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-function-name@npm:7.24.6" @@ -888,6 +1553,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-function-name@npm:7.24.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-function-name": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3e9642428d6952851850d89ea9307d55946528d18973784d0e2f04a651b23bd9924dd8a2641c824b483bd4ab1223bab1d2f6a1106a939998f7ced512cb60ac5b + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-json-strings@npm:7.24.6" @@ -900,6 +1578,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/17c72cd5bf3e90e722aabd333559275f3309e3fa0b9cea8c2944ab83ae01502c71a2be05da5101edc02b3fc8df15a8dbb9b861cbfcc8a52bf5e797cf01d3a40a + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-literals@npm:7.24.6" @@ -911,6 +1601,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9f3f6f3831929cd2a977748c07addf9944d5cccb50bd3a24a58beb54f91f00d6cacd3d7831d13ffe1ad6f8aba0aefd7bca5aec65d63b77f39c62ad1f2d484a3e + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.6" @@ -923,6 +1624,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/dbe882eb9053931f2ab332c50fc7c2a10ef507d6421bd9831adbb4cb7c9f8e1e5fbac4fbd2e007f6a1bf1df1843547559434012f118084dc0bf42cda3b106272 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.6" @@ -934,6 +1647,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e789ae359bdf2d20e90bedef18dfdbd965c9ebae1cee398474a0c349590fda7c8b874e1a2ceee62e47e5e6ec1730e76b0f24e502164357571854271fc12cc684 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-modules-amd@npm:7.24.6" @@ -946,6 +1670,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6df7de7fce34117ca4b2fa07949b12274c03668cbfe21481c4037b6300796d50ae40f4f170527b61b70a67f26db906747797e30dbd0d9809a441b6e220b5728f + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.6" @@ -959,6 +1695,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-simple-access": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9442292b3daf6a5076cdc3c4c32bf423bda824ccaeb0dd0dc8b3effaa1fecfcb0130ae6e647fef12a5d5ff25bcc99a0d6bfc6d24a7525345e1bcf46fcdf81752 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.6" @@ -973,6 +1722,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" + dependencies: + "@babel/helper-hoist-variables": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e2a795e0a6baafe26f4a74010622212ddd873170742d673f450e0097f8d984f6e6a95eb8ce41b05071ee9790c4be088b33801aaab3f78ee202c567634e52a331 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-modules-umd@npm:7.24.6" @@ -985,6 +1748,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7791d290121db210e4338b94b4a069a1a79e4c7a8d7638d8159a97b281851bbed3048dac87a4ae718ad963005e6c14a5d28e6db2eeb2b04e031cee92fb312f85 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.6" @@ -997,6 +1772,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/41a0b0f2d0886318237440aa3b489f6d0305361d8671121777d9ff89f9f6de9d0c02ce93625049061426c8994064ef64deae8b819d1b14c00374a6a2336fb5d9 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-new-target@npm:7.24.6" @@ -1008,6 +1795,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-new-target@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2540808a35e1a978e537334c43dab439cf24c93e7beb213a2e71902f6710e60e0184316643790c0a6644e7a8021e52f7ab8165e6b3e2d6651be07bdf517b67df + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.6" @@ -1020,6 +1818,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7243c8ff734ed5ef759dd8768773c4b443c12e792727e759a1aec2c7fa2bfdd24f1ecb42e292a7b3d8bd3d7f7b861cf256a8eb4ba144fc9cc463892c303083d9 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.6" @@ -1032,6 +1842,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e18e09ca5a6342645d00ede477731aa6e8714ff357efc9d7cda5934f1703b3b6fb7d3298dce3ce3ba53e9ff1158eab8f1aadc68874cc21a6099d33a1ca457789 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.6" @@ -1046,6 +1868,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9ad64bc003f583030f9da50614b485852f8edac93f8faf5d1cd855201a4852f37c5255ae4daf70dd4375bdd4874e16e39b91f680d4668ec219ba05441ce286eb + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-object-super@npm:7.24.6" @@ -1058,6 +1894,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-super@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/770cebb4b4e1872c216b17069db9a13b87dfee747d359dc56d9fcdd66e7544f92dc6ab1861a4e7e0528196aaff2444e4f17dc84efd8eaf162d542b4ba0943869 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.6" @@ -1070,6 +1918,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1e2f10a018f7d03b3bde6c0b70d063df8d5dd5209861d4467726cf834f5e3d354e2276079dc226aa8e6ece35f5c9b264d64b8229a8bb232829c01e561bcfb07a + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.6" @@ -1083,6 +1943,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b9e3649b299e103b0d1767bbdba56574d065ff776e5350403b7bfd4e3982743c0cdb373d33bdbf94fa3c322d155e45d0aad946acf0aa741b870aed22dfec8b8e + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-parameters@npm:7.24.6" @@ -1094,6 +1967,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-parameters@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/53bf190d6926771545d5184f1f5f3f5144d0f04f170799ad46a43f683a01fab8d5fe4d2196cf246774530990c31fe1f2b9f0def39f0a5ddbb2340b924f5edf01 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-private-methods@npm:7.24.6" @@ -1106,6 +1990,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5b7bf923b738fbe3ad6c33b260e0a7451be288edfe4ef516303fa787a1870cd87533bfbf61abb779c22ed003c2fc484dec2436fe75a48756f686c0241173d364 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.6" @@ -1120,6 +2016,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c6fa7defb90b1b0ed46f24ff94ff2e77f44c1f478d1090e81712f33cf992dda5ba347016f030082a2f770138bac6f4a9c2c1565e9f767a125901c77dd9c239ba + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-property-literals@npm:7.24.6" @@ -1131,6 +2041,39 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/52564b58f3d111dc02d241d5892a4b01512e98dfdf6ef11b0ed62f8b11b0acacccef0fc229b44114fe8d1a57a8b70780b11bdd18b807d3754a781a07d8f57433 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-display-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c14a07a9e75723c96f1a0a306b8a8e899ff1c6a0cc3d62bcda79bb1b54e4319127b258651c513a1a47da152cdc22e16525525a30ae5933a2980c7036fd0b4d24 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fce647db50f90a5291681f0f97865d9dc76981262dff71d6d0332e724b85343de5860c26f9e9a79e448d61e1d70916b07ce91e8c7f2b80dceb4b16aee41794d8 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.24.5": version: 7.24.6 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.6" @@ -1153,6 +2096,33 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-jsx": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5c46d2c1c06a30e6bde084839df9cc689bf9c9cb0292105d61c225ca731f64247990724caee7dfc7f817dc964c062e8319e7f05394209590c476b65d75373435 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fae517d293d9c93b7b920458c3e4b91cb0400513889af41ba184a5f3acc8bfef27242cc262741bb8f87870df376f1733a0d0f52b966d342e2aaaf5607af8f73d + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-regenerator@npm:7.24.6" @@ -1165,6 +2135,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d2dc2c788fdae9d97217e70d46ba8ca9db0035c398dc3e161552b0c437113719a75c04f201f9c91ddc8d28a1da60d0b0853f616dead98a396abb9c845c44892b + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-reserved-words@npm:7.24.6" @@ -1176,6 +2158,33 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2229de2768615e7f5dc0bbc55bc121b5678fd6d2febd46c74a58e42bb894d74cd5955c805880f4e02d0e1cf94f6886270eda7fafc1be9305a1ec3b9fd1d063f5 + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-runtime@npm:7.24.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a33f5095872bbba00b8ee553dfe6941477e69a017a2e65e9dd86e80dab5c627635093b796eb1eb22aaaf2f874704f63ad1d99b952b83b59ef6b368ae04e5bb41 + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.6" @@ -1187,6 +2196,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/41b155bdbb3be66618358488bf7731b3b2e8fff2de3dbfd541847720a9debfcec14db06a117abedd03c9cd786db20a79e2a86509a4f19513f6e1b610520905cf + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-spread@npm:7.24.6" @@ -1199,6 +2219,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-spread@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/facba1553035f76b0d2930d4ada89a8cd0f45b79579afd35baefbfaf12e3b86096995f4b0c402cf9ee23b3f2ea0a4460c3b1ec0c192d340962c948bb223d4e66 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.6" @@ -1210,6 +2242,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5a74ed2ed0a3ab51c3d15fcaf09d9e2fe915823535c7a4d7b019813177d559b69677090e189ec3d5d08b619483eb5ad371fbcfbbff5ace2a76ba33ee566a1109 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-template-literals@npm:7.24.6" @@ -1221,6 +2264,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3630f966257bcace122f04d3157416a09d40768c44c3a800855da81146b009187daa21859d1c3b7d13f4e19e8888e60613964b175b2275d451200fb6d8d6cfe6 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.6" @@ -1232,6 +2286,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5649e7260a138681e68b296ab5931e2b1f132f287d6b4131d49b24f9dc20d62902b7e9d63c4d2decd5683b41df35ef4b9b03f58c7f9f65e4c25a6d8bbf04e9e9 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-typescript@npm:7.24.6" @@ -1246,6 +2311,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-typescript@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-typescript": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e8dacdc153a4c4599014b66eb01b94e3dc933d58d4f0cc3039c1a8f432e77b9df14f34a61964e014b975bf466f3fefd8c4768b3e887d3da1be9dc942799bdfdf + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.6" @@ -1257,6 +2336,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8b18e2e66af33471a6971289492beff5c240e56727331db1d34c4338a6a368a82a7ed6d57ec911001b6d65643aed76531e1e7cac93265fb3fb2717f54d845e69 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.6" @@ -1269,6 +2359,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bc57656eb94584d1b74a385d378818ac2b3fca642e3f649fead8da5fb3f9de22f8461185936915dfb33d5a9104e62e7a47828331248b09d28bb2d59e9276de3e + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.6" @@ -1281,6 +2383,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/83f72a345b751566b601dc4d07e9f2c8f1bc0e0c6f7abb56ceb3095b3c9d304de73f85f2f477a09f8cc7edd5e65afd0ff9e376cdbcbea33bc0c28f3705b38fd9 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.24.6": version: 7.24.6 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.6" @@ -1293,6 +2407,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/7457c0ee8e80a80cb6fdc1fe54ab115b52815627616ce9151be8ef292fc99d04a910ec24f11382b4f124b89374264396892b086886bd2a9c2317904d87c9b21b + languageName: node + linkType: hard + "@babel/preset-env@npm:^7.24.4": version: 7.24.6 resolution: "@babel/preset-env@npm:7.24.6" @@ -1384,6 +2510,97 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/preset-env@npm:7.24.7" + dependencies: + "@babel/compat-data": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.7" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.24.7" + "@babel/plugin-transform-class-properties": "npm:^7.24.7" + "@babel/plugin-transform-class-static-block": "npm:^7.24.7" + "@babel/plugin-transform-classes": "npm:^7.24.7" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.7" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.24.7" + "@babel/plugin-transform-json-strings": "npm:^7.24.7" + "@babel/plugin-transform-literals": "npm:^7.24.7" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" + "@babel/plugin-transform-modules-amd": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7" + "@babel/plugin-transform-modules-umd": "npm:^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-new-target": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-object-super": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-property-literals": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-reserved-words": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@babel/plugin-transform-template-literals": "npm:^7.24.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.7" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.31.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c6714346f3ccc1271eaa90051c75b8bb57b20ef57408ab68740e2f3552693ae0ee5a4bcce3a00211d40e4947af1f7b8ab422066b953f0095461937fb72d11274 + languageName: node + linkType: hard + "@babel/preset-flow@npm:^7.22.15": version: 7.24.6 resolution: "@babel/preset-flow@npm:7.24.6" @@ -1410,6 +2627,22 @@ __metadata: languageName: node linkType: hard +"@babel/preset-react@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/preset-react@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-development": "npm:^7.24.7" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9658b685b25cedaadd0b65c4e663fbc7f57394b5036ddb4c99b1a75b0711fb83292c1c625d605c05b73413fc7a6dc20e532627f6a39b6dc8d4e00415479b054c + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.23.0": version: 7.24.6 resolution: "@babel/preset-typescript@npm:7.24.6" @@ -1425,6 +2658,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/preset-typescript@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/plugin-syntax-jsx": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" + "@babel/plugin-transform-typescript": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/986bc0978eedb4da33aba8e1e13a3426dd1829515313b7e8f4ba5d8c18aff1663b468939d471814e7acf4045d326ae6cff37239878d169ac3fe53a8fde71f8ee + languageName: node + linkType: hard + "@babel/register@npm:^7.22.15": version: 7.24.6 resolution: "@babel/register@npm:7.24.6" @@ -1467,6 +2715,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/template@npm:7.24.7" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/parser": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/95b0b3ee80fcef685b7f4426f5713a855ea2cd5ac4da829b213f8fb5afe48a2a14683c2ea04d446dbc7f711c33c5cd4a965ef34dcbe5bc387c9e966b67877ae3 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.24.1, @babel/traverse@npm:^7.24.6": version: 7.24.6 resolution: "@babel/traverse@npm:7.24.6" @@ -1485,6 +2744,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/traverse@npm:7.24.7" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/generator": "npm:^7.24.7" + "@babel/helper-environment-visitor": "npm:^7.24.7" + "@babel/helper-function-name": "npm:^7.24.7" + "@babel/helper-hoist-variables": "npm:^7.24.7" + "@babel/helper-split-export-declaration": "npm:^7.24.7" + "@babel/parser": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/a5135e589c3f1972b8877805f50a084a04865ccb1d68e5e1f3b94a8841b3485da4142e33413d8fd76bc0e6444531d3adf1f59f359c11ffac452b743d835068ab + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.0": version: 7.24.5 resolution: "@babel/types@npm:7.24.5" @@ -1507,6 +2784,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/types@npm:7.24.7" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/d9ecbfc3eb2b05fb1e6eeea546836ac30d990f395ef3fe3f75ced777a222c3cfc4489492f72e0ce3d9a5a28860a1ce5f81e66b88cf5088909068b3ff4fab72c1 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -1543,13 +2831,32 @@ __metadata: languageName: node linkType: hard -"@discoveryjs/json-ext@npm:^0.5.3": +"@discoveryjs/json-ext@npm:^0.5.0, @discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c languageName: node linkType: hard +"@electron/get@npm:^2.0.0": + version: 2.0.3 + resolution: "@electron/get@npm:2.0.3" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e + 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" @@ -1559,6 +2866,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/aix-ppc64@npm:0.19.12" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/aix-ppc64@npm:0.20.2" @@ -1566,6 +2880,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm64@npm:0.19.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm64@npm:0.20.2" @@ -1573,6 +2894,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm@npm:0.19.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm@npm:0.20.2" @@ -1580,6 +2908,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-x64@npm:0.19.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-x64@npm:0.20.2" @@ -1587,6 +2922,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-arm64@npm:0.19.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-arm64@npm:0.20.2" @@ -1594,6 +2936,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-x64@npm:0.19.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-x64@npm:0.20.2" @@ -1601,6 +2950,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-arm64@npm:0.19.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-arm64@npm:0.20.2" @@ -1608,6 +2964,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-x64@npm:0.19.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-x64@npm:0.20.2" @@ -1615,6 +2978,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm64@npm:0.19.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm64@npm:0.20.2" @@ -1622,6 +2992,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm@npm:0.19.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm@npm:0.20.2" @@ -1629,6 +3006,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ia32@npm:0.19.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ia32@npm:0.20.2" @@ -1636,6 +3020,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-loong64@npm:0.19.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-loong64@npm:0.20.2" @@ -1643,6 +3034,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-mips64el@npm:0.19.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-mips64el@npm:0.20.2" @@ -1650,6 +3048,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ppc64@npm:0.19.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ppc64@npm:0.20.2" @@ -1657,6 +3062,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-riscv64@npm:0.19.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-riscv64@npm:0.20.2" @@ -1664,6 +3076,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-s390x@npm:0.19.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-s390x@npm:0.20.2" @@ -1671,6 +3090,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-x64@npm:0.19.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-x64@npm:0.20.2" @@ -1678,6 +3104,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/netbsd-x64@npm:0.19.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/netbsd-x64@npm:0.20.2" @@ -1685,6 +3118,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/openbsd-x64@npm:0.19.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/openbsd-x64@npm:0.20.2" @@ -1692,6 +3132,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/sunos-x64@npm:0.19.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/sunos-x64@npm:0.20.2" @@ -1699,6 +3146,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-arm64@npm:0.19.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-arm64@npm:0.20.2" @@ -1706,6 +3160,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-ia32@npm:0.19.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-ia32@npm:0.20.2" @@ -1713,6 +3174,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-x64@npm:0.19.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-x64@npm:0.20.2" @@ -1874,6 +3342,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" @@ -1891,7 +3369,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -2497,6 +3975,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + "@sindresorhus/merge-streams@npm:^2.1.0": version: 2.3.0 resolution: "@sindresorhus/merge-streams@npm:2.3.0" @@ -3286,6 +4771,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + "@tanstack/react-table@npm:^8.17.3": version: 8.17.3 resolution: "@tanstack/react-table@npm:8.17.3" @@ -3398,7 +4892,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -3420,6 +4914,20 @@ __metadata: languageName: node linkType: hard +"@types/babel__plugin-transform-runtime@npm:^7": + version: 7.9.5 + resolution: "@types/babel__plugin-transform-runtime@npm:7.9.5" + checksum: 10c0/119d8f88188c63eb21bf150d294991d3470e6aa90dc8ec9f634197760af8acc981564e29af9087bfa8ad713b5b5419cae03047cd225fccb9977bb97adf25a871 + languageName: node + linkType: hard + +"@types/babel__preset-env@npm:^7": + version: 7.9.6 + resolution: "@types/babel__preset-env@npm:7.9.6" + checksum: 10c0/639bcf58094530eb8509b302de9c42fc1a9e44e236bcbfd218e987aba7a2c15052c3a1cac7ca7f260255e74beb3b489ff877b9870f8587394457cd3aa9f64934 + languageName: node + linkType: hard + "@types/babel__template@npm:*": version: 7.4.4 resolution: "@types/babel__template@npm:7.4.4" @@ -3458,6 +4966,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + "@types/connect@npm:*": version: 3.4.38 resolution: "@types/connect@npm:3.4.38" @@ -3534,6 +5054,26 @@ __metadata: languageName: node linkType: hard +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.56.10 + resolution: "@types/eslint@npm:8.56.10" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3 + languageName: node + linkType: hard + "@types/estree-jsx@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree-jsx@npm:1.0.5" @@ -3543,7 +5083,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d @@ -3607,6 +5147,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + "@types/http-errors@npm:*": version: 2.0.4 resolution: "@types/http-errors@npm:2.0.4" @@ -3614,6 +5161,22 @@ __metadata: languageName: node linkType: hard +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.167": version: 4.17.4 resolution: "@types/lodash@npm:4.17.4" @@ -3676,6 +5239,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.9.0": + version: 20.14.2 + resolution: "@types/node@npm:20.14.2" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/2d86e5f2227aaa42212e82ea0affe72799111b888ff900916376450b02b09b963ca888b20d9c332d8d2b833ed4781987867a38eaa2e4863fa8439071468b0a6f + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -3738,6 +5310,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + "@types/semver@npm:^7.3.4": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" @@ -3794,6 +5375,15 @@ __metadata: languageName: node linkType: hard +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:7.10.0": version: 7.10.0 resolution: "@typescript-eslint/eslint-plugin@npm:7.10.0" @@ -4048,6 +5638,190 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc + languageName: node + linkType: hard + "@xterm/addon-fit@npm:^0.10.0": version: 0.10.0 resolution: "@xterm/addon-fit@npm:0.10.0" @@ -4064,6 +5838,20 @@ __metadata: languageName: node linkType: hard +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + "@yarnpkg/esbuild-plugin-pnp@npm:^3.0.0-rc.10": version: 3.0.0-rc.15 resolution: "@yarnpkg/esbuild-plugin-pnp@npm:3.0.0-rc.15" @@ -4112,6 +5900,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -4144,7 +5941,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.4.1": +"acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -4179,7 +5976,41 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4": +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -4191,6 +6022,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.0, ajv@npm:^8.9.0": + version: 8.16.0 + resolution: "ajv@npm:8.16.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.4.1" + checksum: 10c0/6fc38aa8fd4fbfaa7096ac049e48c0cb440db36b76fef2d7d5b7d92b102735670d055d412d19176c08c9d48eaa9d06661b67e59f04943dc71ab1551e0484f88c + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -4373,6 +6216,28 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:^9.1.3": + version: 9.1.3 + resolution: "babel-loader@npm:9.1.3" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10c0/e3fc3c9e02bd908b37e8e8cd4f3d7280cf6ac45e33fc203aedbb615135a0fecc33bf92573b71a166a827af029d302c0b060354985cd91d510320bd70a2f949eb + languageName: node + linkType: hard + +"babel-plugin-jsx-control-statements@npm:^4.1.2": + version: 4.1.2 + resolution: "babel-plugin-jsx-control-statements@npm:4.1.2" + dependencies: + "@babel/core": "npm:^7.1.2" + checksum: 10c0/5212537e08f41a8bbfecfd33bb633573b0460a5636aeb6b034cf44c2a6cea5439ca92499e1a114a83e9d09b6dcca410a21c39aeafba12acf675790e3a47c9a55 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.10": version: 0.4.11 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" @@ -4386,7 +6251,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.4": +"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": version: 0.10.4 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: @@ -4498,6 +6363,13 @@ __metadata: languageName: node linkType: hard +"boolean@npm:^3.0.1": + version: 3.2.0 + resolution: "boolean@npm:3.2.0" + checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf + languageName: node + linkType: hard + "bplist-parser@npm:^0.2.0": version: 0.2.0 resolution: "bplist-parser@npm:0.2.0" @@ -4551,7 +6423,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": +"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -4565,6 +6437,13 @@ __metadata: languageName: node linkType: hard +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -4623,6 +6502,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" @@ -4792,6 +6693,13 @@ __metadata: languageName: node linkType: hard +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 + languageName: node + linkType: hard + "citty@npm:^0.1.6": version: 0.1.6 resolution: "citty@npm:0.1.6" @@ -4848,6 +6756,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -4894,6 +6811,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + "comma-separated-tokens@npm:^2.0.0": version: 2.0.3 resolution: "comma-separated-tokens@npm:2.0.3" @@ -4908,6 +6832,20 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + "commander@npm:^6.2.1": version: 6.2.1 resolution: "commander@npm:6.2.1" @@ -4922,6 +6860,13 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -5020,6 +6965,22 @@ __metadata: languageName: node linkType: hard +"copy-webpack-plugin@npm:^12.0.2": + version: 12.0.2 + resolution: "copy-webpack-plugin@npm:12.0.2" + dependencies: + fast-glob: "npm:^3.3.2" + glob-parent: "npm:^6.0.1" + globby: "npm:^14.0.0" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.2.0" + serialize-javascript: "npm:^6.0.2" + peerDependencies: + webpack: ^5.1.0 + checksum: 10c0/1a2715a1280a37b81b7040b89ed962db4aa75475b164f84f266fa4e81f209269b13f8bff10b104dff7558854bafedcdd4f30c40fd23ecd8fa28af45516b459cd + languageName: node + linkType: hard + "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": version: 3.37.1 resolution: "core-js-compat@npm:3.37.1" @@ -5061,6 +7022,30 @@ __metadata: languageName: node linkType: hard +"css-loader@npm:^7.1.2": + version: 7.1.2 + resolution: "css-loader@npm:7.1.2" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/edec9ed71e3c416c9c6ad41c138834c94baf7629de3b97a3337ae8cec4a45e05c57bdb7c4b4d267229fc04b8970d0d1c0734ded8dcd0ac8c7c286b36facdbbf0 + languageName: node + linkType: hard + "css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -5068,6 +7053,15 @@ __metadata: languageName: node linkType: hard +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -5393,6 +7387,13 @@ __metadata: languageName: node linkType: hard +"dayjs@npm:^1.11.11": + version: 1.11.11 + resolution: "dayjs@npm:1.11.11" + checksum: 10c0/0131d10516b9945f05a57e13f4af49a6814de5573a494824e103131a3bbe4cc470b1aefe8e17e51f9a478a22cd116084be1ee5725cedb66ec4c3f9091202dc4b + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -5423,6 +7424,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" @@ -5484,6 +7494,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -5580,6 +7597,13 @@ __metadata: languageName: node linkType: hard +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + "detect-package-manager@npm:^2.0.1": version: 2.0.1 resolution: "detect-package-manager@npm:2.0.1" @@ -5733,6 +7757,41 @@ __metadata: languageName: node linkType: hard +"electron-vite@npm:^2.2.0": + version: 2.2.0 + resolution: "electron-vite@npm:2.2.0" + dependencies: + "@babel/core": "npm:^7.23.5" + "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" + cac: "npm:^6.7.14" + esbuild: "npm:^0.19.8" + magic-string: "npm:^0.30.5" + picocolors: "npm:^1.0.0" + peerDependencies: + "@swc/core": ^1.0.0 + vite: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + "@swc/core": + optional: true + bin: + electron-vite: bin/electron-vite.js + checksum: 10c0/9fe6043a8507697d6a1ff7c7d199da6057660b9d0536e3cc3fc5f8e7bdc5bb5be16b07135304b5c50912bff3c93d675558eeeaebbe9b21d0bc16469f0ed077bd + languageName: node + linkType: hard + +"electron@npm:^30.1.0": + version: 30.1.0 + resolution: "electron@npm:30.1.0" + dependencies: + "@electron/get": "npm:^2.0.0" + "@types/node": "npm:^20.9.0" + extract-zip: "npm:^2.0.1" + bin: + electron: cli.js + checksum: 10c0/e17c5fdf275f8cd457086adfa05db7507d08dd9264024d80eae8e55eb01927d062b63223a1a15b3ac024ebe2c34cc4b3ceb5cc0ac3ded4721c4ac9be4e5fe33c + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -5772,6 +7831,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.16.0, enhanced-resolve@npm:^5.7.0": + version: 5.17.0 + resolution: "enhanced-resolve@npm:5.17.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/90065e58e4fd08e77ba47f827eaa17d60c335e01e4859f6e644bb3b8d0e32b203d33894aee92adfa5121fa262f912b48bdf0d0475e98b4a0a1132eea1169ad37 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -5848,13 +7917,20 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.5.0": +"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.0": version: 1.5.3 resolution: "es-module-lexer@npm:1.5.3" checksum: 10c0/0f50b655490d1048432eac6eec94d99d3933119666ae82be578c3db1ea4b2c594118a336f6b7a3c4e2815355dcc9a469d880acef1c45aa656a5aae8c8ae8e5f6 languageName: node linkType: hard +"es6-error@npm:^4.1.1": + version: 4.1.1 + resolution: "es6-error@npm:4.1.1" + checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef + languageName: node + linkType: hard + "esbuild-plugin-alias@npm:^0.2.1": version: 0.2.1 resolution: "esbuild-plugin-alias@npm:0.2.1" @@ -5953,6 +8029,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.19.8": + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": "npm:0.19.12" + "@esbuild/android-arm": "npm:0.19.12" + "@esbuild/android-arm64": "npm:0.19.12" + "@esbuild/android-x64": "npm:0.19.12" + "@esbuild/darwin-arm64": "npm:0.19.12" + "@esbuild/darwin-x64": "npm:0.19.12" + "@esbuild/freebsd-arm64": "npm:0.19.12" + "@esbuild/freebsd-x64": "npm:0.19.12" + "@esbuild/linux-arm": "npm:0.19.12" + "@esbuild/linux-arm64": "npm:0.19.12" + "@esbuild/linux-ia32": "npm:0.19.12" + "@esbuild/linux-loong64": "npm:0.19.12" + "@esbuild/linux-mips64el": "npm:0.19.12" + "@esbuild/linux-ppc64": "npm:0.19.12" + "@esbuild/linux-riscv64": "npm:0.19.12" + "@esbuild/linux-s390x": "npm:0.19.12" + "@esbuild/linux-x64": "npm:0.19.12" + "@esbuild/netbsd-x64": "npm:0.19.12" + "@esbuild/openbsd-x64": "npm:0.19.12" + "@esbuild/sunos-x64": "npm:0.19.12" + "@esbuild/win32-arm64": "npm:0.19.12" + "@esbuild/win32-ia32": "npm:0.19.12" + "@esbuild/win32-x64": "npm:0.19.12" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/0f2d21ffe24ebead64843f87c3aebe2e703a5ed9feb086a0728b24907fac2eb9923e4a79857d3df9059c915739bd7a870dd667972eae325c67f478b592b8582d + languageName: node + linkType: hard + "escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -6017,6 +8173,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + "eslint-scope@npm:^8.0.1": version: 8.0.1 resolution: "eslint-scope@npm:8.0.1" @@ -6124,6 +8290,13 @@ __metadata: languageName: node linkType: hard +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -6168,6 +8341,13 @@ __metadata: languageName: node linkType: hard +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + "execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -6255,6 +8435,23 @@ __metadata: languageName: node linkType: hard +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + 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" @@ -6289,6 +8486,13 @@ __metadata: languageName: node linkType: hard +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.17.1 resolution: "fastq@npm:1.17.1" @@ -6298,6 +8502,15 @@ __metadata: languageName: node linkType: hard +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + "fetch-retry@npm:^5.0.2": version: 5.0.6 resolution: "fetch-retry@npm:5.0.6" @@ -6386,6 +8599,16 @@ __metadata: languageName: node linkType: hard +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: "npm:^3.0.0" + pkg-dir: "npm:^7.0.0" + checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + languageName: node + linkType: hard + "find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -6415,6 +8638,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + "flat-cache@npm:^4.0.0": version: 4.0.1 resolution: "flat-cache@npm:4.0.1" @@ -6425,6 +8658,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.3.1 resolution: "flatted@npm:3.3.1" @@ -6501,6 +8743,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -6600,6 +8853,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -6648,7 +8910,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -6704,6 +8966,20 @@ __metadata: languageName: node linkType: hard +"global-agent@npm:^3.0.0": + version: 3.0.0 + resolution: "global-agent@npm:3.0.0" + dependencies: + boolean: "npm:^3.0.1" + es6-error: "npm:^4.1.1" + matcher: "npm:^3.0.0" + roarr: "npm:^2.15.3" + semver: "npm:^7.3.2" + serialize-error: "npm:^7.0.1" + checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -6718,6 +8994,16 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.1": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + "globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -6732,7 +9018,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^14.0.1": +"globby@npm:^14.0.0, globby@npm:^14.0.1": version: 14.0.1 resolution: "globby@npm:14.0.1" dependencies: @@ -6762,7 +9048,26 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -6975,7 +9280,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc @@ -7005,6 +9310,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1": version: 7.0.4 resolution: "https-proxy-agent@npm:7.0.4" @@ -7047,6 +9362,15 @@ __metadata: languageName: node linkType: hard +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + "ieee754@npm:^1.1.13": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -7087,6 +9411,18 @@ __metadata: languageName: node linkType: hard +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -7143,6 +9479,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 + languageName: node + linkType: hard + "interval-tree-1d@npm:^1.0.0": version: 1.0.4 resolution: "interval-tree-1d@npm:1.0.4" @@ -7670,6 +10013,17 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + languageName: node + linkType: hard + "jotai@npm:^2.8.0": version: 2.8.0 resolution: "jotai@npm:2.8.0" @@ -7777,7 +10131,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0": +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 @@ -7791,6 +10145,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -7798,6 +10159,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + "json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -7807,6 +10175,18 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1, jsonfile@npm:^6.1.0": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -7820,7 +10200,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.4": +"keyv@npm:^4.0.0, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -7854,6 +10234,22 @@ __metadata: languageName: node linkType: hard +"less-loader@npm:^12.2.0": + version: 12.2.0 + resolution: "less-loader@npm:12.2.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/54eea545727930801d2ccc0b586332cd07d0f922b14ab7c8b3f03199944d770ac363081081ed2fda5f23da904336367cb2bb40007c033970dce25f7f9c906ba2 + languageName: node + linkType: hard + "less@npm:^4.2.0": version: 4.2.0 resolution: "less@npm:4.2.0" @@ -7913,6 +10309,13 @@ __metadata: languageName: node linkType: hard +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 + languageName: node + linkType: hard + "local-pkg@npm:^0.5.0": version: 0.5.0 resolution: "local-pkg@npm:0.5.0" @@ -7951,6 +10354,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -8009,6 +10421,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.2.2 resolution: "lru-cache@npm:10.2.2" @@ -8141,6 +10560,15 @@ __metadata: languageName: node linkType: hard +"matcher@npm:^3.0.0": + version: 3.0.0 + resolution: "matcher@npm:3.0.0" + dependencies: + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e + languageName: node + linkType: hard + "mdast-util-find-and-replace@npm:^3.0.0": version: 3.0.1 resolution: "mdast-util-find-and-replace@npm:3.0.1" @@ -8741,7 +11169,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -8773,6 +11201,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -8780,6 +11222,18 @@ __metadata: languageName: node linkType: hard +"mini-css-extract-plugin@npm:^2.9.0": + version: 2.9.0 + resolution: "mini-css-extract-plugin@npm:2.9.0" + dependencies: + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/46e20747ea250420db8a82801b9779299ce3cd5ec4d6dd75e00904c39cc80f0f01decaa534b8cb9658d7d3b656b919cb2cc84b1ba7e2394d2d6548578a5c2901 + languageName: node + linkType: hard + "minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -9092,6 +11546,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -9260,6 +11721,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + "p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -9278,6 +11746,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + "p-limit@npm:^5.0.0": version: 5.0.0 resolution: "p-limit@npm:5.0.0" @@ -9314,6 +11791,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -9402,6 +11888,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -9486,6 +11979,13 @@ __metadata: languageName: node linkType: hard +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -9523,7 +12023,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0": +"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -9541,6 +12041,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + languageName: node + linkType: hard + "pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.0": version: 1.1.1 resolution: "pkg-types@npm:1.1.1" @@ -9568,7 +12077,68 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.38": +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.0.5 + resolution: "postcss-modules-local-by-default@npm:4.0.5" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^6.0.2" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/f4ad35abeb685ecb25f80c93d9fe23c8b89ee45ac4185f3560e701b4d7372f9b798577e79c5ed03b6d9c80bc923b001210c127c04ced781f43cda9e32b202a5b + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.0 + resolution: "postcss-modules-scope@npm:3.2.0" + dependencies: + postcss-selector-parser: "npm:^6.0.4" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/a2f5ffe372169b3feb8628cd785eb748bf12e344cfa57bce9e5cdc4fa5adcdb40d36daa86bb35dad53427703b185772aad08825b5783f745fcb1b6039454a84b + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": + version: 6.1.0 + resolution: "postcss-selector-parser@npm:6.1.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/91e9c6434772506bc7f318699dd9d19d32178b52dfa05bed24cb0babbdab54f8fb765d9920f01ac548be0a642aab56bce493811406ceb00ae182bbb53754c473 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 + languageName: node + linkType: hard + +"postcss@npm:^8.4.33, postcss@npm:^8.4.38": version: 8.4.38 resolution: "postcss@npm:8.4.38" dependencies: @@ -9682,6 +12252,13 @@ __metadata: languageName: node linkType: hard +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -9800,6 +12377,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -9807,6 +12391,15 @@ __metadata: languageName: node linkType: hard +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -10122,6 +12715,15 @@ __metadata: languageName: node linkType: hard +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: "npm:^1.20.0" + checksum: 10c0/1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff + languageName: node + linkType: hard + "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -10287,6 +12889,29 @@ __metadata: languageName: node linkType: hard +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -10301,7 +12926,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.22.1, resolve@npm:^1.22.8": +"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -10314,7 +12939,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -10327,6 +12952,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -10373,6 +13007,20 @@ __metadata: languageName: node linkType: hard +"roarr@npm:^2.15.3": + version: 2.15.4 + resolution: "roarr@npm:2.15.4" + dependencies: + boolean: "npm:^3.0.1" + detect-node: "npm:^2.0.4" + globalthis: "npm:^1.0.1" + json-stringify-safe: "npm:^5.0.1" + semver-compare: "npm:^1.0.0" + sprintf-js: "npm:^1.1.2" + checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec + languageName: node + linkType: hard + "robust-predicates@npm:^3.0.2": version: 3.0.2 resolution: "robust-predicates@npm:3.0.2" @@ -10475,7 +13123,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -10505,6 +13153,36 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -10514,7 +13192,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.2.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -10523,7 +13201,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.2 resolution: "semver@npm:7.6.2" bin: @@ -10553,6 +13231,24 @@ __metadata: languageName: node linkType: hard +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + "serve-static@npm:1.15.0": version: 1.15.0 resolution: "serve-static@npm:1.15.0" @@ -10712,7 +13408,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.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -10770,7 +13466,7 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": +"sprintf-js@npm:^1.1.2, sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec @@ -10972,6 +13668,15 @@ __metadata: languageName: node linkType: hard +"style-loader@npm:^4.0.0": + version: 4.0.0 + resolution: "style-loader@npm:4.0.0" + peerDependencies: + webpack: ^5.27.0 + checksum: 10c0/214bc0f3b018f8c374f79b9fa16da43df78c7fef2261e9a99e36c2f8387601fad10ac75a171aa8edba75903db214bc46952ae08b94a1f8544bd146c2c8d07d27 + languageName: node + linkType: hard + "style-to-object@npm:^1.0.0": version: 1.0.6 resolution: "style-to-object@npm:1.0.6" @@ -10981,6 +13686,15 @@ __metadata: languageName: node linkType: hard +"sumchecker@npm:^3.0.1": + version: 3.0.1 + resolution: "sumchecker@npm:3.0.1" + dependencies: + debug: "npm:^4.1.0" + checksum: 10c0/43c387be9dfe22dbeaf39dfa4ffb279847aeb37a42a8988c0b066f548bbd209aa8c65e03da29f2b29be1a66b577801bf89fff0007df4183db2f286263a9569e5 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -10999,6 +13713,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -11006,6 +13729,13 @@ __metadata: languageName: node linkType: hard +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + "tar-fs@npm:^2.1.1": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -11083,6 +13813,42 @@ __metadata: languageName: node linkType: hard +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + +"terser@npm:^5.26.0": + version: 5.31.1 + resolution: "terser@npm:5.31.1" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/4d49a58f64c11f3742e779a0a03aff69972ca5739decb361d909d22c8f3f7d8e2ec982a928d987d56737ad50229e8ab3f62d8ba993e4b5f360a53ed487d3c06c + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -11105,6 +13871,16 @@ __metadata: version: 0.0.0-use.local resolution: "thenextwave@workspace:." dependencies: + "@babel/core": "npm:^7.24.7" + "@babel/plugin-proposal-class-properties": "npm:^7.18.6" + "@babel/plugin-proposal-decorators": "npm:^7.24.7" + "@babel/plugin-proposal-private-methods": "npm:^7.18.6" + "@babel/plugin-proposal-private-property-in-object": "npm:^7.21.11" + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/preset-env": "npm:^7.24.7" + "@babel/preset-react": "npm:^7.24.7" + "@babel/preset-typescript": "npm:^7.24.7" "@chromatic-com/storybook": "npm:^1.5.0" "@eslint/js": "npm:^9.2.0" "@monaco-editor/loader": "npm:^1.4.0" @@ -11120,6 +13896,9 @@ __metadata: "@storybook/react-vite": "npm:^8.1.4" "@storybook/test": "npm:^8.1.4" "@tanstack/react-table": "npm:^8.17.3" + "@types/babel__core": "npm:^7" + "@types/babel__plugin-transform-runtime": "npm:^7" + "@types/babel__preset-env": "npm:^7" "@types/node": "npm:^20.12.12" "@types/react": "npm:^18.3.2" "@types/throttle-debounce": "npm:^5" @@ -11129,14 +13908,23 @@ __metadata: "@wailsio/runtime": "npm:^3.0.0-alpha.24" "@xterm/addon-fit": "npm:^0.10.0" "@xterm/xterm": "npm:^5.5.0" + babel-loader: "npm:^9.1.3" + babel-plugin-jsx-control-statements: "npm:^4.1.2" base64-js: "npm:^1.5.1" clsx: "npm:^2.1.1" + copy-webpack-plugin: "npm:^12.0.2" + css-loader: "npm:^7.1.2" + dayjs: "npm:^1.11.11" + electron: "npm:^30.1.0" + electron-vite: "npm:^2.2.0" eslint: "npm:^9.2.0" eslint-config-prettier: "npm:^9.1.0" html-to-image: "npm:^1.11.11" immer: "npm:^10.1.1" jotai: "npm:^2.8.0" less: "npm:^4.2.0" + less-loader: "npm:^12.2.0" + mini-css-extract-plugin: "npm:^2.9.0" monaco-editor: "npm:^0.49.0" prettier: "npm:^3.2.5" prettier-plugin-jsdoc: "npm:^1.3.0" @@ -11149,8 +13937,10 @@ __metadata: remark-gfm: "npm:^4.0.0" rxjs: "npm:^7.8.1" storybook: "npm:^8.1.4" + style-loader: "npm:^4.0.0" throttle-debounce: "npm:^5.0.0" ts-node: "npm:^10.9.2" + tsconfig-paths-webpack-plugin: "npm:^4.1.0" tslib: "npm:^2.6.2" typescript: "npm:^5.4.5" typescript-eslint: "npm:^7.8.0" @@ -11159,6 +13949,8 @@ __metadata: vite-plugin-static-copy: "npm:^1.0.5" vite-tsconfig-paths: "npm:^4.3.2" vitest: "npm:^1.6.0" + webpack: "npm:^5.91.0" + webpack-cli: "npm:^5.1.4" languageName: unknown linkType: soft @@ -11326,7 +14118,18 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^4.2.0": +"tsconfig-paths-webpack-plugin@npm:^4.1.0": + version: 4.1.0 + resolution: "tsconfig-paths-webpack-plugin@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.7.0" + tsconfig-paths: "npm:^4.1.2" + checksum: 10c0/c030e867e70a3f6d1799fdffa209c3a35e1435ad99aac01946b9ebb0fa8208b7b508c1dfe8c8e13d6a2ef70c75b4db062fbfd3c1f3362c69b6c65ffd4a50e226 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^4.1.2, tsconfig-paths@npm:^4.2.0": version: 4.2.0 resolution: "tsconfig-paths@npm:4.2.0" dependencies: @@ -11374,6 +14177,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + "type-fest@npm:^0.16.0": version: 0.16.0 resolution: "type-fest@npm:0.16.0" @@ -11609,6 +14419,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -11656,7 +14473,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -11912,7 +14729,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.2.0": +"watchpack@npm:^2.2.0, watchpack@npm:^2.4.1": version: 2.4.1 resolution: "watchpack@npm:2.4.1" dependencies: @@ -11938,6 +14755,49 @@ __metadata: languageName: node linkType: hard +"webpack-cli@npm:^5.1.4": + version: 5.1.4 + resolution: "webpack-cli@npm:5.1.4" + dependencies: + "@discoveryjs/json-ext": "npm:^0.5.0" + "@webpack-cli/configtest": "npm:^2.1.1" + "@webpack-cli/info": "npm:^2.0.2" + "@webpack-cli/serve": "npm:^2.0.5" + colorette: "npm:^2.0.14" + commander: "npm:^10.0.1" + cross-spawn: "npm:^7.0.3" + envinfo: "npm:^7.7.3" + fastest-levenshtein: "npm:^1.0.12" + import-local: "npm:^3.0.2" + interpret: "npm:^3.1.1" + rechoir: "npm:^0.8.0" + webpack-merge: "npm:^5.7.3" + peerDependencies: + webpack: 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 10c0/4266909ae5e2e662c8790ac286e965b2c7fd5a4a2f07f48e28576234c9a5f631847ccddc18e1b3281c7b4be04a7ff4717d2636033a322dde13ac995fd0d9de10 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.7.3": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.0" + checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b + languageName: node + linkType: hard + "webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" @@ -11952,6 +14812,43 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5.91.0": + version: 5.91.0 + resolution: "webpack@npm:5.91.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.16.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/74a3e0ea1c9a492accf035317f31769ffeaaab415811524b9f17bc7bf7012c5b6e1a9860df5ca6903f3ae2618727b801eb47d9351a2595dfffb25941d368b88c + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -12034,6 +14931,13 @@ __metadata: languageName: node linkType: hard +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -12124,6 +15028,16 @@ __metadata: languageName: node linkType: hard +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1"