From ecde3fb71a8f120e71d4781c11214db750042cc4 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira <118899497+lucasfernog-crabnebula@users.noreply.github.com> Date: Thu, 16 Nov 2023 21:54:49 -0300 Subject: [PATCH 1/5] feat(packager): add Node.js bindings, ref #47 (#58) * feat(packager): add Node.js bindings Co-authored-by: amr-crabnebula --- .changes/appimage-files.md | 5 + .changes/binary-path-breaking-change.md | 5 + .changes/config.json | 66 + .changes/packager-nodejs-initial-release.md | 5 + .github/workflows/check-packager-binding.yml | 64 + .../workflows/covector-version-or-publish.yml | 22 + .github/workflows/publish-packager-nodejs.yml | 465 +++++ Cargo.lock | 217 +- Cargo.toml | 11 +- bindings/packager/nodejs/.cargo/config.toml | 7 + bindings/packager/nodejs/.gitignore | 200 ++ bindings/packager/nodejs/.npmignore | 13 + bindings/packager/nodejs/.npmrc | 1 + bindings/packager/nodejs/Cargo.toml | 26 + .../packager/nodejs/__test__/index.spec.mjs | 14 + bindings/packager/nodejs/build.rs | 5 + .../packager/nodejs/generate-config-type.js | 7 + bindings/packager/nodejs/index.d.ts | 9 + bindings/packager/nodejs/index.js | 260 +++ .../nodejs/npm/darwin-arm64/README.md | 3 + .../nodejs/npm/darwin-arm64/package.json | 18 + .../packager/nodejs/npm/darwin-x64/README.md | 3 + .../nodejs/npm/darwin-x64/package.json | 18 + .../nodejs/npm/linux-arm-gnueabihf/README.md | 3 + .../npm/linux-arm-gnueabihf/package.json | 18 + .../nodejs/npm/linux-arm64-gnu/README.md | 3 + .../nodejs/npm/linux-arm64-gnu/package.json | 21 + .../nodejs/npm/linux-arm64-musl/README.md | 3 + .../nodejs/npm/linux-arm64-musl/package.json | 21 + .../nodejs/npm/linux-x64-gnu/README.md | 3 + .../nodejs/npm/linux-x64-gnu/package.json | 21 + .../nodejs/npm/linux-x64-musl/README.md | 3 + .../nodejs/npm/linux-x64-musl/package.json | 21 + .../nodejs/npm/win32-arm64-msvc/README.md | 3 + .../nodejs/npm/win32-arm64-msvc/package.json | 18 + .../nodejs/npm/win32-ia32-msvc/README.md | 3 + .../nodejs/npm/win32-ia32-msvc/package.json | 18 + .../nodejs/npm/win32-x64-msvc/README.md | 3 + .../nodejs/npm/win32-x64-msvc/package.json | 18 + bindings/packager/nodejs/package.json | 62 + bindings/packager/nodejs/packager.js | 53 + bindings/packager/nodejs/pnpm-lock.yaml | 1772 +++++++++++++++++ bindings/packager/nodejs/src-ts/config.d.ts | 568 ++++++ bindings/packager/nodejs/src-ts/index.ts | 41 + .../nodejs/src-ts/plugins/electron/index.ts | 211 ++ .../nodejs/src-ts/plugins/electron/prune.ts | 93 + .../packager/nodejs/src-ts/plugins/index.ts | 56 + bindings/packager/nodejs/src/lib.rs | 26 + bindings/packager/nodejs/tsconfig.json | 29 + crates/packager/Cargo.toml | 24 +- crates/packager/schema.json | 16 +- crates/packager/src/cli/config.rs | 2 +- crates/packager/src/cli/mod.rs | 86 +- crates/packager/src/config/mod.rs | 23 +- crates/packager/src/error.rs | 3 + crates/packager/src/lib.rs | 31 + crates/packager/src/main.rs | 28 +- crates/packager/src/package/app/mod.rs | 10 +- crates/packager/src/package/appimage/appimage | 2 +- crates/packager/src/package/appimage/mod.rs | 4 + crates/packager/src/package/deb/mod.rs | 72 +- crates/packager/src/package/nsis/mod.rs | 30 +- crates/packager/src/package/wix/mod.rs | 40 +- examples/deno/packager.json | 2 +- examples/electron/.gitignore | 2 + examples/electron/electron.png | Bin 0 -> 19236 bytes examples/electron/index.html | 18 + examples/electron/main.js | 26 + examples/electron/package.json | 30 + examples/electron/preload.js | 10 + package.json | 3 + pnpm-lock.yaml | 1755 ++++++++++++++++ pnpm-workspace.yaml | 3 + 73 files changed, 6595 insertions(+), 160 deletions(-) create mode 100644 .changes/appimage-files.md create mode 100644 .changes/binary-path-breaking-change.md create mode 100644 .changes/packager-nodejs-initial-release.md create mode 100644 .github/workflows/check-packager-binding.yml create mode 100644 .github/workflows/publish-packager-nodejs.yml create mode 100644 bindings/packager/nodejs/.cargo/config.toml create mode 100644 bindings/packager/nodejs/.gitignore create mode 100644 bindings/packager/nodejs/.npmignore create mode 100644 bindings/packager/nodejs/.npmrc create mode 100644 bindings/packager/nodejs/Cargo.toml create mode 100644 bindings/packager/nodejs/__test__/index.spec.mjs create mode 100644 bindings/packager/nodejs/build.rs create mode 100644 bindings/packager/nodejs/generate-config-type.js create mode 100644 bindings/packager/nodejs/index.d.ts create mode 100644 bindings/packager/nodejs/index.js create mode 100644 bindings/packager/nodejs/npm/darwin-arm64/README.md create mode 100644 bindings/packager/nodejs/npm/darwin-arm64/package.json create mode 100644 bindings/packager/nodejs/npm/darwin-x64/README.md create mode 100644 bindings/packager/nodejs/npm/darwin-x64/package.json create mode 100644 bindings/packager/nodejs/npm/linux-arm-gnueabihf/README.md create mode 100644 bindings/packager/nodejs/npm/linux-arm-gnueabihf/package.json create mode 100644 bindings/packager/nodejs/npm/linux-arm64-gnu/README.md create mode 100644 bindings/packager/nodejs/npm/linux-arm64-gnu/package.json create mode 100644 bindings/packager/nodejs/npm/linux-arm64-musl/README.md create mode 100644 bindings/packager/nodejs/npm/linux-arm64-musl/package.json create mode 100644 bindings/packager/nodejs/npm/linux-x64-gnu/README.md create mode 100644 bindings/packager/nodejs/npm/linux-x64-gnu/package.json create mode 100644 bindings/packager/nodejs/npm/linux-x64-musl/README.md create mode 100644 bindings/packager/nodejs/npm/linux-x64-musl/package.json create mode 100644 bindings/packager/nodejs/npm/win32-arm64-msvc/README.md create mode 100644 bindings/packager/nodejs/npm/win32-arm64-msvc/package.json create mode 100644 bindings/packager/nodejs/npm/win32-ia32-msvc/README.md create mode 100644 bindings/packager/nodejs/npm/win32-ia32-msvc/package.json create mode 100644 bindings/packager/nodejs/npm/win32-x64-msvc/README.md create mode 100644 bindings/packager/nodejs/npm/win32-x64-msvc/package.json create mode 100644 bindings/packager/nodejs/package.json create mode 100644 bindings/packager/nodejs/packager.js create mode 100644 bindings/packager/nodejs/pnpm-lock.yaml create mode 100644 bindings/packager/nodejs/src-ts/config.d.ts create mode 100644 bindings/packager/nodejs/src-ts/index.ts create mode 100644 bindings/packager/nodejs/src-ts/plugins/electron/index.ts create mode 100644 bindings/packager/nodejs/src-ts/plugins/electron/prune.ts create mode 100644 bindings/packager/nodejs/src-ts/plugins/index.ts create mode 100644 bindings/packager/nodejs/src/lib.rs create mode 100644 bindings/packager/nodejs/tsconfig.json create mode 100644 examples/electron/.gitignore create mode 100644 examples/electron/electron.png create mode 100644 examples/electron/index.html create mode 100644 examples/electron/main.js create mode 100644 examples/electron/package.json create mode 100644 examples/electron/preload.js create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.changes/appimage-files.md b/.changes/appimage-files.md new file mode 100644 index 00000000..99962a9d --- /dev/null +++ b/.changes/appimage-files.md @@ -0,0 +1,5 @@ +--- +"cargo-packager": minor +--- + +Added `files` configuration under `AppImageConfig` for adding custom files on the AppImage's AppDir. diff --git a/.changes/binary-path-breaking-change.md b/.changes/binary-path-breaking-change.md new file mode 100644 index 00000000..29c15e6d --- /dev/null +++ b/.changes/binary-path-breaking-change.md @@ -0,0 +1,5 @@ +--- +"cargo-packager": minor +--- + +Renamed binary `filename` property to `path`, which supports absolute paths. diff --git a/.changes/config.json b/.changes/config.json index 5069f7ad..bc1822c1 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -31,6 +31,64 @@ "git tag ${ pkg.pkg }-v${ pkgFile.versionMajor }.${ pkgFile.versionMinor } -f", "git push --tags -f" ] + }, + "javascript": { + "version": true, + "getPublishedVersion": { + "use": "fetch:check", + "options": { + "url": "https://registry.npmjs.com/${ pkg.pkg }/${ pkg.pkgFile.version }" + } + }, + "prepublish": [ + { + "command": "pnpm install", + "dryRunCommand": true + }, + { + "command": "echo '
\n

PNPM Audit

\n\n```'", + "dryRunCommand": true, + "pipe": true + }, + { + "command": "pnpm audit", + "dryRunCommand": true, + "runFromRoot": true, + "pipe": true + }, + { + "command": "echo '```\n\n
\n'", + "dryRunCommand": true, + "pipe": true + }, + { + "command": "npm pack", + "dryRunCommand": true + } + ], + "publish": [ + "sleep 15s", + { + "command": "echo '
\n

PNPM Publish

\n\n```'", + "dryRunCommand": true, + "pipe": true + }, + { + "command": "pnpm publish --access public", + "dryRunCommand": "npm publish --dry-run --access public", + "pipe": true + }, + { + "command": "echo '```\n\n
\n'", + "dryRunCommand": true, + "pipe": true + } + ], + "postpublish": [ + "git tag ${ pkg.pkg }-v${ pkgFile.versionMajor } -f", + "git tag ${ pkg.pkg }-v${ pkgFile.versionMajor }.${ pkgFile.versionMinor } -f", + "git push --tags -f" + ] } }, "packages": { @@ -44,6 +102,14 @@ "name": "${ pkg.pkg }-${ pkgFile.version }.crate" } ] + }, + "@crabnebula/packager": { + "path": "./bindings/packager/nodejs", + "manager": "javascript", + "dependencies": ["cargo-packager"], + "prepublish": [], + "publish": [], + "postpublish": [] } } } diff --git a/.changes/packager-nodejs-initial-release.md b/.changes/packager-nodejs-initial-release.md new file mode 100644 index 00000000..1c26682d --- /dev/null +++ b/.changes/packager-nodejs-initial-release.md @@ -0,0 +1,5 @@ +--- +"@crabnebula/packager": minor +--- + +Initial release. diff --git a/.github/workflows/check-packager-binding.yml b/.github/workflows/check-packager-binding.yml new file mode 100644 index 00000000..63ea3cb2 --- /dev/null +++ b/.github/workflows/check-packager-binding.yml @@ -0,0 +1,64 @@ +name: Test `@crabnebula/packager` + +on: + push: + branches: + - main + paths: + - ".github/workflows/check-packager-binding.yml" + - "crates/packager/**" + - "bindings/packager/nodejs/**" + pull_request: + branches: + - main + paths: + - ".github/workflows/check-packager-binding.yml" + - "crates/packager/**" + - "bindings/packager/nodejs/**" + +env: + RUST_BACKTRACE: 1 + CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency. + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ${{ matrix.platform }} + + strategy: + fail-fast: false + matrix: + platform: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - uses: actions/checkout@v4 + + - name: install Rust stable + uses: dtolnay/rust-toolchain@stable + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8.6.4 + + - name: setup node + uses: actions/setup-node@v2 + with: + node-version: 18 + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: crates/packager + + - name: test + timeout-minutes: 30 + run: | + cd bindings/packager/nodejs + pnpm install + pnpm build + pnpm test diff --git a/.github/workflows/covector-version-or-publish.yml b/.github/workflows/covector-version-or-publish.yml index cbfb1f2c..077063a6 100644 --- a/.github/workflows/covector-version-or-publish.yml +++ b/.github/workflows/covector-version-or-publish.yml @@ -48,3 +48,25 @@ jobs: commit-message: "release: apply version updates from current changes" labels: "version updates" body: ${{ steps.covector.outputs.change }} + + - name: Get `@crabnebula/packager` release id + uses: actions/github-script@v6 + id: cliReleaseId + if: | + steps.covector.outputs.successfulPublish == 'true' && + contains(steps.covector.outputs.packagesPublished, '@crabnebula/packager') + with: + result-encoding: string + script: | + const output = `${{ toJSON(steps.covector.outputs) }}`; + const [_, id] = /"-crabnebula-packager-releaseId": "([0-9]+)"/g.exec(output); + return id; + + - name: Trigger `@crabnebula/packager` publishing workflow + if: | + steps.covector.outputs.successfulPublish == 'true' && + contains(steps.covector.outputs.packagesPublished, '@crabnebula/packager') + uses: peter-evans/repository-dispatch@v1 + with: + event-type: publish-packager-nodejs + client-payload: '{"releaseId": "${{ steps.cliReleaseId.outputs.result }}" }' diff --git a/.github/workflows/publish-packager-nodejs.yml b/.github/workflows/publish-packager-nodejs.yml new file mode 100644 index 00000000..1ace28ab --- /dev/null +++ b/.github/workflows/publish-packager-nodejs.yml @@ -0,0 +1,465 @@ +name: Publish `@crabnebula/packager` + +env: + DEBUG: napi:* + APP_NAME: packager + MACOSX_DEPLOYMENT_TARGET: "10.13" + +permissions: + contents: write + id-token: write + +on: + workflow_dispatch: + inputs: + releaseId: + description: "ID of the `@crabnebula/packager` release" + required: true + repository_dispatch: + types: [publish-packager-nodejs] + +defaults: + run: + working-directory: bindings/packager/nodejs + +jobs: + build: + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + build: | + pnpm build + strip -x *.node + - host: windows-latest + build: pnpm build + target: x86_64-pc-windows-msvc + - host: windows-latest + build: | + pnpm build --target i686-pc-windows-msvc + pnpm test + target: i686-pc-windows-msvc + - host: ubuntu-latest + target: x86_64-unknown-linux-gnu + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian + build: | + cd bindings/packager/nodejs + set -e && + pnpm build --target x86_64-unknown-linux-gnu && + strip *.node + - host: ubuntu-latest + target: x86_64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: | + cd bindings/packager/nodejs + set -e + pnpm build + strip *.node + - host: macos-latest + target: aarch64-apple-darwin + build: | + pnpm build --target aarch64-apple-darwin --features native-tls-vendored --cargo-flags="--no-default-features" + strip -x *.node + - host: ubuntu-latest + target: aarch64-unknown-linux-gnu + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 + build: | + cd bindings/packager/nodejs + set -e && + pnpm build --target aarch64-unknown-linux-gnu && + aarch64-unknown-linux-gnu-strip *.node + - host: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + setup: | + sudo apt-get update + sudo apt-get install gcc-arm-linux-gnueabihf -y + build: | + pnpm build --target armv7-unknown-linux-gnueabihf + arm-linux-gnueabihf-strip *.node + - host: ubuntu-latest + target: aarch64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: | + cd bindings/packager/nodejs + set -e && + rustup target add aarch64-unknown-linux-musl && + pnpm build --target aarch64-unknown-linux-musl && + /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node + - host: windows-latest + target: aarch64-pc-windows-msvc + build: pnpm build --target aarch64-pc-windows-msvc --features native-tls-vendored --cargo-flags="--no-default-features" + name: stable - ${{ matrix.settings.target }} - node@18 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Setup node + uses: actions/setup-node@v4 + if: ${{ !matrix.settings.docker }} + with: + node-version: 18 + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + - name: Install + uses: dtolnay/rust-toolchain@stable + if: ${{ !matrix.settings.docker }} + with: + toolchain: stable + targets: ${{ matrix.settings.target }} + - name: Cache cargo + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + .cargo-cache + target/ + key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} + - uses: goto-bus-stop/setup-zig@v2 + if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} + with: + version: 0.11.0 + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Setup node x86 + if: matrix.settings.target == 'i686-pc-windows-msvc' + run: pnpm config set supportedArchitectures.cpu "ia32" + shell: bash + - name: Install dependencies + run: pnpm install + - name: Setup node x86 + uses: actions/setup-node@v4 + if: matrix.settings.target == 'i686-pc-windows-msvc' + with: + node-version: 18 + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + architecture: x86 + - name: Build in docker + uses: addnab/docker-run-action@v3 + if: ${{ matrix.settings.docker }} + with: + image: ${{ matrix.settings.docker }} + options: "--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build" + run: ${{ matrix.settings.build }} + - name: Build + run: ${{ matrix.settings.build }} + if: ${{ !matrix.settings.docker }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: bindings-${{ matrix.settings.target }} + path: bindings/packager/nodejs/${{ env.APP_NAME }}.*.node + if-no-files-found: error + test-macOS-windows-binding: + name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + - host: windows-latest + target: x86_64-pc-windows-msvc + node: + - "18" + - "20" + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + - name: Install dependencies + run: pnpm install + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-${{ matrix.settings.target }} + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: pnpm test + test-linux-x64-gnu-binding: + name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - "18" + - "20" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + - name: Install dependencies + run: pnpm install + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-x86_64-unknown-linux-gnu + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + working-directory: . + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim sh -c "cd bindings/packager/nodejs && PACKAGER_FORMATS=deb yarn test" + test-linux-x64-musl-binding: + name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - "18" + - "20" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + - name: Install dependencies + run: | + pnpm config set supportedArchitectures.libc "musl" + pnpm install + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-x86_64-unknown-linux-musl + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + working-directory: . + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine sh -c "cd bindings/packager/nodejs && PACKAGER_FORMATS=deb yarn test" + test-linux-aarch64-gnu-binding: + name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - "18" + - "20" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-aarch64-unknown-linux-gnu + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Install dependencies + run: | + pnpm config set supportedArchitectures.cpu "arm64" + pnpm config set supportedArchitectures.libc "glibc" + pnpm install + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: arm64 + - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: node:${{ matrix.node }}-slim + options: "--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build" + run: | + export PACKAGER_FORMATS=deb + set -e + cd bindings/packager/nodejs + yarn test + ls -la + test-linux-aarch64-musl-binding: + name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-aarch64-unknown-linux-musl + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Install dependencies + run: | + pnpm config set supportedArchitectures.cpu "arm64" + pnpm config set supportedArchitectures.libc "musl" + pnpm install + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: arm64 + - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: node:lts-alpine + options: "--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build" + run: | + export PACKAGER_FORMATS=deb + set -e + cd bindings/packager/nodejs + yarn test + test-linux-arm-gnueabihf-binding: + name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - "18" + - "20" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: bindings-armv7-unknown-linux-gnueabihf + path: bindings/packager/nodejs + - name: List packages + run: ls -R . + shell: bash + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Install dependencies + run: | + pnpm config set supportedArchitectures.cpu "arm" + pnpm install + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: arm + - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: node:${{ matrix.node }}-bullseye-slim + options: "--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build" + run: | + export PACKAGER_FORMATS=deb + set -e + cd bindings/packager/nodejs + yarn test + ls -la + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - test-macOS-windows-binding + - test-linux-x64-gnu-binding + - test-linux-x64-musl-binding + - test-linux-aarch64-gnu-binding + - test-linux-aarch64-musl-binding + - test-linux-arm-gnueabihf-binding + steps: + - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + package_json_file: bindings/packager/nodejs + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: pnpm + cache-dependency-path: bindings/packager/nodejs/pnpm-lock.yaml + - name: Install dependencies + run: pnpm install + - name: Download all artifacts + uses: actions/download-artifact@v3 + with: + path: bindings/packager/nodejs/artifacts + - name: Move artifacts + run: pnpm artifacts + - name: List packages + run: ls -R ./npm + shell: bash + - name: Publish + run: | + npm config set provenance true + if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --access public + elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --tag next --access public + else + echo "Not a release, skipping publish" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + RELEASE_ID: ${{ github.event.client_payload.releaseId || inputs.releaseId }} diff --git a/Cargo.lock b/Cargo.lock index 353da8c9..f1cea3f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,13 +110,14 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -756,6 +757,7 @@ dependencies = [ "libflate", "md5", "minisign", + "native-tls", "once_cell", "os_pipe", "plist", @@ -1118,6 +1120,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "copypasta" version = "0.8.2" @@ -1271,6 +1282,18 @@ dependencies = [ "libc", ] +[[package]] +name = "crabnebula_packager" +version = "0.0.0" +dependencies = [ + "cargo-packager", + "napi", + "napi-build", + "napi-derive", + "serde_json", + "tracing", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -1474,7 +1497,7 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", @@ -3991,6 +4014,81 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "napi" +version = "2.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd063c93b900149304e3ba96ce5bf210cd4f81ef5eb80ded0d100df3e85a3ac0" +dependencies = [ + "bitflags 2.4.0", + "ctor 0.2.5", + "napi-derive", + "napi-sys", + "once_cell", +] + +[[package]] +name = "napi-build" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e" + +[[package]] +name = "napi-derive" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da1c6a8fa84d549aa8708fcd062372bf8ec6e849de39016ab921067d21bde367" +dependencies = [ + "cfg-if", + "convert_case 0.6.0", + "napi-derive-backend", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "napi-derive-backend" +version = "1.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20bbc7c69168d06a848f925ec5f0e0997f98e8c8d4f2cc30157f0da51c009e17" +dependencies = [ + "convert_case 0.6.0", + "once_cell", + "proc-macro2", + "quote", + "regex", + "semver", + "syn 1.0.109", +] + +[[package]] +name = "napi-sys" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "166b5ef52a3ab5575047a9fe8d4a030cdd0f63c96f071cd6907674453b07bae3" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.6.0" @@ -4317,6 +4415,60 @@ dependencies = [ "critical-section", ] +[[package]] +name = "openssl" +version = "0.10.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "300.1.6+3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -5296,6 +5448,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "schemars" version = "0.8.15" @@ -5374,6 +5535,29 @@ dependencies = [ "tiny-skia 0.8.4", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.22.0" @@ -6873,6 +7057,7 @@ dependencies = [ "base64 0.21.4", "flate2", "log", + "native-tls", "once_cell", "rustls", "rustls-webpki", @@ -6987,6 +7172,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -8006,6 +8197,26 @@ dependencies = [ "zvariant", ] +[[package]] +name = "zerocopy" +version = "0.7.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index 0bf886f1..9fe540fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] -members = ["crates/*", "examples/*"] -exclude = ["examples/deno", "examples/wails"] +members = ["crates/*", "examples/*", "bindings/*/nodejs"] +exclude = ["examples/deno", "examples/wails", "examples/electron"] resolver = "2" [workspace.package] @@ -20,3 +20,10 @@ dirs = "5.0" semver = "1" base64 = "0.21" tracing = "0.1" + +[profile.release-size-optimized] +inherits = "release" +codegen-units = 1 +lto = true +incremental = false +opt-level = "s" diff --git a/bindings/packager/nodejs/.cargo/config.toml b/bindings/packager/nodejs/.cargo/config.toml new file mode 100644 index 00000000..6890aa91 --- /dev/null +++ b/bindings/packager/nodejs/.cargo/config.toml @@ -0,0 +1,7 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" +[target.aarch64-unknown-linux-musl] +linker = "aarch64-linux-musl-gcc" +rustflags = ["-C", "target-feature=-crt-static"] +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" \ No newline at end of file diff --git a/bindings/packager/nodejs/.gitignore b/bindings/packager/nodejs/.gitignore new file mode 100644 index 00000000..9dafc452 --- /dev/null +++ b/bindings/packager/nodejs/.gitignore @@ -0,0 +1,200 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# End of https://www.toptal.com/developers/gitignore/api/node + +# Created by https://www.toptal.com/developers/gitignore/api/macos +# Edit at https://www.toptal.com/developers/gitignore?templates=macos + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +# End of https://www.toptal.com/developers/gitignore/api/macos + +# Created by https://www.toptal.com/developers/gitignore/api/windows +# Edit at https://www.toptal.com/developers/gitignore?templates=windows + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/windows + +# Added by cargo + +/target +Cargo.lock + +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +*.node + +# Dist +build/ \ No newline at end of file diff --git a/bindings/packager/nodejs/.npmignore b/bindings/packager/nodejs/.npmignore new file mode 100644 index 00000000..ec144db2 --- /dev/null +++ b/bindings/packager/nodejs/.npmignore @@ -0,0 +1,13 @@ +target +Cargo.lock +.cargo +.github +npm +.eslintrc +.prettierignore +rustfmt.toml +yarn.lock +*.node +.yarn +__test__ +renovate.json diff --git a/bindings/packager/nodejs/.npmrc b/bindings/packager/nodejs/.npmrc new file mode 100644 index 00000000..6c59086d --- /dev/null +++ b/bindings/packager/nodejs/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/bindings/packager/nodejs/Cargo.toml b/bindings/packager/nodejs/Cargo.toml new file mode 100644 index 00000000..eaf0de9a --- /dev/null +++ b/bindings/packager/nodejs/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "crabnebula_packager" +version = "0.0.0" +publish = false +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix +napi = { version = "2.12.2", default-features = false, features = ["napi4"] } +napi-derive = "2.12.2" +cargo-packager = { path = "../../../crates/packager/", version = "0.3.0", default-features = false, features = ["cli"] } +tracing = { workspace = true } +serde_json = { workspace = true } + +[build-dependencies] +napi-build = "2.0.1" + +[features] +default = ["cargo-packager/rustls"] +native-tls = ["cargo-packager/native-tls"] +native-tls-vendored = ["cargo-packager/native-tls-vendored"] diff --git a/bindings/packager/nodejs/__test__/index.spec.mjs b/bindings/packager/nodejs/__test__/index.spec.mjs new file mode 100644 index 00000000..12f03778 --- /dev/null +++ b/bindings/packager/nodejs/__test__/index.spec.mjs @@ -0,0 +1,14 @@ +import test from 'ava' +import process from 'process' +import { execSync } from "child_process" + +import { bundleApp } from '../build/index.js' + +test('log error', async (t) => { + process.env.CI = true + process.chdir('../../../examples/electron') + execSync('yarn install') + t.is(await bundleApp({ + formats: process.env.PACKAGER_FORMATS ? process.env.PACKAGER_FORMATS.split(',') : null + }, { verbosity: 2 }), undefined) +}) diff --git a/bindings/packager/nodejs/build.rs b/bindings/packager/nodejs/build.rs new file mode 100644 index 00000000..9fc23678 --- /dev/null +++ b/bindings/packager/nodejs/build.rs @@ -0,0 +1,5 @@ +extern crate napi_build; + +fn main() { + napi_build::setup(); +} diff --git a/bindings/packager/nodejs/generate-config-type.js b/bindings/packager/nodejs/generate-config-type.js new file mode 100644 index 00000000..d0739317 --- /dev/null +++ b/bindings/packager/nodejs/generate-config-type.js @@ -0,0 +1,7 @@ +const { compileFromFile } = require('json-schema-to-typescript') +const fs = require('fs') +const path = require('path') + +// compile from file +compileFromFile(path.join(__dirname, '../../../crates/packager/schema.json')) + .then(ts => fs.writeFileSync('src-ts/config.d.ts', ts)) diff --git a/bindings/packager/nodejs/index.d.ts b/bindings/packager/nodejs/index.d.ts new file mode 100644 index 00000000..2cfa5d70 --- /dev/null +++ b/bindings/packager/nodejs/index.d.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export function cli(args: Array, binName?: string | undefined | null): void +export function package(config: string): void +export function initTracingSubscriber(verbosity: number): void +export function logError(error: string): void diff --git a/bindings/packager/nodejs/index.js b/bindings/packager/nodejs/index.js new file mode 100644 index 00000000..5207029a --- /dev/null +++ b/bindings/packager/nodejs/index.js @@ -0,0 +1,260 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + const lddPath = require('child_process').execSync('which ldd').toString().trim() + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'packager.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./packager.android-arm64.node') + } else { + nativeBinding = require('@crabnebula/packager-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'packager.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./packager.android-arm-eabi.node') + } else { + nativeBinding = require('@crabnebula/packager-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'packager.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.win32-x64-msvc.node') + } else { + nativeBinding = require('@crabnebula/packager-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'packager.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.win32-ia32-msvc.node') + } else { + nativeBinding = require('@crabnebula/packager-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'packager.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.win32-arm64-msvc.node') + } else { + nativeBinding = require('@crabnebula/packager-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'packager.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./packager.darwin-universal.node') + } else { + nativeBinding = require('@crabnebula/packager-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'packager.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./packager.darwin-x64.node') + } else { + nativeBinding = require('@crabnebula/packager-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'packager.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.darwin-arm64.node') + } else { + nativeBinding = require('@crabnebula/packager-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'packager.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./packager.freebsd-x64.node') + } else { + nativeBinding = require('@crabnebula/packager-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'packager.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.linux-x64-musl.node') + } else { + nativeBinding = require('@crabnebula/packager-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'packager.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.linux-x64-gnu.node') + } else { + nativeBinding = require('@crabnebula/packager-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'packager.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.linux-arm64-musl.node') + } else { + nativeBinding = require('@crabnebula/packager-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'packager.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.linux-arm64-gnu.node') + } else { + nativeBinding = require('@crabnebula/packager-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + localFileExisted = existsSync( + join(__dirname, 'packager.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./packager.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@crabnebula/packager-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { cli, package, initTracingSubscriber, logError } = nativeBinding + +module.exports.cli = cli +module.exports.package = package +module.exports.initTracingSubscriber = initTracingSubscriber +module.exports.logError = logError diff --git a/bindings/packager/nodejs/npm/darwin-arm64/README.md b/bindings/packager/nodejs/npm/darwin-arm64/README.md new file mode 100644 index 00000000..75f7d0a9 --- /dev/null +++ b/bindings/packager/nodejs/npm/darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/darwin-arm64/package.json b/bindings/packager/nodejs/npm/darwin-arm64/package.json new file mode 100644 index 00000000..2e443b81 --- /dev/null +++ b/bindings/packager/nodejs/npm/darwin-arm64/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-darwin-arm64", + "version": "0.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "main": "packager.darwin-arm64.node", + "files": [ + "packager.darwin-arm64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/darwin-x64/README.md b/bindings/packager/nodejs/npm/darwin-x64/README.md new file mode 100644 index 00000000..14fa6f53 --- /dev/null +++ b/bindings/packager/nodejs/npm/darwin-x64/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-darwin-x64` + +This is the **x86_64-apple-darwin** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/darwin-x64/package.json b/bindings/packager/nodejs/npm/darwin-x64/package.json new file mode 100644 index 00000000..04019e05 --- /dev/null +++ b/bindings/packager/nodejs/npm/darwin-x64/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-darwin-x64", + "version": "0.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "main": "packager.darwin-x64.node", + "files": [ + "packager.darwin-x64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/linux-arm-gnueabihf/README.md b/bindings/packager/nodejs/npm/linux-arm-gnueabihf/README.md new file mode 100644 index 00000000..db69d228 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm-gnueabihf/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-linux-arm-gnueabihf` + +This is the **armv7-unknown-linux-gnueabihf** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/linux-arm-gnueabihf/package.json b/bindings/packager/nodejs/npm/linux-arm-gnueabihf/package.json new file mode 100644 index 00000000..3cbf4288 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm-gnueabihf/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-linux-arm-gnueabihf", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm" + ], + "main": "packager.linux-arm-gnueabihf.node", + "files": [ + "packager.linux-arm-gnueabihf.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/linux-arm64-gnu/README.md b/bindings/packager/nodejs/npm/linux-arm64-gnu/README.md new file mode 100644 index 00000000..1644a8b1 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm64-gnu/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-linux-arm64-gnu` + +This is the **aarch64-unknown-linux-gnu** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/linux-arm64-gnu/package.json b/bindings/packager/nodejs/npm/linux-arm64-gnu/package.json new file mode 100644 index 00000000..cf33490a --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm64-gnu/package.json @@ -0,0 +1,21 @@ +{ + "name": "@crabnebula/packager-linux-arm64-gnu", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "main": "packager.linux-arm64-gnu.node", + "files": [ + "packager.linux-arm64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "libc": [ + "glibc" + ] +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/linux-arm64-musl/README.md b/bindings/packager/nodejs/npm/linux-arm64-musl/README.md new file mode 100644 index 00000000..7785451a --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm64-musl/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-linux-arm64-musl` + +This is the **aarch64-unknown-linux-musl** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/linux-arm64-musl/package.json b/bindings/packager/nodejs/npm/linux-arm64-musl/package.json new file mode 100644 index 00000000..f8314389 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-arm64-musl/package.json @@ -0,0 +1,21 @@ +{ + "name": "@crabnebula/packager-linux-arm64-musl", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "main": "packager.linux-arm64-musl.node", + "files": [ + "packager.linux-arm64-musl.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "libc": [ + "musl" + ] +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/linux-x64-gnu/README.md b/bindings/packager/nodejs/npm/linux-x64-gnu/README.md new file mode 100644 index 00000000..ce3d010a --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-x64-gnu/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-linux-x64-gnu` + +This is the **x86_64-unknown-linux-gnu** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/linux-x64-gnu/package.json b/bindings/packager/nodejs/npm/linux-x64-gnu/package.json new file mode 100644 index 00000000..c224c9f9 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-x64-gnu/package.json @@ -0,0 +1,21 @@ +{ + "name": "@crabnebula/packager-linux-x64-gnu", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "main": "packager.linux-x64-gnu.node", + "files": [ + "packager.linux-x64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "libc": [ + "glibc" + ] +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/linux-x64-musl/README.md b/bindings/packager/nodejs/npm/linux-x64-musl/README.md new file mode 100644 index 00000000..9a89d7d2 --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-x64-musl/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-linux-x64-musl` + +This is the **x86_64-unknown-linux-musl** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/linux-x64-musl/package.json b/bindings/packager/nodejs/npm/linux-x64-musl/package.json new file mode 100644 index 00000000..8fe2d7bb --- /dev/null +++ b/bindings/packager/nodejs/npm/linux-x64-musl/package.json @@ -0,0 +1,21 @@ +{ + "name": "@crabnebula/packager-linux-x64-musl", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "main": "packager.linux-x64-musl.node", + "files": [ + "packager.linux-x64-musl.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "libc": [ + "musl" + ] +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/win32-arm64-msvc/README.md b/bindings/packager/nodejs/npm/win32-arm64-msvc/README.md new file mode 100644 index 00000000..02038c7f --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-arm64-msvc/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-win32-arm64-msvc` + +This is the **aarch64-pc-windows-msvc** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/win32-arm64-msvc/package.json b/bindings/packager/nodejs/npm/win32-arm64-msvc/package.json new file mode 100644 index 00000000..1a23622a --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-arm64-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-win32-arm64-msvc", + "version": "0.0.0", + "os": [ + "win32" + ], + "cpu": [ + "arm64" + ], + "main": "packager.win32-arm64-msvc.node", + "files": [ + "packager.win32-arm64-msvc.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/win32-ia32-msvc/README.md b/bindings/packager/nodejs/npm/win32-ia32-msvc/README.md new file mode 100644 index 00000000..adbc51b3 --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-ia32-msvc/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-win32-ia32-msvc` + +This is the **i686-pc-windows-msvc** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/win32-ia32-msvc/package.json b/bindings/packager/nodejs/npm/win32-ia32-msvc/package.json new file mode 100644 index 00000000..228bee97 --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-ia32-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-win32-ia32-msvc", + "version": "0.0.0", + "os": [ + "win32" + ], + "cpu": [ + "ia32" + ], + "main": "packager.win32-ia32-msvc.node", + "files": [ + "packager.win32-ia32-msvc.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/npm/win32-x64-msvc/README.md b/bindings/packager/nodejs/npm/win32-x64-msvc/README.md new file mode 100644 index 00000000..1fa0e41c --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `@crabnebula/packager-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `@crabnebula/packager` diff --git a/bindings/packager/nodejs/npm/win32-x64-msvc/package.json b/bindings/packager/nodejs/npm/win32-x64-msvc/package.json new file mode 100644 index 00000000..9f167b03 --- /dev/null +++ b/bindings/packager/nodejs/npm/win32-x64-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@crabnebula/packager-win32-x64-msvc", + "version": "0.0.0", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "main": "packager.win32-x64-msvc.node", + "files": [ + "packager.win32-x64-msvc.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} \ No newline at end of file diff --git a/bindings/packager/nodejs/package.json b/bindings/packager/nodejs/package.json new file mode 100644 index 00000000..b2be26fc --- /dev/null +++ b/bindings/packager/nodejs/package.json @@ -0,0 +1,62 @@ +{ + "name": "@crabnebula/packager", + "version": "0.0.0", + "main": "build/index.js", + "types": "build/index.d.ts", + "author": { + "name": "CrabNebula Ltd." + }, + "description": "Executable packager and bundler distributed as a CLI and library", + "bin": { + "packager": "./packager.js" + }, + "napi": { + "name": "packager", + "triples": { + "additional": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl", + "i686-pc-windows-msvc" + ] + } + }, + "license": "MIT", + "devDependencies": { + "@napi-rs/cli": "^2.16.5", + "@types/fs-extra": "^11.0.3", + "@types/node": "^20.8.10", + "ava": "^5.1.1", + "json-schema-to-typescript": "^13.1.1", + "typescript": "^5.2.2" + }, + "ava": { + "timeout": "3m" + }, + "engines": { + "node": ">= 10" + }, + "scripts": { + "artifacts": "napi artifacts", + "build:config": "node generate-config-type.js", + "build:ts": "rm -rf build/ && tsc", + "build": "pnpm build:config && pnpm build:ts && napi build --platform --profile release-size-optimized", + "build:debug": "pnpm build:config && pnpm build:ts && napi build --platform", + "prepublishOnly": "napi prepublish -t npm --gh-release-id $RELEASE_ID", + "pretest": "npm run build:ts", + "test": "ava --no-worker-threads", + "universal": "napi universal", + "version": "napi version" + }, + "packageManager": "pnpm@8.7.1", + "dependencies": { + "@electron/get": "^3.0.0", + "deepmerge": "^4.3.1", + "extract-zip": "^2.0.1", + "fs-extra": "^11.1.1", + "galactus": "^1.0.0" + } +} diff --git a/bindings/packager/nodejs/packager.js b/bindings/packager/nodejs/packager.js new file mode 100644 index 00000000..ad99e28c --- /dev/null +++ b/bindings/packager/nodejs/packager.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node + +const cli = require('./build') +const path = require('path') + +const [bin, script, ...args] = process.argv +const binStem = path.parse(bin).name.toLowerCase() + +// We want to make a helpful binary name for the underlying CLI helper, if we +// can successfully detect what command likely started the execution. +let binName + +// deno run -A --unstable --node-modules-dir npm:@crabnebula/packager +if (bin === '@crabnebula/packager') { + binName = '@crabnebula/packager' +} +// Even if started by a package manager, the binary will be NodeJS. +// Some distribution still use "nodejs" as the binary name. +else if (binStem.match(/(nodejs|node|bun)\-?([0-9]*)*$/g)) { + const managerStem = process.env.npm_execpath ? + path.parse(process.env.npm_execpath).name.toLowerCase() : + null + if (managerStem) { + let manager + switch (managerStem) { + // Only supported package manager that has a different filename is npm. + case 'npm-cli': + manager = 'npm' + break + + // Yarn, pnpm, and bun have the same stem name as their bin. + // We assume all unknown package managers do as well. + default: + manager = managerStem + break + } + + binName = `${manager} run ${process.env.npm_lifecycle_event}` + } else { + // Assume running NodeJS if we didn't detect a manager from the env. + // We normalize the path to prevent the script's absolute path being used. + const scriptNormal = path.normalize(path.relative(process.cwd(), script)) + binName = `${binStem} ${scriptNormal}` + } +} else { + // We don't know what started it, assume it's already stripped. + args.unshift(bin) +} + +cli.cli(args, binName).catch((err) => { + cli.logError(err.message) + process.exit(1) +}) \ No newline at end of file diff --git a/bindings/packager/nodejs/pnpm-lock.yaml b/bindings/packager/nodejs/pnpm-lock.yaml new file mode 100644 index 00000000..41a908e8 --- /dev/null +++ b/bindings/packager/nodejs/pnpm-lock.yaml @@ -0,0 +1,1772 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@electron/get': + specifier: ^3.0.0 + version: 3.0.0 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + extract-zip: + specifier: ^2.0.1 + version: 2.0.1 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + galactus: + specifier: ^1.0.0 + version: 1.0.0 + +devDependencies: + '@napi-rs/cli': + specifier: ^2.16.5 + version: 2.16.5 + '@types/fs-extra': + specifier: ^11.0.3 + version: 11.0.3 + '@types/node': + specifier: ^20.8.10 + version: 20.8.10 + ava: + specifier: ^5.1.1 + version: 5.3.1 + json-schema-to-typescript: + specifier: ^13.1.1 + version: 13.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + +packages: + + /@bcherny/json-schema-ref-parser@10.0.5-fork: + resolution: {integrity: sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==} + engines: {node: '>= 16'} + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.14 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + dev: true + + /@electron/get@3.0.0: + resolution: {integrity: sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ==} + engines: {node: '>=14'} + dependencies: + debug: 4.3.4 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true + + /@napi-rs/cli@2.16.5: + resolution: {integrity: sha512-mFEzwrg4IOLngGd2/P6yeqIWgwQNn59Z08n1rndu6kLDq1gg954NH9cM1O9Da0RJuybt46p43lqgSsnAY2mxqA==} + engines: {node: '>= 10'} + hasBin: true + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: false + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.3 + '@types/keyv': 3.1.4 + '@types/node': 20.8.10 + '@types/responselike': 1.0.2 + dev: false + + /@types/fs-extra@11.0.3: + resolution: {integrity: sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==} + dependencies: + '@types/jsonfile': 6.1.3 + '@types/node': 20.8.10 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.8.10 + dev: true + + /@types/http-cache-semantics@4.0.3: + resolution: {integrity: sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==} + dev: false + + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + dev: true + + /@types/jsonfile@6.1.3: + resolution: {integrity: sha512-/yqTk2SZ1wIezK0hiRZD7RuSf4B3whFxFamB1kGStv+8zlWScTMcHanzfc0XKWs5vA1TkHeckBlOyM8jxU8nHA==} + dependencies: + '@types/node': 20.8.10 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.8.10 + dev: false + + /@types/lodash@4.14.200: + resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node@20.8.10: + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + dependencies: + undici-types: 5.26.5 + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/responselike@1.0.2: + resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} + dependencies: + '@types/node': 20.8.10 + dev: false + + /@types/yauzl@2.10.2: + resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} + requiresBuild: true + dependencies: + '@types/node': 20.8.10 + dev: false + optional: true + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + dev: true + + /arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + dev: true + + /ava@5.3.1: + resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + dependencies: + acorn: 8.11.2 + acorn-walk: 8.3.0 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.1.0 + cbor: 8.1.0 + chalk: 5.3.0 + chokidar: 3.5.3 + chunkd: 2.0.1 + ci-info: 3.9.0 + ci-parallel-vars: 1.0.1 + clean-yaml-object: 0.1.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.4 + emittery: 1.0.1 + figures: 5.0.0 + globby: 13.2.2 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-error: 2.2.2 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + mem: 9.0.2 + ms: 2.1.3 + p-event: 5.0.1 + p-map: 5.5.0 + picomatch: 2.3.1 + pkg-conf: 4.0.0 + plur: 5.1.0 + pretty-ms: 8.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + requiresBuild: true + dev: false + optional: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: false + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: false + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + + /callsites@4.1.0: + resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} + engines: {node: '>=12.20'} + dev: true + + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + dev: true + + /clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} + dev: true + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: false + + /code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + convert-to-spaces: 2.0.1 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.4 + well-known-symbols: 2.0.0 + dev: true + + /convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + optional: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: false + optional: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + requiresBuild: true + dev: false + optional: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emittery@1.0.1: + resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} + engines: {node: '>=14.16'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + requiresBuild: true + dev: false + optional: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + requiresBuild: true + dev: false + optional: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.2 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + + /flora-colossus@2.0.0: + resolution: {integrity: sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + fs-extra: 10.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + requiresBuild: true + dev: false + optional: true + + /galactus@1.0.0: + resolution: {integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + flora-colossus: 2.0.0 + fs-extra: 10.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + requiresBuild: true + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + optional: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-promise@4.2.2(glob@7.2.3): + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.5.4 + serialize-error: 7.0.1 + dev: false + optional: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + define-properties: 1.2.1 + dev: false + optional: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + dev: false + optional: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.2 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + dev: false + optional: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + requiresBuild: true + dev: false + optional: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + requiresBuild: true + dev: false + optional: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + function-bind: 1.1.2 + dev: false + optional: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: true + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-schema-to-typescript@13.1.1: + resolution: {integrity: sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + '@bcherny/json-schema-ref-parser': 10.0.5-fork + '@types/json-schema': 7.0.14 + '@types/lodash': 4.14.200 + '@types/prettier': 2.7.3 + cli-color: 2.0.3 + get-stdin: 8.0.0 + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + is-glob: 4.0.3 + lodash: 4.17.21 + minimist: 1.2.8 + mkdirp: 1.0.4 + mz: 2.7.0 + prettier: 2.8.8 + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + requiresBuild: true + dev: false + optional: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + escape-string-regexp: 4.0.0 + dev: false + optional: true + + /matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 4.0.0 + dev: true + + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + requiresBuild: true + dev: false + optional: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: false + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-timeout: 5.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + dependencies: + aggregate-error: 4.0.1 + dev: true + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: true + + /parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + load-json-file: 7.0.1 + dev: true + + /plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + irregular-plurals: 3.5.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + dependencies: + parse-ms: 3.0.0 + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.3 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + dev: false + optional: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + requiresBuild: true + dev: false + optional: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + requiresBuild: true + dev: false + optional: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 + dev: true + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + requiresBuild: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/bindings/packager/nodejs/src-ts/config.d.ts b/bindings/packager/nodejs/src-ts/config.d.ts new file mode 100644 index 00000000..c9784ae3 --- /dev/null +++ b/bindings/packager/nodejs/src-ts/config.d.ts @@ -0,0 +1,568 @@ +/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +/** + * Describes a shell command to be executed when a CLI hook is triggered. + */ +export type HookCommand = + | string + | { + /** + * The script to execute. + */ + script: string; + /** + * The working directory. + */ + dir?: string | null; + [k: string]: unknown; + }; +/** + * An enum representing the available verbosity levels of the logger. + */ +export type LogLevel = "error" | "warn" | "info" | "debug" | "trace"; +/** + * The type of the package we're packaging. + */ +export type PackageFormat = "all" | "default" | "app" | "dmg" | "wix" | "nsis" | "deb" | "appimage"; +/** + * The possible app categories. Corresponds to `LSApplicationCategoryType` on macOS and the GNOME desktop categories on Debian. + */ +export type AppCategory = + | "Business" + | "DeveloperTool" + | "Education" + | "Entertainment" + | "Finance" + | "Game" + | "ActionGame" + | "AdventureGame" + | "ArcadeGame" + | "BoardGame" + | "CardGame" + | "CasinoGame" + | "DiceGame" + | "EducationalGame" + | "FamilyGame" + | "KidsGame" + | "MusicGame" + | "PuzzleGame" + | "RacingGame" + | "RolePlayingGame" + | "SimulationGame" + | "SportsGame" + | "StrategyGame" + | "TriviaGame" + | "WordGame" + | "GraphicsAndDesign" + | "HealthcareAndFitness" + | "Lifestyle" + | "Medical" + | "Music" + | "News" + | "Photography" + | "Productivity" + | "Reference" + | "SocialNetworking" + | "Sports" + | "Travel" + | "Utility" + | "Video" + | "Weather"; +/** + * *macOS-only**. Corresponds to CFBundleTypeRole + */ +export type BundleTypeRole = "editor" | "viewer" | "shell" | "qLGenerator" | "none"; +/** + * A path to a resource (with optional glob pattern) or an object of `src` and `target` paths. + */ +export type Resource = + | string + | { + /** + * The src file or directory, supports glob patterns. + */ + src: string; + /** + * A relative path from the root of the final package. + * + * If `src` is a glob, this will always be treated as a directory where all globbed files will be placed under. + */ + target: string; + [k: string]: unknown; + }; +/** + * The languages to build using WiX. + */ +export type WixLanguages = [string, WixLanguageConfig][]; +/** + * Compression algorithms used in the NSIS installer. + * + * See + */ +export type NsisCompression = "zlib" | "bzip2" | "lzma"; +/** + * Install Modes for the NSIS installer. + */ +export type NSISInstallerMode = "currentUser" | "perMachine" | "both"; + +/** + * The packaging config. + */ +export interface Config { + /** + * Whether this config is enabled or not. Defaults to `true`. + */ + enabled?: boolean; + /** + * The JSON schema for the config. + * + * Setting this field has no effect, this just exists so we can parse the JSON correct when it has `$schema` field set. + */ + $schema?: string | null; + /** + * The app name, this is just an identifier that could be used to filter which app to package using `--packages` cli arg when there is multiple apps in the workspace or in the same config. + * + * This field resembles, the `name` field in `Cargo.toml` and `package.json` + * + * If `unset`, the CLI will try to auto-detect it from `Cargo.toml` or `package.json` otherwise, it will keep it as null. + */ + name?: string | null; + /** + * Specify a command to run before starting to package an application. + * + * This runs only once. + */ + beforePackagingCommand?: HookCommand | null; + /** + * Specify a command to run before packaging each format for an application. + * + * This will run multiple times depending on the formats specifed. + */ + beforeEachPackageCommand?: HookCommand | null; + /** + * The log level. + */ + logLevel?: LogLevel | null; + /** + * The package types we're creating. + * + * if not present, we'll use the PackageType list for the target OS. + */ + formats?: PackageFormat[] | null; + /** + * The directory where the `binaries` exist and where the packages will be placed. + */ + outDir?: string; + /** + * The target triple. Defaults to the current OS target triple. + */ + targetTriple?: string | null; + /** + * the package's product name, for example "My Awesome App". + */ + productName?: string; + /** + * the package's version. + */ + version?: string; + /** + * the package's description. + */ + description?: string | null; + /** + * the app's long description. + */ + longDescription?: string | null; + /** + * the package's homepage. + */ + homepage?: string | null; + /** + * the package's authors. + */ + authors?: string[]; + /** + * the application identifier in reverse domain name notation (e.g. `com.packager.example`). This string must be unique across applications since it is used in some system configurations. This string must contain only alphanumeric characters (A–Z, a–z, and 0–9), hyphens (-), and periods (.). + */ + identifier?: string | null; + /** + * The app's publisher. Defaults to the second element in the identifier string. Currently maps to the Manufacturer property of the Windows Installer. + */ + publisher?: string | null; + /** + * A path to the license file. + */ + licenseFile?: string | null; + /** + * the app's copyright. + */ + copyright?: string | null; + /** + * the app's category. + */ + category?: AppCategory | null; + /** + * the app's icon list. + */ + icons?: string[] | null; + /** + * the binaries to package. + */ + binaries?: Binary[]; + /** + * the file associations + */ + fileAssociations?: FileAssociation[] | null; + /** + * The app's resources to package. This a list of either a glob pattern, path to a file, path to a directory or an object of `src` and `target` paths. In the case of using an object, the `src` could be either a glob pattern, path to a file, path to a directory, and the `target` is a path inside the final resources folder in the installed package. + * + * ## Format-specific: + * + * - **[PackageFormat::Nsis] / [PackageFormat::Wix]**: The resources are placed next to the executable in the root of the packager. - **[PackageFormat::Deb]**: The resources are placed in `usr/lib` of the package. + */ + resources?: Resource[] | null; + /** + * External binaries to add to the package. + * + * Note that each binary name should have the target platform's target triple appended, as well as `.exe` for Windows. For example, if you're packaging a sidecar called `sqlite3`, the packager expects a binary named `sqlite3-x86_64-unknown-linux-gnu` on linux, and `sqlite3-x86_64-pc-windows-gnu.exe` on windows. + * + * If you are building a universal binary for MacOS, the packager expects your external binary to also be universal, and named after the target triple, e.g. `sqlite3-universal-apple-darwin`. See + */ + externalBinaries?: string[] | null; + /** + * Debian-specific settings. + */ + deb?: DebianConfig | null; + /** + * Debian-specific settings. + */ + appimage?: AppImageConfig | null; + /** + * WiX configuration. + */ + wix?: WixConfig | null; + /** + * Nsis configuration. + */ + nsis?: NsisConfig | null; + /** + * MacOS-specific settings. + */ + macos?: MacOsConfig | null; + /** + * Windows-specific settings. + */ + windows?: WindowsConfig | null; +} +/** + * A binary to package within the final package. + */ +export interface Binary { + /** + * Path to the binary (without `.exe` on Windows). If it's relative, it will be resolved from [`Config::out_dir`]. + */ + path: string; + /** + * Whether this is the main binary or not + */ + main?: boolean; +} +/** + * A file association configuration. + */ +export interface FileAssociation { + /** + * File extensions to associate with this app. e.g. 'png' + */ + ext: string[]; + /** + * The name. Maps to `CFBundleTypeName` on macOS. Default to the first item in `ext` + */ + name?: string | null; + /** + * The association description. **Windows-only**. It is displayed on the `Type` column on Windows Explorer. + */ + description?: string | null; + /** + * The app’s role with respect to the type. Maps to `CFBundleTypeRole` on macOS. + */ + role?: BundleTypeRole & string; + /** + * The mime-type e.g. 'image/png' or 'text/plain'. Linux-only. + */ + mimeType?: string | null; +} +/** + * The Linux debian configuration. + */ +export interface DebianConfig { + /** + * the list of debian dependencies. + */ + depends?: string[] | null; + /** + * Path to a custom desktop file Handlebars template. + * + * Available variables: `categories`, `comment` (optional), `exec`, `icon` and `name`. + * + * Default file contents: ```text [Desktop Entry] Categories={{categories}} {{#if comment}} Comment={{comment}} {{/if}} Exec={{exec}} Icon={{icon}} Name={{name}} Terminal=false Type=Application {{#if mime_type}} MimeType={{mime_type}} {{/if}} ``` + */ + desktopTemplate?: string | null; + /** + * List of custom files to add to the deb package. Maps a dir/file to a dir/file inside the debian package. + */ + files?: { + [k: string]: string; + } | null; +} +/** + * The Linux AppImage configuration. + */ +export interface AppImageConfig { + /** + * List of libs that exist in `/usr/lib*` to be include in the final AppImage. The libs will be searched for using the command `find -L /usr/lib* -name ` + */ + libs?: string[] | null; + /** + * List of binary paths to include in the final AppImage. For example, if you want `xdg-open`, you'd specify `/usr/bin/xdg-open` + */ + bins?: string[] | null; + /** + * Hashmap of [`linuxdeploy`](https://github.com/linuxdeploy/linuxdeploy) plugin name and its URL to be downloaded and executed while packaing the appimage. For example, if you want to use the [`gtk`](https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh) plugin, you'd specify `gtk` as the key and its url as the value. + */ + linuxdeployPlugins?: { + [k: string]: string; + } | null; + /** + * List of custom files to add to the appimage package. Maps a dir/file to a dir/file inside the appimage package. + */ + files?: { + [k: string]: string; + } | null; +} +/** + * The wix format configuration + */ +export interface WixConfig { + /** + * The app languages to build. See . + */ + languages?: WixLanguages; + /** + * By default, the packager uses an internal template. This option allows you to define your own wix file. + */ + template?: string | null; + /** + * List of merge modules to include in your installer. For example, if you want to include [C++ Redis merge modules] + * + * [C++ Redis merge modules]: https://wixtoolset.org/docs/v3/howtos/redistributables_and_install_checks/install_vcredist/ + */ + mergeModules?: string[] | null; + /** + * A list of paths to .wxs files with WiX fragments to use. + */ + fragmentPaths?: string[] | null; + /** + * List of WiX fragments as strings. This is similar to `config.wix.fragments_paths` but is a string so you can define it inline in your config. + * + * ```text ``` + */ + fragments?: string[] | null; + /** + * The ComponentGroup element ids you want to reference from the fragments. + */ + componentGroupRefs?: string[] | null; + /** + * The Component element ids you want to reference from the fragments. + */ + componentRefs?: string[] | null; + /** + * The CustomAction element ids you want to reference from the fragments. + */ + customActionRefs?: string[] | null; + /** + * The FeatureGroup element ids you want to reference from the fragments. + */ + featureGroupRefs?: string[] | null; + /** + * The Feature element ids you want to reference from the fragments. + */ + featureRefs?: string[] | null; + /** + * The Merge element ids you want to reference from the fragments. + */ + mergeRefs?: string[] | null; + /** + * Path to a bitmap file to use as the installation user interface banner. This bitmap will appear at the top of all but the first page of the installer. + * + * The required dimensions are 493px × 58px. + */ + bannerPath?: string | null; + /** + * Path to a bitmap file to use on the installation user interface dialogs. It is used on the welcome and completion dialogs. The required dimensions are 493px × 312px. + */ + dialogImagePath?: string | null; + /** + * Enables FIPS compliant algorithms. + */ + fipsCompliant?: boolean; +} +/** + * Configuration for a target language for the WiX build. + */ +export interface WixLanguageConfig { + /** + * The path to a locale (`.wxl`) file. See . + */ + localePath?: string | null; +} +/** + * The NSIS format configuration. + */ +export interface NsisConfig { + /** + * Set the compression algorithm used to compress files in the installer. + * + * See + */ + compression?: NsisCompression | null; + /** + * A custom `.nsi` template to use. + * + * See the default template here + */ + template?: string | null; + /** + * Logic of an NSIS section that will be ran before the install section. + * + * See the available libraries, dlls and global variables here + * + * ### Example ```toml [package.metadata.packager.nsis] preinstall-section = """ ; Setup custom messages LangString webview2AbortError ${LANG_ENGLISH} "Failed to install WebView2! The app can't run without it. Try restarting the installer." LangString webview2DownloadError ${LANG_ARABIC} "خطأ: فشل تنزيل WebView2 - $0" + * + * Section PreInstall ;
SectionEnd + * + * Section AnotherPreInstall ;
SectionEnd """ ``` + */ + preinstallSection?: string | null; + /** + * The path to a bitmap file to display on the header of installers pages. + * + * The recommended dimensions are 150px x 57px. + */ + headerImage?: string | null; + /** + * The path to a bitmap file for the Welcome page and the Finish page. + * + * The recommended dimensions are 164px x 314px. + */ + sidebarImage?: string | null; + /** + * The path to an icon file used as the installer icon. + */ + installerIcon?: string | null; + /** + * Whether the installation will be for all users or just the current user. + */ + installMode?: NSISInstallerMode & string; + /** + * A list of installer languages. By default the OS language is used. If the OS language is not in the list of languages, the first language will be used. To allow the user to select the language, set `display_language_selector` to `true`. + * + * See for the complete list of languages. + */ + languages?: string[] | null; + /** + * An key-value pair where the key is the language and the value is the path to a custom `.nsi` file that holds the translated text for cargo-packager's custom messages. + * + * See for an example `.nsi` file. + * + * **Note**: the key must be a valid NSIS language and it must be added to [`NsisConfig`]languages array, + */ + customLanguageFiles?: { + [k: string]: string; + } | null; + /** + * Whether to display a language selector dialog before the installer and uninstaller windows are rendered or not. By default the OS language is selected, with a fallback to the first language in the `languages` array. + */ + displayLanguageSelector?: boolean; + /** + * List of paths where your app stores data. This options tells the uninstaller to provide the user with an option (disabled by default) whether they want to rmeove your app data or keep it. + * + * The path should use a constant from in addition to `$IDENTIFIER`, `$PUBLISHER` and `$PRODUCTNAME`, for example, if you store your app data in `C:\\Users\\\\AppData\\Local\\\\` you'd need to specify ```toml [package.metadata.packager.nsis] appdata-paths = ["$LOCALAPPDATA/$PUBLISHER/$PRODUCTNAME"] ``` + */ + appdataPaths?: string[] | null; +} +/** + * The macOS configuration. + */ +export interface MacOsConfig { + /** + * MacOS frameworks that need to be packaged with the app. + * + * Each string can either be the name of a framework (without the `.framework` extension, e.g. `"SDL2"`), in which case we will search for that framework in the standard install locations (`~/Library/Frameworks/`, `/Library/Frameworks/`, and `/Network/Library/Frameworks/`), or a path to a specific framework bundle (e.g. `./data/frameworks/SDL2.framework`). Note that this setting just makes cargo-packager copy the specified frameworks into the OS X app bundle (under `Foobar.app/Contents/Frameworks/`); you are still responsible for: + * + * - arranging for the compiled binary to link against those frameworks (e.g. by emitting lines like `cargo:rustc-link-lib=framework=SDL2` from your `build.rs` script) + * + * - embedding the correct rpath in your binary (e.g. by running `install_name_tool -add_rpath "@executable_path/../Frameworks" path/to/binary` after compiling) + */ + frameworks?: string[] | null; + /** + * A version string indicating the minimum MacOS version that the packaged app supports (e.g. `"10.11"`). If you are using this config field, you may also want have your `build.rs` script emit `cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.11`. + */ + minimumSystemVersion?: string | null; + /** + * The exception domain to use on the macOS .app package. + * + * This allows communication to the outside world e.g. a web server you're shipping. + */ + exceptionDomain?: string | null; + /** + * Code signing identity. + */ + signingIdentity?: string | null; + /** + * Provider short name for notarization. + */ + providerShortName?: string | null; + /** + * Path to the entitlements.plist file. + */ + entitlements?: string | null; + /** + * Path to the Info.plist file for the package. + */ + infoPlistPath?: string | null; +} +/** + * The Windows configuration. + */ +export interface WindowsConfig { + /** + * The file digest algorithm to use for creating file signatures. Required for code signing. SHA-256 is recommended. + */ + digestAlgorithm?: string | null; + /** + * The SHA1 hash of the signing certificate. + */ + certificateThumbprint?: string | null; + /** + * Server to use during timestamping. + */ + timestampUrl?: string | null; + /** + * Whether to use Time-Stamp Protocol (TSP, a.k.a. RFC 3161) for the timestamp server. Your code signing provider may use a TSP timestamp server, like e.g. SSL.com does. If so, enable TSP by setting to true. + */ + tsp?: boolean; + /** + * Validates a second app installation, blocking the user from installing an older version if set to `false`. + * + * For instance, if `1.2.1` is installed, the user won't be able to install app version `1.2.0` or `1.1.5`. + * + * The default value of this flag is `true`. + */ + allowDowngrades?: boolean; +} diff --git a/bindings/packager/nodejs/src-ts/index.ts b/bindings/packager/nodejs/src-ts/index.ts new file mode 100644 index 00000000..7509949f --- /dev/null +++ b/bindings/packager/nodejs/src-ts/index.ts @@ -0,0 +1,41 @@ +import cargoPackager from "../index"; +import runPlugins from "./plugins"; +import merge from "deepmerge"; +import type { Config } from "./config"; + +let tracingEnabled = false; + +export interface Options { + verbosity?: number; +} + +async function bundleApp(config: Config = {}, options?: Options) { + const conf = await runPlugins(); + + let packagerConfig = config; + if (conf) { + packagerConfig = merge(conf, config); + } + + if (!tracingEnabled) { + cargoPackager.initTracingSubscriber(options?.verbosity ?? 0); + tracingEnabled = true; + } + + cargoPackager.package(JSON.stringify(packagerConfig)); +} + +async function cli(args: string[], binName: string) { + const config = await runPlugins(); + if (config) { + args.push("--config"); + args.push(JSON.stringify(config)); + } + cargoPackager.cli(args, binName); +} + +function logError(error: string) { + cargoPackager.logError(error); +} + +export { cli, bundleApp, logError }; diff --git a/bindings/packager/nodejs/src-ts/plugins/electron/index.ts b/bindings/packager/nodejs/src-ts/plugins/electron/index.ts new file mode 100644 index 00000000..6347915c --- /dev/null +++ b/bindings/packager/nodejs/src-ts/plugins/electron/index.ts @@ -0,0 +1,211 @@ +import type { Config, Resource } from "../../config"; +import type { PackageJson } from ".."; +import fs from "fs-extra"; +import path from "path"; +import os from "os"; +import { download as downloadElectron } from "@electron/get"; +import extractZip from "extract-zip"; +import { Pruner, isModule, normalizePath } from "./prune"; + +export default async function run( + appPath: string, + packageJson: PackageJson +): Promise | null> { + let electronPath; + try { + electronPath = require.resolve("electron", { + paths: [appPath], + }); + } catch (e) { + return null; + } + + const userConfig = packageJson.packager || {}; + + const electronPackageJson = JSON.parse( + ( + await fs.readFile( + path.resolve(path.dirname(electronPath), "package.json") + ) + ).toString() + ); + + const zipPath = await downloadElectron(electronPackageJson.version); + const zipDir = await fs.mkdtemp(path.join(os.tmpdir(), ".packager-electron")); + await extractZip(zipPath, { + dir: zipDir, + }); + + const platformName = os.platform(); + let resources: Resource[] = []; + let frameworks: string[] = []; + let debianFiles: { + [k: string]: string; + } | null = null; + let binaryPath; + + const appTempPath = await fs.mkdtemp( + path.join(os.tmpdir(), packageJson.name || "app-temp") + ); + + const pruner = new Pruner(appPath, true); + + const outDir = userConfig.outDir ? path.resolve(userConfig.outDir) : null; + const ignoredDirs = outDir && outDir !== process.cwd() ? [outDir] : []; + + await fs.copy(appPath, appTempPath, { + filter: async (file: string) => { + const fullPath = path.resolve(file); + + if (ignoredDirs.includes(fullPath)) { + return false; + } + + let name = fullPath.split(appPath)[1]; + if (path.sep === "\\") { + name = normalizePath(name); + } + + if (name.startsWith("/node_modules/")) { + if (await isModule(file)) { + return await pruner.pruneModule(name); + } + } + + return true; + }, + }); + + switch (platformName) { + case "darwin": + var standaloneElectronPath = path.join(zipDir, "Electron.app"); + + const resourcesPath = path.join( + standaloneElectronPath, + "Contents/Resources" + ); + resources = resources.concat( + (await fs.readdir(resourcesPath)) + .filter((p) => p !== "default_app.asar") + .map((p) => path.join(resourcesPath, p)) + ); + + resources.push({ + src: appTempPath, + target: "app", + }); + + const frameworksPath = path.join( + standaloneElectronPath, + "Contents/Frameworks" + ); + frameworks = (await fs.readdir(frameworksPath)).map((p) => + path.join(frameworksPath, p) + ); + + binaryPath = path.join(standaloneElectronPath, "Contents/MacOS/Electron"); + break; + case "win32": + var binaryName: string = + userConfig.name || + packageJson.productName || + packageJson.name || + "Electron"; + binaryPath = path.join(zipDir, `${binaryName}.exe`); + + resources = resources.concat( + (await fs.readdir(zipDir)) + // resources only contains the default_app.asar so we ignore it + .filter((p) => p !== "resources" && p !== "electron.exe") + .map((p) => path.join(zipDir, p)) + ); + + // rename the electron binary + await fs.rename(path.join(zipDir, "electron.exe"), binaryPath); + + resources.push({ + src: appTempPath, + target: "resources/app", + }); + + break; + default: + var binaryName = toKebabCase( + userConfig.name || + packageJson.productName || + packageJson.name || + "Electron" + ); + + // rename the electron binary + await fs.rename( + path.join(zipDir, "electron"), + path.join(zipDir, binaryName) + ); + + const electronFiles = await fs.readdir(zipDir); + + const binTmpDir = await fs.mkdtemp( + path.join(os.tmpdir(), `${packageJson.name || "app-temp"}-bin`) + ); + binaryPath = path.join(binTmpDir, binaryName); + await fs.writeFile(binaryPath, binaryScript(binaryName)); + await fs.chmod(binaryPath, 0o755); + + // make linuxdeploy happy + process.env.LD_LIBRARY_PATH = process.env.LD_LIBRARY_PATH + ? `${process.env.LD_LIBRARY_PATH}:${zipDir}` + : zipDir; + // electron needs everything at the same level :) + // resources only contains the default_app.asar so we ignore it + debianFiles = electronFiles + .filter((f) => f !== "resources") + .reduce( + (acc, file) => ({ + ...acc, + [path.join(zipDir, file)]: `usr/lib/${binaryName}/${file}`, + }), + {} + ); + debianFiles[appTempPath] = `usr/lib/${binaryName}/resources/app`; + } + + return { + name: packageJson.name, + productName: packageJson.productName || packageJson.name, + version: packageJson.version, + resources, + macos: { + frameworks, + }, + deb: { + files: debianFiles, + }, + appimage: { + files: debianFiles, + }, + binaries: [ + { + path: binaryPath, + main: true, + }, + ], + }; +} + +const toKebabCase = (str: string) => + str + .split(/\.?(?=[A-Z])/) + .join("-") + .toLowerCase(); + +function binaryScript(binaryName: string): string { + return `#!/usr/bin/env sh + +full_path=$(realpath $0) +bin_dir_path=$(dirname $full_path) +usr_dir_path=$(dirname $bin_dir_path) +echo $usr_dir_path +$usr_dir_path/lib/${binaryName}/${binaryName} +`; +} diff --git a/bindings/packager/nodejs/src-ts/plugins/electron/prune.ts b/bindings/packager/nodejs/src-ts/plugins/electron/prune.ts new file mode 100644 index 00000000..4049d35c --- /dev/null +++ b/bindings/packager/nodejs/src-ts/plugins/electron/prune.ts @@ -0,0 +1,93 @@ +// from https://github.com/electron/electron-packager/blob/741f3c349e7f9e11e5ae14593a3efa79d312dc4d/src/prune.js + +import { DestroyerOfModules, ModuleMap, DepType, Module } from "galactus"; +import fs from "fs"; +import path from "path"; + +const ELECTRON_MODULES = [ + "electron", + "electron-nightly", + "electron-prebuilt", + "electron-prebuilt-compile", +]; + +export function normalizePath(path: string): string { + return path.replace(/\\/g, "/"); +} + +class Pruner { + baseDir: string; + quiet: boolean; + galactus: DestroyerOfModules; + walkedTree: boolean; + modules?: Set; + + constructor(dir: string, quiet: boolean) { + this.baseDir = normalizePath(dir); + this.quiet = quiet; + this.galactus = new DestroyerOfModules({ + rootDirectory: dir, + shouldKeepModuleTest: (module, isDevDep) => + this.shouldKeepModule(module, isDevDep), + }); + this.walkedTree = false; + } + + setModules(moduleMap: ModuleMap) { + const modulePaths = Array.from(moduleMap.keys()).map( + (modulePath) => `/${normalizePath(modulePath)}` + ); + this.modules = new Set(modulePaths); + this.walkedTree = true; + } + + async pruneModule(name: string) { + if (this.walkedTree) { + return this.isProductionModule(name); + } else { + const moduleMap = await this.galactus.collectKeptModules({ + relativePaths: true, + }); + this.setModules(moduleMap); + return this.isProductionModule(name); + } + } + + shouldKeepModule(module: Module, isDevDep: boolean) { + if (isDevDep || module.depType === DepType.ROOT) { + return false; + } + + if (ELECTRON_MODULES.includes(module.name)) { + if (!this.quiet) + console.warn( + `Found '${module.name}' but not as a devDependency, pruning anyway` + ); + return false; + } + + return true; + } + + isProductionModule(name: string): boolean { + return this.modules?.has(name) ?? false; + } +} + +function isNodeModuleFolder(pathToCheck: string) { + return ( + path.basename(path.dirname(pathToCheck)) === "node_modules" || + (path.basename(path.dirname(pathToCheck)).startsWith("@") && + path.basename(path.resolve(pathToCheck, `..${path.sep}..`)) === + "node_modules") + ); +} + +export async function isModule(pathToCheck: string) { + return ( + (await fs.existsSync(path.join(pathToCheck, "package.json"))) && + isNodeModuleFolder(pathToCheck) + ); +} + +export { Pruner }; diff --git a/bindings/packager/nodejs/src-ts/plugins/index.ts b/bindings/packager/nodejs/src-ts/plugins/index.ts new file mode 100644 index 00000000..3df8222a --- /dev/null +++ b/bindings/packager/nodejs/src-ts/plugins/index.ts @@ -0,0 +1,56 @@ +import path from "path"; +import fs from "fs-extra"; +import type { Config } from "../config"; +import electron from "./electron"; +import merge from "deepmerge"; + +export interface PackageJson { + name?: string; + productName?: string; + version?: string; + packager: Partial | null | undefined; +} + +function getPackageJsonPath(): string | null { + let appDir = process.cwd(); + + while (appDir.length && appDir[appDir.length - 1] !== path.sep) { + const filepath = path.join(appDir, "package.json"); + if (fs.existsSync(filepath)) { + return filepath; + } + + appDir = path.normalize(path.join(appDir, "..")); + } + + return null; +} + +export default async function run(): Promise | null> { + const packageJsonPath = getPackageJsonPath(); + + if (packageJsonPath === null) { + return null; + } + + const packageJson = JSON.parse( + (await fs.readFile(packageJsonPath)).toString() + ) as PackageJson; + + let config = packageJson.packager || null; + + const electronConfig = await electron( + path.dirname(packageJsonPath), + packageJson + ); + + if (electronConfig) { + config = config ? merge(electronConfig, config) : electronConfig; + } + + if (config?.outDir) { + await fs.ensureDir(config.outDir); + } + + return config; +} diff --git a/bindings/packager/nodejs/src/lib.rs b/bindings/packager/nodejs/src/lib.rs new file mode 100644 index 00000000..e4b650b3 --- /dev/null +++ b/bindings/packager/nodejs/src/lib.rs @@ -0,0 +1,26 @@ +use napi::{Error, Result, Status}; + +#[napi_derive::napi] +pub fn cli(args: Vec, bin_name: Option) -> Result<()> { + cargo_packager::cli::try_run(args, bin_name) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string())) +} + +#[napi_derive::napi] +pub fn package(config: String) -> Result<()> { + let config = serde_json::from_str(&config) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string()))?; + cargo_packager::package(&config) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string()))?; + Ok(()) +} + +#[napi_derive::napi] +pub fn init_tracing_subscriber(verbosity: u8) { + cargo_packager::init_tracing_subscriber(verbosity); +} + +#[napi_derive::napi] +pub fn log_error(error: String) { + tracing::error!("{}", error); +} diff --git a/bindings/packager/nodejs/tsconfig.json b/bindings/packager/nodejs/tsconfig.json new file mode 100644 index 00000000..330e9857 --- /dev/null +++ b/bindings/packager/nodejs/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["es6"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "src-ts", /* Specify the root folder within your source files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "outDir": "build", /* Specify an output folder for all emitted files. */ + "declaration": true, + "declarationDir": "build", + + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": [ + "build/", + "__test__/", + "index.js", + "packager.js", + "generate-config-type.js" + ] +} diff --git a/crates/packager/Cargo.toml b/crates/packager/Cargo.toml index 7bab25f7..9b7ffd03 100644 --- a/crates/packager/Cargo.toml +++ b/crates/packager/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "cargo-packager" version = "0.3.0" -description = "Rust executable packager and bundler CLI and library." +description = "Executable packager and bundler distributed as a CLI and library." authors = [ "CrabNebula Ltd.", "Tauri Programme within The Commons Conservancy", @@ -15,15 +15,9 @@ categories = [ "development-tools::build-utils", "os" ] - - [package.edition] - workspace = true - - [package.license] - workspace = true - - [package.repository] - workspace = true +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } [package.metadata.docs.rs] rustdoc-args = [ "--cfg", "doc_cfg" ] @@ -35,9 +29,12 @@ targets = [ ] [features] -default = [ "cli" ] -cli = [ "clap", "tracing-subscriber" ] +default = [ "cli", "rustls" ] +cli = [ "clap", "dep:tracing-subscriber" ] schema = [ "schemars" ] +native-tls = [ "ureq/native-tls" ] +native-tls-vendored = [ "native-tls", "native-tls/vendored" ] +rustls = [ "ureq/tls" ] [dependencies] thiserror = { workspace = true } @@ -52,7 +49,7 @@ tracing = { workspace = true } tracing-subscriber = { version = "0.3", optional = true, features = [ "env-filter" ] } toml = "0.8" cargo_metadata = "0.18" -ureq = "2.8" +ureq = { version = "2.8", default-features = false } hex = "0.4" sha1 = "0.10" sha2 = "0.10" @@ -67,6 +64,7 @@ tar = "0.4" libflate = "2.0" strsim = "0.10" schemars = { workspace = true, optional = true } +native-tls = { version = "0.2", optional = true } [target."cfg(target_os = \"windows\")".dependencies] winreg = "0.51" diff --git a/crates/packager/schema.json b/crates/packager/schema.json index 097aaf52..aaeb5f08 100644 --- a/crates/packager/schema.json +++ b/crates/packager/schema.json @@ -456,11 +456,11 @@ "description": "A binary to package within the final package.", "type": "object", "required": [ - "filename" + "path" ], "properties": { - "filename": { - "description": "File name and without `.exe` on Windows", + "path": { + "description": "Path to the binary (without `.exe` on Windows). If it's relative, it will be resolved from [`Config::out_dir`].", "type": "string" }, "main": { @@ -652,6 +652,16 @@ "additionalProperties": { "type": "string" } + }, + "files": { + "description": "List of custom files to add to the appimage package. Maps a dir/file to a dir/file inside the appimage package.", + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false diff --git a/crates/packager/src/cli/config.rs b/crates/packager/src/cli/config.rs index a9646774..192b6b3d 100644 --- a/crates/packager/src/cli/config.rs +++ b/crates/packager/src/cli/config.rs @@ -162,7 +162,7 @@ pub fn load_configs_from_cargo_workspace( .collect::>(); for target in &targets { config.binaries.push(Binary { - filename: target.name.clone(), + path: target.name.clone().into(), main: match targets.len() { 1 => true, _ => target.name == package.name, diff --git a/crates/packager/src/cli/mod.rs b/crates/packager/src/cli/mod.rs index ea5d9ee3..2a925a1c 100644 --- a/crates/packager/src/cli/mod.rs +++ b/crates/packager/src/cli/mod.rs @@ -6,18 +6,14 @@ #![cfg(feature = "cli")] -use std::{ - ffi::OsStr, - fmt::Write, - path::{Path, PathBuf}, -}; +use std::{ffi::OsString, fmt::Write, path::PathBuf}; use clap::{ArgAction, CommandFactory, FromArgMatches, Parser, Subcommand}; use self::config::{find_config_files, load_configs_from_cargo_workspace, parse_config_file}; use crate::{ config::{Config, LogLevel, PackageFormat}, - package, sign_outputs, util, Result, SigningConfig, + init_tracing_subscriber, package, parse_log_level, sign_outputs, util, Result, SigningConfig, }; mod config; @@ -85,7 +81,7 @@ pub(crate) struct Cli { } #[tracing::instrument(level = "trace")] -fn try_run(cli: Cli) -> Result<()> { +fn run_cli(cli: Cli) -> Result<()> { // run subcommand and exit if one was specified, // otherwise run the default packaging command if let Some(command) = cli.command { @@ -239,61 +235,39 @@ fn try_run(cli: Cli) -> Result<()> { Ok(()) } -fn parse_log_level(verbose: u8) -> tracing::Level { - match verbose { - 0 => tracing_subscriber::EnvFilter::builder() - .from_env_lossy() - .max_level_hint() - .and_then(|l| l.into_level()) - .unwrap_or(tracing::Level::INFO), - 1 => tracing::Level::DEBUG, - 2.. => tracing::Level::TRACE, - } -} - /// Run the packager CLI -pub fn run() { - // prepare cli args - let mut args = std::env::args_os().peekable(); - if let Some("cargo-packager") = args - .next() - .as_deref() - .map(Path::new) - .and_then(Path::file_stem) - .and_then(OsStr::to_str) - { - if args.peek().and_then(|s| s.to_str()) == Some("packager") { - // remove the extra cargo subcommand - args.next(); - } +pub fn run(args: I, bin_name: Option) +where + I: IntoIterator, + A: Into + Clone, +{ + if let Err(e) = try_run(args, bin_name) { + tracing::error!("{}", e); + std::process::exit(1); } +} - let cli = Cli::command(); - let matches = cli.get_matches_from(args); - let res = Cli::from_arg_matches(&matches).map_err(|e| e.format(&mut Cli::command())); - let cli = match res { - Ok(s) => s, - Err(e) => e.exit(), +/// Try run the packager CLI +pub fn try_run(args: I, bin_name: Option) -> Result<()> +where + I: IntoIterator, + A: Into + Clone, +{ + let cli = match &bin_name { + Some(bin_name) => Cli::command().bin_name(bin_name), + None => Cli::command(), }; + let matches = cli.get_matches_from(args); + let cli = Cli::from_arg_matches(&matches).map_err(|e| { + e.format(&mut match &bin_name { + Some(bin_name) => Cli::command().bin_name(bin_name), + None => Cli::command(), + }) + })?; if !cli.quite { - let level = parse_log_level(cli.verbose); - - let debug = level == tracing::Level::DEBUG; - let tracing = level == tracing::Level::TRACE; - - tracing_subscriber::fmt() - .with_ansi(std::io::IsTerminal::is_terminal(&std::io::stderr())) - .without_time() - .with_target(debug) - .with_line_number(tracing) - .with_file(tracing) - .with_max_level(level) - .init(); + init_tracing_subscriber(cli.verbose); } - if let Err(e) = try_run(cli) { - tracing::error!("{}", e); - std::process::exit(1); - } + run_cli(cli) } diff --git a/crates/packager/src/config/mod.rs b/crates/packager/src/config/mod.rs index b3a270b7..e0fb43d0 100644 --- a/crates/packager/src/config/mod.rs +++ b/crates/packager/src/config/mod.rs @@ -277,6 +277,9 @@ pub struct AppImageConfig { /// you'd specify `gtk` as the key and its url as the value. #[serde(alias = "linuxdeploy-plugins", alias = "linuxdeploy_plugins")] pub linuxdeploy_plugins: Option>, + /// List of custom files to add to the appimage package. + /// Maps a dir/file to a dir/file inside the appimage package. + pub files: Option>, } /// The macOS configuration. @@ -631,8 +634,8 @@ impl Default for LogLevel { #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct Binary { - /// File name and without `.exe` on Windows - pub filename: String, + /// Path to the binary (without `.exe` on Windows). If it's relative, it will be resolved from [`Config::out_dir`]. + pub path: PathBuf, /// Whether this is the main binary or not #[serde(default)] pub main: bool, @@ -871,7 +874,11 @@ impl Config { /// Returns the path to the specified binary. pub fn binary_path(&self, binary: &Binary) -> PathBuf { - self.out_dir().join(&binary.filename) + if binary.path.is_absolute() { + binary.path.clone() + } else { + self.out_dir().join(&binary.path) + } } /// Returns the package identifier @@ -889,7 +896,11 @@ impl Config { /// Returns the out dir pub fn out_dir(&self) -> PathBuf { - dunce::canonicalize(&self.out_dir).unwrap_or_else(|_| self.out_dir.clone()) + if self.out_dir.as_os_str().is_empty() { + std::env::current_dir().expect("failed to resolve cwd") + } else { + dunce::canonicalize(&self.out_dir).unwrap_or_else(|_| self.out_dir.clone()) + } } /// Returns the main binary @@ -901,11 +912,11 @@ impl Config { } /// Returns the main binary name - pub fn main_binary_name(&self) -> crate::Result<&String> { + pub fn main_binary_name(&self) -> crate::Result { self.binaries .iter() .find(|bin| bin.main) - .map(|b| &b.filename) + .map(|b| b.path.file_stem().unwrap().to_string_lossy().into_owned()) .ok_or_else(|| crate::Error::MainBinaryNotFound) } } diff --git a/crates/packager/src/error.rs b/crates/packager/src/error.rs index de528c5b..4ffd9e72 100644 --- a/crates/packager/src/error.rs +++ b/crates/packager/src/error.rs @@ -11,6 +11,9 @@ use thiserror::Error; #[derive(Error, Debug)] /// Errors returned by cargo-packager. pub enum Error { + /// Clap error. + #[error(transparent)] + Clap(#[from] clap::error::Error), /// Error while reading cargo metadata. #[error("Failed to read cargo metadata: {0}")] Metadata(#[from] cargo_metadata::Error), diff --git a/crates/packager/src/lib.rs b/crates/packager/src/lib.rs index a6a158f3..6ed4781a 100644 --- a/crates/packager/src/lib.rs +++ b/crates/packager/src/lib.rs @@ -101,6 +101,37 @@ pub use sign::SigningConfig; pub use package::{package, PackageOuput}; +fn parse_log_level(verbose: u8) -> tracing::Level { + match verbose { + 0 => tracing_subscriber::EnvFilter::builder() + .from_env_lossy() + .max_level_hint() + .and_then(|l| l.into_level()) + .unwrap_or(tracing::Level::INFO), + 1 => tracing::Level::DEBUG, + 2.. => tracing::Level::TRACE, + } +} + +/// Inits the tracing subscriber. +#[cfg(feature = "cli")] +#[cfg_attr(doc_cfg, doc(cfg(feature = "cli")))] +pub fn init_tracing_subscriber(verbosity: u8) { + let level = parse_log_level(verbosity); + + let debug = level == tracing::Level::DEBUG; + let tracing = level == tracing::Level::TRACE; + + tracing_subscriber::fmt() + .with_ansi(std::io::IsTerminal::is_terminal(&std::io::stderr())) + .without_time() + .with_target(debug) + .with_line_number(tracing) + .with_file(tracing) + .with_max_level(level) + .init(); +} + /// Sign the specified packages and return the signatures paths. /// /// If `packages` contain a directory in the case of [`PackageFormat::App`] diff --git a/crates/packager/src/main.rs b/crates/packager/src/main.rs index 8d864665..707c28fa 100644 --- a/crates/packager/src/main.rs +++ b/crates/packager/src/main.rs @@ -2,6 +2,32 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +use std::{env::args_os, ffi::OsStr, path::Path, process::exit}; + fn main() { - cargo_packager::cli::run() + let mut args = args_os().peekable(); + let bin_name = match args + .next() + .as_deref() + .map(Path::new) + .and_then(Path::file_stem) + .and_then(OsStr::to_str) + { + Some("cargo-packager") => { + if args.peek().and_then(|s| s.to_str()) == Some("packager") { + // remove the extra cargo subcommand + args.next(); + Some("cargo packager".into()) + } else { + Some("cargo-packager".into()) + } + } + Some(stem) => Some(stem.to_string()), + None => { + eprintln!("cargo-packager wrapper unable to read first argument"); + exit(1); + } + }; + + cargo_packager::cli::run(args, bin_name) } diff --git a/crates/packager/src/package/app/mod.rs b/crates/packager/src/package/app/mod.rs index 10790c71..7071afc2 100644 --- a/crates/packager/src/package/app/mod.rs +++ b/crates/packager/src/package/app/mod.rs @@ -26,6 +26,10 @@ pub(crate) fn package(ctx: &Context) -> crate::Result> { let app_product_name = format!("{}.app", config.product_name); let app_bundle_path = config.out_dir().join(&app_product_name); + if app_bundle_path.exists() { + std::fs::remove_dir_all(&app_bundle_path)?; + } + tracing::info!( "Packaging {} ({})", app_product_name, @@ -74,7 +78,7 @@ pub(crate) fn package(ctx: &Context) -> crate::Result> { tracing::debug!("Copying binaries"); for bin in &config.binaries { let bin_path = config.binary_path(bin); - let dest_path = bin_dir.join(&bin.filename); + let dest_path = bin_dir.join(bin.path.file_name().unwrap()); std::fs::copy(&bin_path, &dest_path)?; sign_paths.push(SignTarget { path: dest_path, @@ -307,7 +311,7 @@ fn copy_frameworks_to_bundle( std::fs::create_dir_all(contents_directory)?; for framework in frameworks { - if framework.ends_with(".framework") { + if framework.ends_with(".framework") || framework.ends_with(".app") { let src_path = PathBuf::from(framework); let src_name = src_path .file_name() @@ -332,7 +336,7 @@ fn copy_frameworks_to_bundle( } else if framework.contains('/') { return Err(crate::Error::InvalidFramework { framework: framework.to_string(), - reason: "path should have the .framework extension", + reason: "framework extension should be either .framework, .dylib or .app", }); } if let Some(home_dir) = dirs::home_dir() { diff --git a/crates/packager/src/package/appimage/appimage b/crates/packager/src/package/appimage/appimage index 270b0951..0270ef3f 100644 --- a/crates/packager/src/package/appimage/appimage +++ b/crates/packager/src/package/appimage/appimage @@ -10,7 +10,7 @@ set -euxo pipefail export ARCH={{arch}} mkdir -p "{{app_name}}.AppDir" -cp -r ../appimage_deb/data/usr "{{app_name}}.AppDir" +cp -r ../appimage_deb/data/* "{{app_name}}.AppDir" cd "{{app_name}}.AppDir" mkdir -p "usr/bin" diff --git a/crates/packager/src/package/appimage/mod.rs b/crates/packager/src/package/appimage/mod.rs index 5166f8aa..59b2fffd 100644 --- a/crates/packager/src/package/appimage/mod.rs +++ b/crates/packager/src/package/appimage/mod.rs @@ -88,6 +88,10 @@ pub(crate) fn package(ctx: &Context) -> crate::Result> { // generate deb_folder structure tracing::debug!("Generating data"); let icons = super::deb::generate_data(config, &appimage_deb_data_dir)?; + tracing::debug!("Copying files specified in `appimage.files`"); + if let Some(files) = config.appimage().and_then(|d| d.files.as_ref()) { + super::deb::copy_custom_files(files, &appimage_deb_data_dir)?; + } let icons: Vec = icons.into_iter().collect(); let main_binary_name = config.main_binary_name()?; diff --git a/crates/packager/src/package/deb/mod.rs b/crates/packager/src/package/deb/mod.rs index c5b5dac0..d7c288d7 100644 --- a/crates/packager/src/package/deb/mod.rs +++ b/crates/packager/src/package/deb/mod.rs @@ -5,7 +5,7 @@ // SPDX-License-Identifier: MIT use std::{ - collections::BTreeSet, + collections::{BTreeSet, HashMap}, ffi::OsStr, fs::File, io::Write, @@ -134,8 +134,8 @@ fn generate_desktop_file(config: &Config, data_dir: &Path) -> crate::Result<()> .map(|category| category.gnome_desktop_categories()) .unwrap_or(""), comment: config.description.as_deref(), - exec: bin_name, - icon: bin_name, + exec: &bin_name, + icon: &bin_name, name: config.product_name.as_str(), mime_type, }, @@ -153,7 +153,7 @@ pub fn generate_data(config: &Config, data_dir: &Path) -> crate::Result>(path: P) -> crate::Result { /// Copies user-defined files to the deb package. #[tracing::instrument(level = "trace")] -fn copy_custom_files(config: &Config, data_dir: &Path) -> crate::Result<()> { - if let Some(files) = config.deb().and_then(|d| d.files.as_ref()) { - for (src, target) in files.iter() { - let src = Path::new(src).canonicalize()?; - let target = Path::new(target); - let target = if target.is_absolute() { - target.strip_prefix("/").unwrap() - } else { - target - }; - - if src.is_file() { - let dest = data_dir.join(target); - let parent = dest - .parent() - .ok_or_else(|| crate::Error::ParentDirNotFound(dest.clone()))?; - std::fs::create_dir_all(parent)?; - std::fs::copy(src, dest)?; - } else if src.is_dir() { - for entry in walkdir::WalkDir::new(&src) { - let entry = entry?; - let path = entry.path(); - if path.is_file() { - let relative = path.relative_to(&src)?.to_path(""); - let parent = data_dir.join(target); - let dest = parent.join(relative); - std::fs::create_dir_all(parent)?; - std::fs::copy(path, dest)?; - } +pub fn copy_custom_files(files: &HashMap, data_dir: &Path) -> crate::Result<()> { + for (src, target) in files.iter() { + let src = Path::new(src).canonicalize()?; + let target = Path::new(target); + let target = if target.is_absolute() { + target.strip_prefix("/").unwrap() + } else { + target + }; + + if src.is_file() { + let dest = data_dir.join(target); + let parent = dest + .parent() + .ok_or_else(|| crate::Error::ParentDirNotFound(dest.clone()))?; + std::fs::create_dir_all(parent)?; + std::fs::copy(src, dest)?; + } else if src.is_dir() { + let dest_dir = data_dir.join(target); + + for entry in walkdir::WalkDir::new(&src) { + let entry = entry?; + let path = entry.path(); + if path.is_file() { + let relative = path.relative_to(&src)?.to_path(""); + let dest = dest_dir.join(relative); + std::fs::create_dir_all(dest.parent().unwrap())?; + std::fs::copy(path, dest)?; } } } } + Ok(()) } @@ -368,8 +368,10 @@ pub(crate) fn package(ctx: &Context) -> crate::Result> { let data_dir = deb_dir.join("data"); let _ = generate_data(config, &data_dir)?; - tracing::debug!("Copying files specifeid in `deb.files`"); - copy_custom_files(config, &data_dir)?; + tracing::debug!("Copying files specified in `deb.files`"); + if let Some(files) = config.deb().and_then(|d| d.files.as_ref()) { + copy_custom_files(files, &data_dir)?; + } let control_dir = deb_dir.join("control"); tracing::debug!("Generating control file"); diff --git a/crates/packager/src/package/nsis/mod.rs b/crates/packager/src/package/nsis/mod.rs index 5d5478a3..10f5005f 100644 --- a/crates/packager/src/package/nsis/mod.rs +++ b/crates/packager/src/package/nsis/mod.rs @@ -80,6 +80,7 @@ fn generate_binaries_data(config: &Config) -> crate::Result { if let Some(external_binaries) = &config.external_binaries { for src in external_binaries { + let src = PathBuf::from(src).with_extension("exe"); let bin_path = dunce::canonicalize(cwd.join(src))?; let dest_filename = bin_path .file_name() @@ -92,7 +93,7 @@ fn generate_binaries_data(config: &Config) -> crate::Result { for bin in &config.binaries { if !bin.main { - let bin_path = config.binary_path(bin); + let bin_path = config.binary_path(bin).with_extension("exe"); let dest_filename = bin_path .file_name() .ok_or_else(|| crate::Error::FailedToExtractFilename(bin_path.clone()))? @@ -285,13 +286,14 @@ fn build_nsis_app_installer(ctx: &Context, nsis_path: &Path) -> crate::Result return Err(crate::Error::UnsupportedArch("nsis".into(), target.into())), }; + let main_binary = config.main_binary()?; + let main_binary_name = config.main_binary_name()?; + let main_binary_path = config.binary_path(main_binary).with_extension("exe"); + #[cfg(target_os = "windows")] { - let main_binary = config.main_binary()?; - let app_exe_source = config.binary_path(main_binary); - let signing_path = app_exe_source.with_extension("exe"); - tracing::debug!("Codesigning {}", signing_path.display()); - codesign::try_sign(&signing_path, config)?; + tracing::debug!("Codesigning {}", main_binary_path.display()); + codesign::try_sign(&main_binary_path, config)?; } #[cfg(not(target_os = "windows"))] @@ -418,16 +420,8 @@ fn build_nsis_app_installer(ctx: &Context, nsis_path: &Path) -> crate::Result crate::Result crate::Result crate::Result> { if let Some(external_binaries) = &config.external_binaries { for src in external_binaries { - let binary_path = cwd.join(src); - let src = PathBuf::from(src); - let dest_filename = src + let src = PathBuf::from(src).with_extension("exe"); + let bin_path = dunce::canonicalize(cwd.join(src))?; + let dest_filename = bin_path .file_name() - .ok_or_else(|| crate::Error::FailedToExtractFilename(src.clone()))? + .ok_or_else(|| crate::Error::FailedToExtractFilename(bin_path.clone()))? .to_string_lossy() .replace(&format!("-{}", config.target_triple()), ""); let dest = tmp_dir.join(&dest_filename); - std::fs::copy(binary_path, &dest)?; + std::fs::copy(bin_path, &dest)?; binaries.push(Binary { guid: Uuid::new_v4().to_string(), @@ -165,11 +165,19 @@ fn generate_binaries_data(config: &Config) -> crate::Result> { guid: Uuid::new_v4().to_string(), path: config .binary_path(bin) + .with_extension("exe") .into_os_string() .into_string() .unwrap_or_default(), id: regex - .replace_all(&bin.filename.replace('-', "_"), "") + .replace_all( + &bin.path + .file_stem() + .unwrap() + .to_string_lossy() + .replace('-', "_"), + "", + ) .to_string(), }) } @@ -457,10 +465,11 @@ fn build_wix_app_installer(ctx: &Context, wix_path: &Path) -> crate::Result crate::Result crate::Result crate::ResultJ6G)N;U-6m(X>v*QuPG%bS z4jjg5BPA`JR_7Mw2h+L@RJZ=Y5SIjJ3|B{yUjyJMfp35Wqo>H_f{r45YQmJ~Wvqm( z;R-&Zrxr3X;XrSBH5FJH%8QSoxgS}0HAW-T)a|BL{@dK#R5r!OAd-SZo^eP>nDaf0D!f6!GO13eL(D7TJh;5nht0>s)-D2Z(XhU;4oBU{@a>cql90HRG(9$y2u z2654MjRa007YKf;3MNDI1}qSMQs=nvrcS*k+^-4lqlO0t22j&mG;>?hPr;@?15vp- zRe)mbrLzy@n+Emgz(R=^(c?q%OhmO})PY$4M+=c|n5MwR6gKrh_0o@*m!)f4UL)Mc+7JPtHk99ZCUV*B@dQi-2>XuW8O zMiCZbd#DmW%U7~i44aym{|3t;Lf0@QB+cn&V(#2kOHoW1bH0m*B0(CFOW*Vng#8Yc*-h2Y_n)}_PGg@6EYa^zTb z)mD6b{^OeE7LSsD&oEIT6x?H$5?qvxAl*ofl`nxM)?hW5*a68Q?4^N=8B>X}+TwJ! zVoY#~lgh;MNL0Sy7T!ysMhgNsoqt`T(z5smsW;20MpS*f*@O{rU0Zz>O=E+168C<4 z>s&9tcmZQNMlhjOjN(Flfh59{=q8$+p1#Nm@6cRpx5d8>qUKpVMEE^l6%v-3j${ZORdp*1L(GMvo7s%uM#@EV-Xg{1 z5WrS7|q;I1ECRo zUV;IW9Gp<(J?Q_g!Q@O>>{nyu$YmqYOEI> z+>40M@FJ(ITp6C~KL1kU_g|N$RzqsQFXQ1ew;@S^EmfeL_zAM8ib**~@!sNiT1{G%}#OpOwcuF9ojW%=S8x)0Et^Dfr=<2{fT@j6Dmfj+fwFFgoYqAXOU< zB9%B(4KI`2$cWQay^86lvdSdF7>=@YA(iT51oAAv{q$m`PEhD62PjphwuCsHfDj6P?-Xr4ifjw!G@@zVRBX zeh8L2MEW?y$Xypif1+EC!>2RtZ3w=9Tl+px4};EP;pbpm3?{DP8URN+Pi)klcoHk! z;yoja$irE_q_k0?ytmgKH$r2N4|vmUr0Sa*(TjN!_+Q_Ibv6pXGcHH}v*L3gADWt) zRM%jG>6IXTVRdo23d}3~gB=7Q3*PqRXCs`J=7=tu{#o*ZrSfLXWIg+NGyJ_?V1ou8us>Wa88|d5P#apSG8&F{);llR_-#%?mQ}#KD^*Xn|RbouG0GY z<~QFCZ;VP#m<1BMy&m{PSV%*0TB~xa0529M)@`*Q;7(lC^D=a&5Q9vA{{1`?J}0q4U^_8BL18qx6p32)yj$Gv9H+@wp_LI%%7(bV{}Js z;|-e7uClU%J0nnV3N8<#a=Eu--$P+>sU%V}``HjVq_4ybklH%uySum*5y?9dMyliS zCS{E7@OV+lrNYsK)O569syFl)sZ^4Z`4R*45XG3xJ+$O~KA=9BeHZz!rDf^s=Xa6{ zvBaD{^;QKqpSZU6dFM|DcTQn=)n(W{B$e8D=L&K^FV$LBU$Hm?pFe-zW_ck1B$$Y! zyP+tc$a;pV>`z&-x%T%Re&8`|E$X}GH#z$vOM|O$=a*faOc1=o0Wdkya7)UuzT%k= z=5#gqdemN4T&xy{gdVu3F7E+YG;>}xOFs?b<&Y;jP4?)U?D0412hm0$Dr9@2;cC=$ zv6*3nq+;@!Z@F^7*t+`C>FE=NMImXiygSxMOUvsdTqI#pQM*USgvgRU zh(iWTTG8o4crpqA&AOTb#1~j^RB=?rC!%>6vMh}h)=*FgWoyEneMQpzdvQX~_&R0q zc=sqIvPApO&_GsTTLj9^HKqT-M{>Ut3IP9@CO1dR*YT})O1Sa1ZLb!esR*$v3jjqM`~zamXMxS!;bw(mexVl z+ofatbnr~MzTS8~$;i`8z{XoQ|M*kVrnCqSUOW#jZ(*F~&>2n@(B0k53gZ>V5aSo4 zgiLSlboF-QI*5y>r)9(C6cxK7?{tEOFa)lIuQ7`B9^+AsLP{kg)^?A2NJu}Jy@zxZ z5pO;^lM8?S+8tBTDkQ8-FYnw!(eaz-hzG+{Qf03Eldq@f_{qyE8hbXq6X| zW>(?OU59vvuKI$FN*FT7XZe1tFi42Y7@fr!rB`%%v|`AMz=VW%lu1Pa5EF)&-QApm zLS&MT$LR2Lmq;Z=lNX83>5rOaGFtA0V^6hYC`K#M`>mPc&ob}!7lwTh5_KyU8XG%j zXONIk8N<3JC@;vDh1{pLba)QptuIj+_<8o3U{QGepG6Z=)5NzAP|#6)QhzVzwzN^$ zf2=Fw;E7UCJdRUJtq#AB8(wc%mAGqf>jrG%6U8AL+lMP{`j)DMVqo*!pxz`j zeYipT=*Xc*0RHYv$&W_t`|{D?UfGkzsH&gzRUxdcMUdRj_g#gTtW4gGrb~x249dS= zU}LkVIjzY+i~$J^@0U@R=m>Ujn?AXUmeW%~ky#fh) z8x@>WoB2I7fh6m=di=+aAJeT2fWm=uyy_aV=}13&lA&SI*r?>sV5HJWskCe={JuUL zCJrLR0ty37+qZW1O47KFsMMT7v)O_EC}OlRbMrDKd4!>+{3^&xJ>4|VM|@*9P{<># z_V#YOMsCscf=o2KBNYygRsd}Mr%IN@BKs`O8xh zNMz_+_>sGap6mHNFd(<346|){`84g#k+HYp+N&-q5|jWu+$ft-NaVR&il4fc7Vn|Y z+#6>|lI_+MCRn}uEo@P+n2V<;eiQZpAaGMvEQYr-|=%?0TPn=P>6R5Cj*qn z8_Gg})p0>+U7uG(=0JM-rW#NdTwCcp)qPg;fMgm7)g#c05yK&mxms%IWJE+iA0F;% zGj#QGY6?iS1O$Q;YBO6fic<0l%?66z0V(I{iGAI=Fk%d4-)hWdilfpil7sSyUPXQ( zQs@_y2w66AHuOOL7Vjs-PHAEkNJvn12|6wwp7xk{R2oT=;n&85&or>Nzu&@eHT5;l z2ElDpe4WcqjD|jpD2HI|sgi8j-oEteyTY$lYi8PCsOgW60^!n1eX=Px zV*2Q2FtEanRG90@YUGs4%1n1&V_i{ZRbHP479`S*d^j}mx}|Ibdn)+6{cifg6coGf z9c8WU(BJ6mP0lO^U)>?sve-`Kspixb5{}l**i@8kEK%^;cJpxe9Ig7IaFhKOIkNxw z@#ZG{W2W@mAO&9ZJjW&Ac|Ogg*UZhM*7!eHSw`>XHl ztY)khe)sFuG(KU@p}~*I?-S|m$8SbjlMN}&p3%o?u5Y-;#z$JWUMqGSdzblt2k&Pr z0YPKx*Rb}795yy@$n}!FCmCwGOLO(5kBOaWskd<;ef&#?fgk8 zC4Uijk%ycvmLCNn2>oH9-HQt(T3%j7iYn%91HHd+Gu#i&w5Wd!4)@G?*#CK0!3348 zEXT?E?T9U}Ejqdyjf$+P3og6G&)Dz}s9kp>m){&~Z)0@tS97pQTnw=rqQqhEYKenf z%LAt~vp)}yJv~M0){}qt@U@1&s=GK1^pRs)lI-DRr^l~%aPTt{y}kX;|G3=Xw+QyV z1iwwr?iBWu`$GuC2_0*_Rcd-=g7X8E8Uw*PAb|h=-h61rZbI8QKGR&5X0-!5mWTy2 z9boDUfcTb-8U<=|3s|UMCTqq%BJWa}`fBpzl^bL406nJ$zpkHydmP&ahuhP@@xb-m z;zsc+^6L93)4l0uBPT}{zLgeRq!QnzkQAcVzIRA=R4-2AJr8}3NtDmqy$^;H^mO-4 z&sCGM1tX?b147Pgc_izhgjR)&6u&+piOqOUOd$Rdv?sM%@fOVNkEg00oY(s(Hxoi> z5RE>6K8=p)4J*aSyt%V1b%>b?F#`+m}6wg0wFGBF6O z+OiU|4+BkIUBhG>5)xeO{8AhFNrcyb$oBbM2d=HQWl6kciqt~8Pg5<8i5kLJr?pjvH)Hl>8wW`A5RV^ zGlWs}UUS2l+?05!{!xFv@e-4%Y;3rX&tth*a4OYwZFd9VdP4O^dZ61?9r2|h3DFz< zbmz^ZhJ!F@F7?z~#OkH6QU5sBMDcii^b zWuvUNb5R88)fGdAsC16hV73p;(fZZfitj&lB$0xjCg7|$N zR{@1q)C@-}V#6AI6wkOo!r{UB+u>rDm#80W5GO_}gDkB@m&8rqSg0<`%$*?kdeq#n zSmnnu#ozCz(PRv{Z!9?vr~H1`n^^6N0(J$Zlj>6#y6k0m#yb!Er&#nflAGJX0ZiJ) z$iN3ajjWp=?65$@2-%&G?)VC9J6p@J8ICrLxy~rkRSg=IfvW43usqKXD!$+v4`tO0 zeLJk(**~LoFg~}rmCLlnBd?*H&%&W&ZM{3!b}zETa8+it1lG6x!ED^TK%0&Qy_sWs zow2YwK9TA5mxu^M>Gy~U*)LSkdI8yB1Y9vy-Dv};OK8J(Nt3{A+ihIG;nQ)PJGsxb zp#_xy&$fiaGb*@ogtEPhUc0@ZdCfJmUjvRMKkw-%1!UuQk4lBi`m|E-vwhwj2~ss; z6P#au))zn(pJ+u&t+{1S)qCgM{=K{wQSi7U<@!rtx|zGO%&#c_Ci#`QzP_>U+Ywemb zZG8Fsd4iuFU5x&7DFPD*V+Yu%6!m@BcI*~pxqHy#q3Ce=^6JuL)pgut9RZuxViI@uAW^4G zX5rSANhEnhKUr0>4Y_kbk`|EIB^B`=1*bD~O7GMQ@&;OAijIz_q15yTtJ&A7%~zyS zrH!@|#dVALXx|>2vCoaKFRUa>sJS2)$4&9P<#=XhGWHi=e$3oF#?H~yRa(4*hQe7J zul;>#Qd|q)Y(!C2){8HyVmk=}KW6>#`VR~`yJKpQG&zfsPHyc}rvK>tQa znDG22T1S;hda_vK-&{s`byeEVMT;|}K7OvH)SCHqseWeG$YyQ`3TO72Q-`l4U%#%Z z-Q;;J){8}`_`o~cvcgItRc;i*T%wJ+Zx$n8EOqs{hyT8(TQuaUE~T;~{p7+Se4jX*^^4&n83Zc9mxbC-AnXeh6cLhpeEw`*9~DUun-tMaR(n zAT|JcBjn{wK|9|D^H&=B(UavCp9o3}&1}Qp&lwC`SJ`F`XClH0UoTVOb9?TLabkeo z+q}-Bo@Zm4&zS6}mob!@+5yYq)=cov@%*~$U?aNL3v-4N_}qGiqrnd zOfr6cQ(^kd@ofcpaDLcyw*O|WRQDHy+c_mwN;4}lshHn6sA5QyE+ThNMu~K$Y_3)n zPc80e9(Y!%PMDdIcB{T*!&#ouA5FuhLr0bP&-MmxF2fHJs$CJ1yPm<8MUZssG-dED3HlSiVG-`mtCc%AZ%O>cu9*XcssX696>Qs>&5 z3A5Pt=^2i1e%?F#KIZQ?&9|@IM4$J0Bb!Yh18G{mvW@cBxT1`mEccWwKbYc)-Fc0< zk4Fx+M(!UT?TLea1NM8Y^&rBRmM*2Q!CF~)AYkb;1N3=t#pHgvSl|EIM{e~ zks7Wqd-Eb1DvvvBVJJr?qOu|MJTk3g zn4K1U2L~*rs#-sqkdy1$D`^p7xXi>Gv>{jVt^RT(qy%4+dcYIv+ut3b)irqLm~3^t zpm7-7RAz4sg~6o6yWbjJRweh`)qecAQFr%OT?#Tkd<2D)A`Fdx>tG=7;`lnshFmc1 zPD!cza7x&SgoJH#Oy##@Kb`!=gf;(-C{_DZ;o~RZMq@6wE=~z3)P5*;QiR1$DgsHp zr*#|ZarzG7)vs_R;O<-Mz4pzCT4)E^yEY$ssi+*uE*3sLfl{9R6JUS<6@#sZ`Fgi3 zoDtGSC7lcr_cWov2?#7_f5p9RUG7*TcA_=&tmvH`d&TOt>D(9*{`bCpB&1{gMwZG2 zIW@)*`qP>Nk?>2Uv#aD(*rdmEqYEQE9D);d<3sV4_SbL0vD#Xm_7ZFePu=HY42a|2 zryuj(udCJ?nzo22LZq=DQ!dVbW!sdL^yKmxNju9&b8ft27o)UpQ4pi%fQivDpZ@md zuBtqWMogHG0Hi{d^M%;&rbcn**m?OjERCgcQLR?nQE_z24*3TBSE$bTAFeWXZQtWq zwII8Eu(L5i3dC#>D=IhX7e552xQB|@ifMbSP*n|FWlw|4l0@_WPA8$29v%b9Dnfl} zisve|d^~HX`i`KuQ%l`K5L45HDcrZ;1EACSKn=vz+8Ktgb*qu~FCtKfhQ3$R^6Z@) zb1s;%4g66{7aQfeWB$~3{g-Sy(e)A**M1!*j-RrIK>CtpjXOCT(WDC}ePv;(*C!1( zVL}8E{x3FE|0O2kk^b`a(&StUkzjX>ZcLNMa_p()OP+Swg_)@QllG92Rcy2xJ@jcE z&C12YrT#Os{L#;J`xUu)|6RW-5OXpx$mAChX-|O!W>LPU28^4Xz+6ARyO>P>lZ$tPL>?a%N%R>@4!kYzUdy<)aV^~fM+ zs@H)GtKT2yST(=sJX+t612UU^R76&lSQEYLI=@{Fu*lv)O>}S_%CutSNO+eOixga+ z##P@?N$$D|$d>ajc#6*R$H#~=eUYy^jQY;$xBQWG{QBZ4a=_zyC3bt?)^vM+2y<=z zx$3_`nL3rM#03Ggm)yTFWs5?+pA&&r%-r#UoyJcbH!^#oK~Y>hd>qtWE|QXL*r+@3_})?9Gq&1LE{OX5-@WXR|vOT=|ItX(iDP zX`Rll;yIR}v!&Q{T=>lU=vw1|^~qsU%w=Edi!TI*;T)cXC0AP80fz0OA4dx{f@U0rPVIqu6@Pr ze?P;yC0~TlqiXAfII%q2|K7z*F}-)_*AL8xy!@&^X**4f9r9ra9FEezt~kO-1kiRj z=S{e)YDueB`KoHAde65?ueN`%Bo$`ys#=91NTQNsRGsWxADY(TNN`?k>qppJjdxZv zKBIh=>TZHkcz%3Y9Z!yH^@l0wAggTw#;_Kn>r7xRaFt{zh&f04tv3h~luvWjR#*un zlLry4XcTrE4&$n~PkrC`VV$*+`M^?u+aYwp13n0j)w+$IANehw%n%f`AZT6w&Sd)F zy$kp4NmP|Zwzah@dIas0oy;R{$0o~()pb&S956adpK8!xPM*JB;_fC9^q3`;S|q&}gL*$VAKuK&Q6qVarTTR|$A-SC@Xpt0E9Nxcme>FHUEccfAr`>6dX@^uL-0}I_-BTHuR(|Vm`1!_yr-=e{73l`=U4*~v@tHYiO_jKhpYTq**yetTfYKX)zhTEZ z^XW+teDvH;DJD;T*LH7-hdVhj`~x<4SA-(;`i{~gdvP!K`2{OuKcSmBG^b4o3tg?W z^y4Ghb`vL7mn6y8&dfL~`&UE`Mz;9j?d-V3Q}mr(uktnzo~&(!H9a?Z*z{Iy$}46H zX3LtF1OfETb(*jqlR>(8@ou%4*Y>L%MMI-pEEJ{yv0uMD=r*(Zoii)DR=wdMLNWH4 zVZ!t3U2%D7t$Sg@bzdLbbJwbjD%Qio@vExjl_j{A%hmNI5pdgYM&>oY{oX|t`(PGb zlI54hoseJFPU(~7|4Z(*+g9BApw^A6#>`dB@9O6D=TG373?dKM|$gMF7v?ar1y`63>2*WveFkl&|R(l87LTD znl0d|IO_?epFfnX%f=eoWrFK8LnNL@2ipjKxyjnoYMY zu>(EM0p?7p9w&a8vOSE_lOj6(Itm+kKWRm_u1e0i`%Bkc>> zFo5SPG&0-~63S{2vv!NVFeO>mAEZ-H>Pj=`fSg2Xs7Kb#soT1xrrgoNAW8)qQi%O= z$`mh(4s9IP2UA_LuS;fn1fgzV9|z5?p4-LZlXmfiCe8dA9H<*NwPJpi@ceY$T<6PR z!^Yf}e2RM`&oA6Xz4H^Q#ThJhu|mx5#e;KH%DdHJZNl0j*HG)yfG{D7x5kcq-n^!O zt!9hK)$wtrI62@1`dX82>(G9vyt?wiH(z(PSE8>wh%s>j(hWi&9V)E-zZkRrv||67 z`4x=7(ZRpJHSo6`0ni&zjrPvxdJpS*xTpG~c=-ADUVM{WIHoEX>=K*VLR_sg&k`@> z$FkN@AvV=O`0KYD$Bl_K6X;sSl_$5>nBV(XPpuS%C5ee+k>EUz5bMeQ?R49JIcE%S z=FR1XX&*mmPnxfk2FIid+Gz12Lg5NZ{3;Ou^;2Se%;L#O3yRnQaZzj!l(Vj0W{Kfg zbv56y1J%-+amOwT2Pf6#FKG-q7H>1ep}f4`QQw$U{qQbrxkWYMXSNwpIxFxdR7s51 zjNdT&kS-$Ot_R!PDo7PieH<|I9%60lK@lOMHG^oFt#Q z+=gdPLd*HW>>pb9#a+UbnjrWY^Lm1F4E-g-3kNVr7PD8QvDjEB?)mfDJ{(MuK=+1h zt38m0p(ZK4reeq4!(FU1L0n&t-cr%U#f1?F%N3CxK|aP`V-$UCTz%P|q<-kP|8}f9 zF%&-1aqVxk96@!kCjVS;2#1*v7qPI#o-}_zn8KCxg=QB|@y9<#t7J=f=`D7am@4tQ zi(CTMrm|p}Rd3;hvK!GBp;5sCdysCpkun2wZ=RWu*k2$*#N;v0Nb(#PJB=1*Y%?DY zr^EwfH^Sr(SI#+`_4N4Pnsgyxo1Xue3GR-0rO4KF1-wD(!ti>^-{gSih<(l#4zyd7 z0{f6f-43}RRJzJNUPDJchKkB3)Kw!29{lq4YAngzDz(ihQ}e=jnNGsYfy9%}B>TZR4^kGmh^PF< zUgwo%3Cb^Wyg{C8eL}Y0tpb*Nriap}_V@9xfbi(je?Z<7ZQ!tmf&)z0;|e&{5e$Fayn8_*2g{-c6V9WE;_k%l1|BSwISFPO~YI*^q z(>vdxa^={29w>4ppm~Y^3GjYXs?m87EB4!YgI|LWo9|*&Ox4}}&kiG%?3miIVz(51 zcj<43frop_wGkP5lSV=y14y^CMeM@B1d~yQ9bH6KUC*2hVCQzpRWy#402HvM-KcHP z_438N;9hljjr{KBm!)paUxG2ZmyqU<5WOEI;Hty4mRHzl(M5D3iSj*e(szQDl)Vwf zw#TG%rBq~=eyEQ>Jy77VX^l9h6hS2uxg`fpGbF94eDnzrM1&tbx4X7-K;T1mP^YZ5 zaoduiG0HQ4aLW!h#1{VP6$NWd`mniQRzZE&kC`cef@t#=AZKJ_gTja)67MI$I#CQTdab*{3-0OxZ&gbeY`W4%5Nks zSg*6w>GEp(Lj?y1UTA*XEr)2p(>IA4bRaO8e9e6I>%)AS&p%+s&Djmz59HKL!Kic{ zoc?V}`7J>q`?J*Dli$s8Rts->VJIAQx6uwnZz5|9ng9nUiu>0FMdaFVE344L%^hlBfkk@C z&^1E=O$8JbZG9pYG@YlY^k83KzqvwxyFtObn?HBgE3&=OB|KI;1QVi=>69;M!IO*k zvY#{;6M3j17M7NO0sgUurwo@5h-X~5rQrTADtgQRbaO)&%O0c)I!(__M0Q4AhK&lG zaERx<)6Mf%uu1LJ^WNv_Y0WKa10WCp=k;EO!-EdrHVg^ozBEI@v%lL)k5-K5F_E34 z*?vLq=gRTo(3?s{e0+3W3=n^Cu;GN}*Qx&(vg80kkqUi+ij97Ma!roVwpBZ_;!y=R zEXR|Tm?Vl-yVhc+FX<+;_6-~1*doC-tBB%i&ybW(v9YWD2O)9(Me(vP(fqDUu7&l* z#l;_z1$;(O)&^4;|AoKW&n#P|hx_5l`E-Z6*^4L$z!t)F4(tTw&P=S!^=&W4&0SzY3P zX|>M~{=APjC<-BMLk^d<7jLA!eBJf_+-IUESbc)Dz@%A?v&3dbufF>gDh7=wF$Y|~ zE0g)?Px&u~xoh|9`4LlMhYvD{!?6u!$HLdNPVVFl$#kE=wVnYN3V_75KRa|}M45Mk z4xb5!GSV%b_c`5va`1Xk1-F{98!#d}H`^wuPZQ!(pTuwQKMxzlhS|uDJ~CRQ^zTev z29Hb@kjL!$D>-z_(Ry}CgmM@n%dk@JikoijB7%JhUTs42k3`i`AIS&;(J+apC{fj~ zDJb!kPGbhwfC(6%Md^%$eF^~Bt*k+c#9k3s3`Ff%KQTYYi^`Pxdi?WY{w|@XdiDwF z4qA|^*u!Wl-JAk-Ht|E*^FK_}W!RY-S1MdEapq~DK7L}kydzo+ zjCnvuDU_YWNSX0^ktbS|Ynk`Oq%eAMi~Fzt zabMkISkn0oDN}>0R_6BhUMW_=#6O?0K0Q%(*3m84fhF?Q;%c~49M0Y;QaCB|90Q*oLwbH@DKo&CG9QasUP7OhrS?QrZhgrJ>MNh?X;R>H*8G}KsJ zuNtued*s}_CEPHqxyI7Fp@+U}{%&=D1C&4`0T1K~O&=~vO5J{axxy+M9N%cWH89pj zzOA?i&>9hM?3RERp<=IBuoHC*kjQj&rjwKNO6q3TP&++j@E@#4t?IJpuV~)rU%Ec` zaMMD$%dH*XyiQ8lXt_Tosl+mM^dNGHqY9bZ9ISNt@2}VB$RcTMGJz_7{BD${f4$IN z2SQsE3Hj%VaoHbpcvjVX{-A$$^Y_+zQt;bN0i8o)XXoqvbSg$nX;ayNgt zeZ8mdAUfEzxHJ~)v`cq=?yNrN@4@|$ln3G|TRjB^d^|bg@x7x3M4Dy&6&xb*Syx@} zbU;VxK05#l90T&pJrFPP08Ju9AWuC2A|`;l-EmS&QhEgfHFcB^ch#>p$*ou4lTr~_ zsy3W1?(aL@l<}R;P>`u*{`V^90ctg{zOB;H`JXK1PV3tN54gnIXf6VnukHQyc+4}? zwGSJN(mScDot~w>SabZKp7F|(-c|gPllnKxMZY+XnAP?kseF~jYTN6Ys&&O|EzaK3 z4ufp&n)>zDcRxL*lkqn|G~DF62OEpnLV_3>P{UH+nn@&|V_b2l9rUT`}fU{c&f*FkFG@U#udAu!>tidlBMDM(^KmWA8b5qu6 zW&Ino;;)e?!jrV8d&0BZFg7{d%Dd|&JkMukmGuQLA^+~MVLqwlkAvgfgu~14I>iZiyGl!DP5d@I3z4@f0t}X(lnC)KugC`lt*5V!8f?*@h=Jn=9|@DybHu%c7irlO331 zKFnws;Xo;xiz3ji5$5TN_ZR+UFlvP?UpV64-M%kqqV6bhT)&kZE;_&& zdm=BuxBu8L4m|r7=51Q|y3R2i`rQqR<3LP_J(c2ms~NNV`;S&>z#eLH#7Z`^16TN# zX`z{vw_2V2b#ydS09m*vqR1nWmjAc@!KL9y($AW$!GTK|Af-08wYcK=rJ$g|%d>EH zgVK-v#F@7o^Z)lw)@TDFdL&N?RUTnTvq3szIPm#hnhNAM~oFR#7grwa(ZpCfc>Y_ zR^|6II?L8Mj)v_{Ai(PHiC$>ff~6g&45pu8#&62TJM;6CsDD!qb5KaiT;Px*ENHpW z`7~PqU8B66wEE0HCn>M#hj*_-9l=+5DBYL9A6iUrl4E)t+k;jd9`Wj<>Ii%bFP8&2 z>#BpNM-fY`?De%Hgnx*0M7X#a zt@IwuNPgeeUV1PMKl6Eu$gRG%b7cyFfe^vi*;2}k-_wiE#GRa0rz|`%9=k{{R$IEv zNW%p*4#6%dy?uhB_MeNl6oV*GJ3DRiE1JMW$}gXNIXKv4i(XRA zqSvP_5mn5b=b#&Zd%ZI5Rl#{0sV1tF){NCs$pl>h>Y0H@%l?m96106 zW&a8`&W6QVseu%`{SNI_0M#Q@5j1>YSseh)r!N=+wv~I`Nci6~W!~?5Ug ziHn2jSL2&1q&Oo}|9zLKr}r<1`LSf+_L{E?L^jzWkke0bGo>YLqc{6;u{Ih^mvTmp zEP{0JPvC>*yS;eignn3^^nOA~;Hi{yuScb?h~@u~oE?PgToyiSsbmEZ1(}L71TE&H zDI+kEA456bn2`cyl=yC5AE>o7HtJ@(J`~QRB>$1HLT0zH%#+B9o7F=)VGyPx>;aL2 z?i98NW6j!?IPn>-f-P|NyKI6m-p^gl+WK6uDwH~|$YJ|S;PAo*klDh1xB7x5y6 zT&m`rHy38AYUjK3mW^f?%cZ|#lhl3dO@-4vbyta(@r~m)^;3mBbRg78w#jZR0}1P(sE> zW`(R)@6>yg9!WX5OV1%{^uVZgN)1-tu1&2H&d0?A+vM_W zc>SICG(P@6#PWr;x@U5RummH|@m_bJ*9=eNMllVoBbAsR1+nwj3Zzh5d-vEzHX{$~ z!T5cN;>WC!^)P?hA&UZoMONWvP*dfw(+N9;ntCRmXP|?4`G>`-49m8E8Uq~tx+lb? zXn*#{4>YbNbUf+CP0!4&v*uDzFbO0=LH(!Z|CFhXBrEgo#I|`<^C|4RO2a8gkWe%6 z+*wJS3LrX}T~TN?HP+A2Cxv%fq<`Du}gL9>eOK5T;hFP)ZPRE>qVeDcalnD)84b;Y2k+|vA{*XHx)4M<=| zT=mP;&dubORYC00!n!_G+6H0e^~>yXa>b8bNFjme)gWEkrb9LBV6sNG@|*x_4+bPr zk!ERlLg15*Zg52PRH9pYqU27P=vVS@6$o+!;h$pnTMfoCEJZZFce(ze7Z-!xNv4k| z-_@6QXzn1wsi;;c~d`ZZew;L3_0RBM51(}66YH)c; zajA>@l_n(hWsIS5EepOAb_QZbfL214i(7DB5e)N@$OVU!!9GCfOLE#xqDZ@*aT_zfvzLkX8+c zhy~(_2W`B5pRsE`jS3!_|L86#-}M17VZhj01(}$TkOn@`K)G%qUXpuSn|yiqvT?PQ}Gh8$Vmwi_2ON5aU3ZKovt!EXHU;v=pBh# zC9sMh-faf{c^2RNous~2E-pr!Fj(K;P2 zh^Mpkk?)`=@yE>k#WbExc{w5S)2ai`&y9uiZyd7ce6qeoGHM#m>f480sA4&sn<<7t zS6JZE0R`NrzaZB}YZ~bQCi(0W!#Tf5z9Y?ZZbG`KRl$esgRy6uTEBS z%*+zHQ9zVY&7ZJ|_I7bLDb0zD88AX#=u?KYwX}!}MSuqgUuJn_aZ9R7dI{imJV+3K zcs&+9;g09#IUGNZ82IlW6GX|?k_T3zUt*JcUE3>9%}+0qmKb}7HN0qhR%fUpR-p0; zzW7-IhJ8Ly*Yw^kEulfjb~h>TI@@9c@R(DqF;!j2{Qmwqmi2e%2=SjE;j~B)1Nj$* zpR>XfkkEAp*_6sk*GNQAK^!^GQ!BSCkQ3vJ$Q2?(@0djif5FY)u$=*^F$A{BPSugo z5h1PDdKAPnaxsgGLvM)E?wRF(zS(^(5Y+|J6F7gtLP@0?-3pPql{_JbTBgnO%t6Nu>Z29kOGN2vzMWMUJ z5_IfA&2^lcTRK;2Id%&BzdFu6p6R}gc`Ux0%M8VJ(v!w~~^Gaw_E% z6;rk`@n8-uCPi{%B_frc4nm5_bGLMm4sIb0xogO{xpjX%&tK2$^*n$5{q^cOS>TqI`)Q#V}p(|!A>65jYrVENKy)X5B; zCecdB8R$tO^sMr%6(ck2AGc;2izV0*^7fX5qIU2u0$D}(Wp{~xu#UtCw0-~5SbJm0 zM=9WZSvv44*j}d_J(bNWjS8%i`y5hb>an~gZIbplv6StE3NV&+n`&M106N&lfI3ii z1jyAD$+ml70E9gB|D{7mXw2RYH;IAP6cmeN^P7 z201y6lb?|M#bv9sZ08H6zA1UWLBk)DtQf#u3R253T(fc>3=FHLeV1Wu4GsTg&;Yv{ zpYknLRY>FfdS3pxH+*5>?Lpwb4w;)O!`hNQr}}~|-wCHBh*DO@Z(scK0a-37GIM#} zaz;MwTyy0PF?iFA49;a9f=W6f)iixN!1D`kfs5ao;^Vi@_k9LEWhKR7Pi-wCBNR+E z*MQA36--ADrydB;G;ndg$q+4B!HQ~|M|V8`E)>n@6nqzX3;Ptfi>sITl0EgE7ahM% zwA7pi&rhFXYTG*-w)BmZF#5Zur#I%*ll@+g#`e8UJ~g{IxH7|9oV=kIR=we2%F<;; zWY4+Z$D)zRk46l&)*pAm&3dBZ;c4wAR0CiDPHF3=frh8Z&K&RM<@(}k7!b&4>bSSp zCq2VV;J8PLoRC06C@nvgYq-$Bp&8tTk|_L>r(bh726s8@cNPY^pXwzE`=+2@dBH(* zUG>KZiorz;*)c|1vC!=2|MH0i5K)!)Z)+DlJAd-%{trV#pH)h~&7Y~yNxO1Kj6ntu zSbUg_tkQ2om)s1MpNZ`tV5o=P)L-=)LIU2Izw$T(@uKF#GgW+mrp;F%T@5$ePd;QD)`jH3xT1zpTU3hvF zquDy@6TXR4OwjTq5{r(btGia|Bz-Z``+{d#D4@-5%)6~C`|!8JrYpf;`-TR};$Zol zeVCzhZu9*U0uN~+7t0s#er9Lqt1slJ6TjLMiG2_1x@Pq;_jXDh1zW>)f%xLdUo@?F z*^345*xo?&3TtYv5OA<$vt>+!d@kRp-dgr&Vb6%en99)eR^(Z?pE?K|POV)10Y(!C z92)$Y43)U=bKLY=9jl|qLO~d5t*6>-Vp3&Go&GWOkEpBH=s^MI*AkAi&Q+KhjH5fo zknNTM<2&+Ugzf~NRcZ1~WNO4}{6`pVldOuf#?=Y+(Am;y;beL+HaB!5ogR_Q>{~QJ z)u^VJhalpD5%P(`-oZK>T}DPw#8|d!v?ryEiBkE3km*<4YH_d13!T=_QcLA0XSxjAEA4x)^o0$&;4UMKO7F2I{fVnf-u#CE8#h-N#T)|2Vv9(33FNnGD?J9o$dxWDyx+5rrl>NV$Ne%0|rALDf&%T!nDoxDk0Sh!)?c*g{>FP z7d}vOTmQri(}pr8|4-5j;fFF@x`j@!Im>ce!qRT=oBj8d; zfTNju#k_$-{H&y9VGCJXo$<~(Ye3S&?6vAJums%d#_s%=I2KvmuhdB|$O?Ypjapz- z`=7peE`CBBGNy)TbF709(Xh^~?*7*-#i;Ih)vrQAkx^gYa2cWyg=mZZPvC~J2Ofsz zFfbi?xB2U_62!zuzt{KeEGNBgV>P*ux+ZLmZOm}+JuPewO-6 zYE+ufgv4Si9uCvhHa0Oa4SHD91O*{H*5xhC!+D7iQYCctg)GY2UAuPi4I z6*1Q1*q5#u*~;$f%6ZBmM}EzJuZFz@&%V65-PKC)@Aan?4)8b%lU+bZv)ic!5Ohrza5904XY`PsM>s+53ZyHz(%&xpJ6TZJSuh zv~!J+qDeQv^Oay<@gZjxOy1m0q?*INM_SA6ArHs`vM$lCN{8oVTrS_aPooEqV)gIx zn4m?Gwz1y5JF;`%K0qizlR}n^u=hW|h%8YE0a(g3k+C;1EHp8kaws7jd>|r$NVF!9 ztcfH)0-0iKPqEu#Ngz-N1eaRY literal 0 HcmV?d00001 diff --git a/examples/electron/index.html b/examples/electron/index.html new file mode 100644 index 00000000..3cbb11d7 --- /dev/null +++ b/examples/electron/index.html @@ -0,0 +1,18 @@ + + + + + + + + Hello World! + + + +

Hello World!

+ We are using Node.js , + Chromium , + and Electron . + + + \ No newline at end of file diff --git a/examples/electron/main.js b/examples/electron/main.js new file mode 100644 index 00000000..45aee6b6 --- /dev/null +++ b/examples/electron/main.js @@ -0,0 +1,26 @@ +const { app, BrowserWindow } = require('electron') +const path = require('node:path') + +const createWindow = () => { + const win = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js') + } + }) + + win.loadFile('index.html') +} + +app.whenReady().then(() => { + createWindow() + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow() + }) +}) + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit() +}) diff --git a/examples/electron/package.json b/examples/electron/package.json new file mode 100644 index 00000000..e05a8d88 --- /dev/null +++ b/examples/electron/package.json @@ -0,0 +1,30 @@ +{ + "name": "electron-app", + "productName": "ElectronApp", + "version": "1.0.0", + "description": "Hello World!", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/crabnebula-dev/cargo-packager.git" + }, + "author": "CrabNebula Ltd.", + "license": "MIT", + "bugs": { + "url": "https://github.com/crabnebula-dev/cargo-packager/issues" + }, + "homepage": "https://github.com/crabnebula-dev/cargo-packager#readme", + "devDependencies": { + "electron": "^27.0.3" + }, + "packager": { + "outDir": "./dist", + "identifier": "com.electron.example", + "icons": [ + "electron.png" + ] + } +} diff --git a/examples/electron/preload.js b/examples/electron/preload.js new file mode 100644 index 00000000..52536927 --- /dev/null +++ b/examples/electron/preload.js @@ -0,0 +1,10 @@ +window.addEventListener('DOMContentLoaded', () => { + const replaceText = (selector, text) => { + const element = document.getElementById(selector) + if (element) element.innerText = text + } + + for (const dependency of ['chrome', 'node', 'electron']) { + replaceText(`${dependency}-version`, process.versions[dependency]) + } +}) diff --git a/package.json b/package.json new file mode 100644 index 00000000..352055cd --- /dev/null +++ b/package.json @@ -0,0 +1,3 @@ +{ + "private": true +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..f2c4041f --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1755 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + bindings/packager/nodejs: + dependencies: + '@electron/get': + specifier: ^3.0.0 + version: 3.0.0 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + extract-zip: + specifier: ^2.0.1 + version: 2.0.1 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + galactus: + specifier: ^1.0.0 + version: 1.0.0 + devDependencies: + '@napi-rs/cli': + specifier: ^2.16.5 + version: 2.16.5 + '@types/fs-extra': + specifier: ^11.0.3 + version: 11.0.4 + '@types/node': + specifier: ^20.8.10 + version: 20.9.1 + ava: + specifier: ^5.1.1 + version: 5.3.1 + json-schema-to-typescript: + specifier: ^13.1.1 + version: 13.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + + examples/electron: + devDependencies: + electron: + specifier: ^27.0.3 + version: 27.1.0 + +packages: + + /@bcherny/json-schema-ref-parser@10.0.5-fork: + resolution: {integrity: sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==} + engines: {node: '>= 16'} + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + dev: true + + /@electron/get@2.0.3: + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + dependencies: + debug: 4.3.4 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@electron/get@3.0.0: + resolution: {integrity: sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ==} + engines: {node: '>=14'} + dependencies: + debug: 4.3.4 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true + + /@napi-rs/cli@2.16.5: + resolution: {integrity: sha512-mFEzwrg4IOLngGd2/P6yeqIWgwQNn59Z08n1rndu6kLDq1gg954NH9cM1O9Da0RJuybt46p43lqgSsnAY2mxqA==} + engines: {node: '>= 10'} + hasBin: true + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.9.1 + '@types/responselike': 1.0.3 + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 20.9.1 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.9.1 + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 20.9.1 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.9.1 + + /@types/lodash@4.14.201: + resolution: {integrity: sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node@18.18.9: + resolution: {integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.9.1: + resolution: {integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==} + dependencies: + undici-types: 5.26.5 + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 20.9.1 + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 20.9.1 + optional: true + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + dev: true + + /arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + dev: true + + /ava@5.3.1: + resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + dependencies: + acorn: 8.11.2 + acorn-walk: 8.3.0 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.1.0 + cbor: 8.1.0 + chalk: 5.3.0 + chokidar: 3.5.3 + chunkd: 2.0.1 + ci-info: 3.9.0 + ci-parallel-vars: 1.0.1 + clean-yaml-object: 0.1.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.4 + emittery: 1.0.1 + figures: 5.0.0 + globby: 13.2.2 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-error: 2.2.2 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + mem: 9.0.2 + ms: 2.1.3 + p-event: 5.0.1 + p-map: 5.5.0 + picomatch: 2.3.1 + pkg-conf: 4.0.0 + plur: 5.1.0 + pretty-ms: 8.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + requiresBuild: true + optional: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + + /callsites@4.1.0: + resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} + engines: {node: '>=12.20'} + dev: true + + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + dev: true + + /clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} + dev: true + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + + /code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + convert-to-spaces: 2.0.1 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.4 + well-known-symbols: 2.0.0 + dev: true + + /convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + optional: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + optional: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + requiresBuild: true + optional: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /electron@27.1.0: + resolution: {integrity: sha512-XPdJiO475QJ8cx59/goWNNWnlV0vab+Ut3occymos7VDxkHV5mFrlW6tcGi+M3bW6gBfwpJocWMng8tw542vww==} + engines: {node: '>= 12.20.55'} + hasBin: true + requiresBuild: true + dependencies: + '@electron/get': 2.0.3 + '@types/node': 18.18.9 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /emittery@1.0.1: + resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} + engines: {node: '>=14.16'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + requiresBuild: true + optional: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + requiresBuild: true + optional: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + + /flora-colossus@2.0.0: + resolution: {integrity: sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + fs-extra: 10.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + requiresBuild: true + optional: true + + /galactus@1.0.0: + resolution: {integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + flora-colossus: 2.0.0 + fs-extra: 10.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + requiresBuild: true + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + optional: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-promise@4.2.2(glob@7.2.3): + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.5.4 + serialize-error: 7.0.1 + optional: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + define-properties: 1.2.1 + optional: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + optional: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + requiresBuild: true + dependencies: + get-intrinsic: 1.2.2 + optional: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + requiresBuild: true + optional: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + requiresBuild: true + optional: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + function-bind: 1.1.2 + optional: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: true + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-schema-to-typescript@13.1.1: + resolution: {integrity: sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + '@bcherny/json-schema-ref-parser': 10.0.5-fork + '@types/json-schema': 7.0.15 + '@types/lodash': 4.14.201 + '@types/prettier': 2.7.3 + cli-color: 2.0.3 + get-stdin: 8.0.0 + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + is-glob: 4.0.3 + lodash: 4.17.21 + minimist: 1.2.8 + mkdirp: 1.0.4 + mz: 2.7.0 + prettier: 2.8.8 + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + requiresBuild: true + optional: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + /matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 4.0.0 + dev: true + + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + requiresBuild: true + optional: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-timeout: 5.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + dependencies: + aggregate-error: 4.0.1 + dev: true + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: true + + /parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + load-json-file: 7.0.1 + dev: true + + /plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + irregular-plurals: 3.5.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + dependencies: + parse-ms: 3.0.0 + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.3 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + requiresBuild: true + optional: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + requiresBuild: true + optional: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 + dev: true + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..e0cac166 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - bindings/packager/nodejs + - examples/electron From f0235d099648b9640d1128c3c2825d12bbc264d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 03:20:55 +0200 Subject: [PATCH 2/5] chore(deps): update rust crate napi-build to 2.1.0 (#65) * chore(deps): update rust crate napi-build to 2.1.0 * Update package.json --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Amr Bashir --- Cargo.lock | 4 ++-- bindings/packager/nodejs/Cargo.toml | 2 +- bindings/packager/nodejs/package.json | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f1cea3f2..ed34b699 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4029,9 +4029,9 @@ dependencies = [ [[package]] name = "napi-build" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e" +checksum = "d4b4532cf86bfef556348ac65e561e3123879f0e7566cca6d43a6ff5326f13df" [[package]] name = "napi-derive" diff --git a/bindings/packager/nodejs/Cargo.toml b/bindings/packager/nodejs/Cargo.toml index eaf0de9a..a5dc48d3 100644 --- a/bindings/packager/nodejs/Cargo.toml +++ b/bindings/packager/nodejs/Cargo.toml @@ -18,7 +18,7 @@ tracing = { workspace = true } serde_json = { workspace = true } [build-dependencies] -napi-build = "2.0.1" +napi-build = "2.1.0" [features] default = ["cargo-packager/rustls"] diff --git a/bindings/packager/nodejs/package.json b/bindings/packager/nodejs/package.json index b2be26fc..0fa6ebb4 100644 --- a/bindings/packager/nodejs/package.json +++ b/bindings/packager/nodejs/package.json @@ -51,7 +51,6 @@ "universal": "napi universal", "version": "napi version" }, - "packageManager": "pnpm@8.7.1", "dependencies": { "@electron/get": "^3.0.0", "deepmerge": "^4.3.1", From 548e4405fb7c34aa8a13c5238be4dcf37702ae0d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 03:21:11 +0200 Subject: [PATCH 3/5] fix(deps): update rust crate napi-derive to 2.14.1 (#67) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- bindings/packager/nodejs/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ed34b699..3f0ef012 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4035,9 +4035,9 @@ checksum = "d4b4532cf86bfef556348ac65e561e3123879f0e7566cca6d43a6ff5326f13df" [[package]] name = "napi-derive" -version = "2.13.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da1c6a8fa84d549aa8708fcd062372bf8ec6e849de39016ab921067d21bde367" +checksum = "3619fa472d23cd5af94d63a2bae454a77a8863251f40230fbf59ce20eafa8a86" dependencies = [ "cfg-if", "convert_case 0.6.0", @@ -4049,9 +4049,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.52" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20bbc7c69168d06a848f925ec5f0e0997f98e8c8d4f2cc30157f0da51c009e17" +checksum = "ecd3ea4b54020c73d591a49cd192f6334c5f37f71a63ead54dbc851fa991ef00" dependencies = [ "convert_case 0.6.0", "once_cell", diff --git a/bindings/packager/nodejs/Cargo.toml b/bindings/packager/nodejs/Cargo.toml index a5dc48d3..33686bff 100644 --- a/bindings/packager/nodejs/Cargo.toml +++ b/bindings/packager/nodejs/Cargo.toml @@ -12,7 +12,7 @@ crate-type = ["cdylib"] [dependencies] # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.12.2", default-features = false, features = ["napi4"] } -napi-derive = "2.12.2" +napi-derive = "2.14.1" cargo-packager = { path = "../../../crates/packager/", version = "0.3.0", default-features = false, features = ["cli"] } tracing = { workspace = true } serde_json = { workspace = true } From 7f71226d47a8a48d27acd0ea70f9228a61a2961e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 03:30:25 +0200 Subject: [PATCH 4/5] fix(deps): update rust crate windows-sys to 0.52 (#61) * fix(deps): update rust crate windows-sys to 0.52 * Update util.rs --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Amr Bashir --- Cargo.lock | 68 ++++++++++++++++++++++++++++++++++++- crates/packager/Cargo.toml | 2 +- crates/packager/src/util.rs | 2 +- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3f0ef012..1bff632f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ dependencies = [ "ureq", "uuid", "walkdir", - "windows-sys 0.48.0", + "windows-sys 0.52.0", "winreg 0.51.0", "zip", ] @@ -7751,6 +7751,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -7781,6 +7790,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows-tokens" version = "0.44.0" @@ -7799,6 +7823,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7811,6 +7841,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7823,6 +7859,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7835,6 +7877,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7847,6 +7895,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7859,6 +7913,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7871,6 +7931,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winit" version = "0.28.7" diff --git a/crates/packager/Cargo.toml b/crates/packager/Cargo.toml index 9b7ffd03..2551b05c 100644 --- a/crates/packager/Cargo.toml +++ b/crates/packager/Cargo.toml @@ -73,7 +73,7 @@ uuid = { version = "1", features = [ "v4", "v5" ] } regex = "1.10" [target."cfg(target_os = \"windows\")".dependencies.windows-sys] - version = "0.48" + version = "0.52" features = [ "Win32_System_SystemInformation", "Win32_System_Diagnostics_Debug" diff --git a/crates/packager/src/util.rs b/crates/packager/src/util.rs index 3e0c3bea..8f68bcff 100644 --- a/crates/packager/src/util.rs +++ b/crates/packager/src/util.rs @@ -225,7 +225,7 @@ pub(crate) enum Bitness { #[cfg(windows)] pub(crate) fn os_bitness() -> crate::Result { use windows_sys::Win32::System::{ - Diagnostics::Debug::{PROCESSOR_ARCHITECTURE_AMD64, PROCESSOR_ARCHITECTURE_INTEL}, + SystemInformation::{PROCESSOR_ARCHITECTURE_AMD64, PROCESSOR_ARCHITECTURE_INTEL}, SystemInformation::{GetNativeSystemInfo, SYSTEM_INFO}, }; From fd134230d98ffe7833bd211c1b77cfb3d0bd1958 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 03:30:35 +0200 Subject: [PATCH 5/5] fix(deps): update rust crate napi to 2.14.0 (#66) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- bindings/packager/nodejs/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1bff632f..f4d71469 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4016,9 +4016,9 @@ dependencies = [ [[package]] name = "napi" -version = "2.13.3" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd063c93b900149304e3ba96ce5bf210cd4f81ef5eb80ded0d100df3e85a3ac0" +checksum = "f9d90182620f32fe34b6ac9b52cba898af26e94c7f5abc01eb4094c417ae2e6c" dependencies = [ "bitflags 2.4.0", "ctor 0.2.5", @@ -4064,11 +4064,11 @@ dependencies = [ [[package]] name = "napi-sys" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166b5ef52a3ab5575047a9fe8d4a030cdd0f63c96f071cd6907674453b07bae3" +checksum = "2503fa6af34dc83fb74888df8b22afe933b58d37daf7d80424b1c60c68196b8b" dependencies = [ - "libloading 0.7.4", + "libloading 0.8.1", ] [[package]] diff --git a/bindings/packager/nodejs/Cargo.toml b/bindings/packager/nodejs/Cargo.toml index 33686bff..d069b49e 100644 --- a/bindings/packager/nodejs/Cargo.toml +++ b/bindings/packager/nodejs/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] [dependencies] # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.12.2", default-features = false, features = ["napi4"] } +napi = { version = "2.14.0", default-features = false, features = ["napi4"] } napi-derive = "2.14.1" cargo-packager = { path = "../../../crates/packager/", version = "0.3.0", default-features = false, features = ["cli"] } tracing = { workspace = true }