From ed348e3b27c66e8b1856b1b2bce9ee5c672a9717 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Mon, 2 Feb 2026 12:41:56 +0200 Subject: [PATCH 001/141] basic scaffolding --- .github/workflows/onPushToMain.yml | 62 + .github/workflows/onRelease.yml | 24 + .github/workflows/test.yml | 28 + .nvmrc | 1 + .prettierrc.json | 9 + README.md | 33 + package.json | 18 + packages/cli/.gitignore | 5 + packages/cli/.prettierrc.json | 1 + packages/cli/README.md | 612 ++ packages/cli/bin/dev.cmd | 3 + packages/cli/bin/dev.js | 5 + packages/cli/bin/run.cmd | 3 + packages/cli/bin/run.js | 5 + packages/cli/eslint.config.mjs | 10 + packages/cli/package.json | 70 + packages/cli/src/commands/deploy.ts | 10 + packages/cli/src/commands/destroy.ts | 10 + packages/cli/src/commands/fetch/config.ts | 11 + packages/cli/src/commands/fetch/index.ts | 11 + packages/cli/src/commands/fetch/instances.ts | 10 + packages/cli/src/commands/fetch/status.ts | 11 + packages/cli/src/commands/generate/index.ts | 11 + packages/cli/src/commands/generate/schema.ts | 11 + packages/cli/src/commands/generate/token.ts | 11 + packages/cli/src/commands/init.ts | 11 + packages/cli/src/commands/link.ts | 11 + packages/cli/src/commands/login.ts | 10 + packages/cli/src/commands/migrate.ts | 10 + packages/cli/src/commands/stop.ts | 10 + packages/cli/src/commands/validate.ts | 10 + packages/cli/src/index.ts | 1 + packages/cli/test/commands/init.test.ts | 10 + packages/cli/test/commands/login.test.ts | 10 + packages/cli/test/helpers/root.ts | 7 + packages/cli/test/setup.ts | 8 + packages/cli/test/tsconfig.json | 9 + packages/cli/tsconfig.json | 16 + packages/cli/tsconfig.tsbuildinfo | 1 + packages/cli/vitest.config.ts | 12 + pnpm-lock.yaml | 7065 ++++++++++++++++++ pnpm-workspace.yaml | 2 + 42 files changed, 8188 insertions(+) create mode 100644 .github/workflows/onPushToMain.yml create mode 100644 .github/workflows/onRelease.yml create mode 100644 .github/workflows/test.yml create mode 100644 .nvmrc create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 package.json create mode 100644 packages/cli/.gitignore create mode 100644 packages/cli/.prettierrc.json create mode 100644 packages/cli/README.md create mode 100644 packages/cli/bin/dev.cmd create mode 100755 packages/cli/bin/dev.js create mode 100644 packages/cli/bin/run.cmd create mode 100755 packages/cli/bin/run.js create mode 100644 packages/cli/eslint.config.mjs create mode 100644 packages/cli/package.json create mode 100644 packages/cli/src/commands/deploy.ts create mode 100644 packages/cli/src/commands/destroy.ts create mode 100644 packages/cli/src/commands/fetch/config.ts create mode 100644 packages/cli/src/commands/fetch/index.ts create mode 100644 packages/cli/src/commands/fetch/instances.ts create mode 100644 packages/cli/src/commands/fetch/status.ts create mode 100644 packages/cli/src/commands/generate/index.ts create mode 100644 packages/cli/src/commands/generate/schema.ts create mode 100644 packages/cli/src/commands/generate/token.ts create mode 100644 packages/cli/src/commands/init.ts create mode 100644 packages/cli/src/commands/link.ts create mode 100644 packages/cli/src/commands/login.ts create mode 100644 packages/cli/src/commands/migrate.ts create mode 100644 packages/cli/src/commands/stop.ts create mode 100644 packages/cli/src/commands/validate.ts create mode 100644 packages/cli/src/index.ts create mode 100644 packages/cli/test/commands/init.test.ts create mode 100644 packages/cli/test/commands/login.test.ts create mode 100644 packages/cli/test/helpers/root.ts create mode 100644 packages/cli/test/setup.ts create mode 100644 packages/cli/test/tsconfig.json create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/cli/tsconfig.tsbuildinfo create mode 100644 packages/cli/vitest.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.github/workflows/onPushToMain.yml b/.github/workflows/onPushToMain.yml new file mode 100644 index 0000000..3ac9348 --- /dev/null +++ b/.github/workflows/onPushToMain.yml @@ -0,0 +1,62 @@ +name: release on push to main + +on: + push: + branches: [main] + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - name: Check if CLI version already exists + id: version-check + run: | + package_version=$(node -p "require('./packages/cli/package.json').version") + exists=$(gh api repos/${{ github.repository }}/releases/tags/v$package_version >/dev/null 2>&1 && echo "true" || echo "") + + if [ -n "$exists" ]; + then + echo "Version v$package_version already exists" + echo "::warning file=packages/cli/package.json,line=1::Version v$package_version already exists - no release will be created." + echo "skipped=true" >> $GITHUB_OUTPUT + else + echo "Version v$package_version does not exist. Creating release..." + echo "skipped=false" >> $GITHUB_OUTPUT + echo "tag=v$package_version" >> $GITHUB_OUTPUT + fi + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Setup git + if: ${{ steps.version-check.outputs.skipped == 'false' }} + run: | + git config --global user.email ${{ secrets.GH_EMAIL }} + git config --global user.name ${{ secrets.GH_USERNAME }} + - name: Generate OCLIF README (packages/cli) + if: ${{ steps.version-check.outputs.skipped == 'false' }} + run: | + pnpm run build + cd packages/cli && pnpm exec oclif readme + cd ../.. + if [ -n "$(git status --porcelain)" ]; then + git add . + git commit -am "chore: update README.md" + git push -u origin ${{ github.ref_name }} + fi + - name: Create GitHub Release + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 + if: ${{ steps.version-check.outputs.skipped == 'false' }} + with: + name: ${{ steps.version-check.outputs.tag }} + tag: ${{ steps.version-check.outputs.tag }} + commit: ${{ github.ref_name }} + token: ${{ secrets.GH_TOKEN }} + skipIfReleaseExists: true diff --git a/.github/workflows/onRelease.yml b/.github/workflows/onRelease.yml new file mode 100644 index 0000000..f273e3c --- /dev/null +++ b/.github/workflows/onRelease.yml @@ -0,0 +1,24 @@ +name: publish on release + +on: + release: + types: [released] + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run build + - name: Publish @powersync/cli to npm + run: pnpm publish --filter @powersync/cli --no-git-checks --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..4fc7f99 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: tests + +on: + push: + branches-ignore: [main] + +jobs: + unit-tests: + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + node_version: [24] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - name: Check formatting + run: pnpm exec prettier --check . + - run: pnpm run build + - run: pnpm run test diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..85bab2c --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "jsxBracketSameLine": true, + "useTabs": false, + "printWidth": 120, + "trailingComma": "none" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..f755f33 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# PowerSync CLI + +Monorepo for the PowerSync CLI and related tooling. Built with [pnpm](https://pnpm.io) workspaces and [OCLIF](https://oclif.io). + +## Requirements + +- **Node**: LTS v24+ (see [.nvmrc](./.nvmrc); use `nvm use` to switch) +- **Package manager**: pnpm + +## Packages + +| Package | Description | +| ------------------------------------ | -------------------------------------------------------------- | +| [**@powersync/cli**](./packages/cli) | PowerSync CLI — manage instances, config, sync rules, and more | + +## Getting started + +```bash +nvm use # use Node from .nvmrc (optional) +pnpm install +pnpm build +``` + +Run the CLI from the repo root: + +```bash +pnpm powersync -- --help +pnpm exec powersync --help # if @powersync/cli is a workspace dependency +``` + +## Links + +- [CLI package README](./packages/cli/README.md) — install, usage, and command reference diff --git a/package.json b/package.json new file mode 100644 index 0000000..e679c83 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "powersync-workspace", + "private": true, + "description": "PowerSync CLI monorepo", + "devDependencies": { + "@powersync/cli": "workspace:*", + "prettier": "^3.0.0" + }, + "scripts": { + "build": "pnpm -r run build", + "dev": "pnpm --filter @powersync/cli exec -- pnpm run dev", + "test": "pnpm -r run test" + }, + "engines": { + "node": ">=24" + }, + "packageManager": "pnpm@10.0.0" +} diff --git a/packages/cli/.gitignore b/packages/cli/.gitignore new file mode 100644 index 0000000..aa9b0e5 --- /dev/null +++ b/packages/cli/.gitignore @@ -0,0 +1,5 @@ +/dist +/tmp +oclif.manifest.json + + diff --git a/packages/cli/.prettierrc.json b/packages/cli/.prettierrc.json new file mode 100644 index 0000000..eedee1a --- /dev/null +++ b/packages/cli/.prettierrc.json @@ -0,0 +1 @@ +"../../.prettierrc.json" diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 0000000..6700b48 --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,612 @@ +# @powersync/cli + +CLI for PowerSync + +[![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io) +[![Version](https://img.shields.io/npm/v/@powersync/cli.svg)](https://npmjs.org/package/@powersync/cli) +[![Downloads/week](https://img.shields.io/npm/dw/@powersync/cli.svg)](https://npmjs.org/package/@powersync/cli) + + +* [@powersync/cli](#powersynccli) +* [Usage](#usage) +* [Commands](#commands) + + +# Usage + + +```sh-session +$ npm install -g @powersync/cli +$ powersync COMMAND +running command... +$ powersync (--version) +@powersync/cli/0.0.0 darwin-arm64 node-v22.22.0 +$ powersync --help [COMMAND] +USAGE + $ powersync COMMAND +... +``` + + +# Commands + + +* [`powersync deploy`](#powersync-deploy) +* [`powersync destroy`](#powersync-destroy) +* [`powersync fetch`](#powersync-fetch) +* [`powersync fetch config`](#powersync-fetch-config) +* [`powersync fetch instances`](#powersync-fetch-instances) +* [`powersync fetch status`](#powersync-fetch-status) +* [`powersync generate`](#powersync-generate) +* [`powersync generate schema`](#powersync-generate-schema) +* [`powersync generate token`](#powersync-generate-token) +* [`powersync help [COMMAND]`](#powersync-help-command) +* [`powersync init`](#powersync-init) +* [`powersync link`](#powersync-link) +* [`powersync login`](#powersync-login) +* [`powersync migrate`](#powersync-migrate) +* [`powersync plugins`](#powersync-plugins) +* [`powersync plugins add PLUGIN`](#powersync-plugins-add-plugin) +* [`powersync plugins:inspect PLUGIN...`](#powersync-pluginsinspect-plugin) +* [`powersync plugins install PLUGIN`](#powersync-plugins-install-plugin) +* [`powersync plugins link PATH`](#powersync-plugins-link-path) +* [`powersync plugins remove [PLUGIN]`](#powersync-plugins-remove-plugin) +* [`powersync plugins reset`](#powersync-plugins-reset) +* [`powersync plugins uninstall [PLUGIN]`](#powersync-plugins-uninstall-plugin) +* [`powersync plugins unlink [PLUGIN]`](#powersync-plugins-unlink-plugin) +* [`powersync plugins update`](#powersync-plugins-update) +* [`powersync stop`](#powersync-stop) +* [`powersync validate`](#powersync-validate) + +## `powersync deploy` + +Deploy sync rules and configuration changes. + +``` +USAGE + $ powersync deploy + +DESCRIPTION + Deploy sync rules and configuration changes. + + Deploys changes to the PowerSync management service. Cloud only. +``` + +_See code: [src/commands/deploy.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/deploy.ts)_ + +## `powersync destroy` + +Destroy a PowerSync instance. + +``` +USAGE + $ powersync destroy + +DESCRIPTION + Destroy a PowerSync instance. + + Destroys the linked PowerSync Cloud instance. Cloud only. +``` + +_See code: [src/commands/destroy.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/destroy.ts)_ + +## `powersync fetch` + +Fetch data from PowerSync (instances, config, status). + +``` +USAGE + $ powersync fetch + +DESCRIPTION + Fetch data from PowerSync (instances, config, status). + + Commands to list instances, pull config, or get diagnostics status. +``` + +_See code: [src/commands/fetch/index.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/fetch/index.ts)_ + +## `powersync fetch config` + +Update local configuration with cloud state. + +``` +USAGE + $ powersync fetch config + +DESCRIPTION + Update local configuration with cloud state. + + Pulls the current instance config from PowerSync Cloud and writes to local powersync folder. Cloud only. +``` + +_See code: [src/commands/fetch/config.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/fetch/config.ts)_ + +## `powersync fetch instances` + +List PowerSync Cloud instances. + +``` +USAGE + $ powersync fetch instances + +DESCRIPTION + List PowerSync Cloud instances. + + Lists instances in the current org/project. Cloud only. +``` + +_See code: [src/commands/fetch/instances.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/fetch/instances.ts)_ + +## `powersync fetch status` + +Fetch diagnostics status for an instance. + +``` +USAGE + $ powersync fetch status + +DESCRIPTION + Fetch diagnostics status for an instance. + + Fetches diagnostics (connections, sync rules state, etc.). Routes to Management service (Cloud) or linked instance + (self-hosted). +``` + +_See code: [src/commands/fetch/status.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/fetch/status.ts)_ + +## `powersync generate` + +Generate artifacts (schema, token). + +``` +USAGE + $ powersync generate + +DESCRIPTION + Generate artifacts (schema, token). + + Commands to generate client-side schema or development tokens. +``` + +_See code: [src/commands/generate/index.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/generate/index.ts)_ + +## `powersync generate schema` + +Create client-side schemas. + +``` +USAGE + $ powersync generate schema + +DESCRIPTION + Create client-side schemas. + + Generates client-side schema from instance schema and sync rules. Supported for Cloud and self-hosted. +``` + +_See code: [src/commands/generate/schema.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/generate/schema.ts)_ + +## `powersync generate token` + +Create a client token for the PowerSync service. + +``` +USAGE + $ powersync generate token + +DESCRIPTION + Create a client token for the PowerSync service. + + Generates a development token for connecting clients. Cloud and self-hosted (when shared secret is in config). +``` + +_See code: [src/commands/generate/token.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/generate/token.ts)_ + +## `powersync help [COMMAND]` + +Display help for powersync. + +``` +USAGE + $ powersync help [COMMAND...] [-n] + +ARGUMENTS + [COMMAND...] Command to show help for. + +FLAGS + -n, --nested-commands Include all nested commands in the output. + +DESCRIPTION + Display help for powersync. +``` + +_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.37/src/commands/help.ts)_ + +## `powersync init` + +Create a new PowerSync project. + +``` +USAGE + $ powersync init + +DESCRIPTION + Create a new PowerSync project. + + Creates a PowerSync project (e.g. powersync folder with service.yaml and sync-streams.yaml). Supports --type=cloud or + self-hosted. +``` + +_See code: [src/commands/init.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/init.ts)_ + +## `powersync link` + +Link configuration to a PowerSync instance. + +``` +USAGE + $ powersync link + +DESCRIPTION + Link configuration to a PowerSync instance. + + Associates a cloud instance (or self-hosted) with this directory's config. Optional instance ID, org_id, app_id. +``` + +_See code: [src/commands/link.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/link.ts)_ + +## `powersync login` + +Authenticate the CLI with PowerSync (e.g. PAT token). + +``` +USAGE + $ powersync login + +DESCRIPTION + Authenticate the CLI with PowerSync (e.g. PAT token). + + Authenticate the CLI with PowerSync (e.g. PAT token). +``` + +_See code: [src/commands/login.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/login.ts)_ + +## `powersync migrate` + +Migrate a self-hosted config to a cloud config. + +``` +USAGE + $ powersync migrate + +DESCRIPTION + Migrate a self-hosted config to a cloud config. + + Migrates a self-hosted instance configuration to PowerSync Cloud format. Self-hosted only. +``` + +_See code: [src/commands/migrate.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/migrate.ts)_ + +## `powersync plugins` + +List installed plugins. + +``` +USAGE + $ powersync plugins [--json] [--core] + +FLAGS + --core Show core plugins. + +GLOBAL FLAGS + --json Format output as json. + +DESCRIPTION + List installed plugins. + +EXAMPLES + $ powersync plugins +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/index.ts)_ + +## `powersync plugins add PLUGIN` + +Installs a plugin into powersync. + +``` +USAGE + $ powersync plugins add PLUGIN... [--json] [-f] [-h] [-s | -v] + +ARGUMENTS + PLUGIN... Plugin to install. + +FLAGS + -f, --force Force npm to fetch remote resources even if a local copy exists on disk. + -h, --help Show CLI help. + -s, --silent Silences npm output. + -v, --verbose Show verbose npm output. + +GLOBAL FLAGS + --json Format output as json. + +DESCRIPTION + Installs a plugin into powersync. + + Uses npm to install plugins. + + Installation of a user-installed plugin will override a core plugin. + + Use the POWERSYNC_NPM_LOG_LEVEL environment variable to set the npm loglevel. + Use the POWERSYNC_NPM_REGISTRY environment variable to set the npm registry. + +ALIASES + $ powersync plugins add + +EXAMPLES + Install a plugin from npm registry. + + $ powersync plugins add myplugin + + Install a plugin from a github url. + + $ powersync plugins add https://github.com/someuser/someplugin + + Install a plugin from a github slug. + + $ powersync plugins add someuser/someplugin +``` + +## `powersync plugins:inspect PLUGIN...` + +Displays installation properties of a plugin. + +``` +USAGE + $ powersync plugins inspect PLUGIN... + +ARGUMENTS + PLUGIN... [default: .] Plugin to inspect. + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +GLOBAL FLAGS + --json Format output as json. + +DESCRIPTION + Displays installation properties of a plugin. + +EXAMPLES + $ powersync plugins inspect myplugin +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/inspect.ts)_ + +## `powersync plugins install PLUGIN` + +Installs a plugin into powersync. + +``` +USAGE + $ powersync plugins install PLUGIN... [--json] [-f] [-h] [-s | -v] + +ARGUMENTS + PLUGIN... Plugin to install. + +FLAGS + -f, --force Force npm to fetch remote resources even if a local copy exists on disk. + -h, --help Show CLI help. + -s, --silent Silences npm output. + -v, --verbose Show verbose npm output. + +GLOBAL FLAGS + --json Format output as json. + +DESCRIPTION + Installs a plugin into powersync. + + Uses npm to install plugins. + + Installation of a user-installed plugin will override a core plugin. + + Use the POWERSYNC_NPM_LOG_LEVEL environment variable to set the npm loglevel. + Use the POWERSYNC_NPM_REGISTRY environment variable to set the npm registry. + +ALIASES + $ powersync plugins add + +EXAMPLES + Install a plugin from npm registry. + + $ powersync plugins install myplugin + + Install a plugin from a github url. + + $ powersync plugins install https://github.com/someuser/someplugin + + Install a plugin from a github slug. + + $ powersync plugins install someuser/someplugin +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/install.ts)_ + +## `powersync plugins link PATH` + +Links a plugin into the CLI for development. + +``` +USAGE + $ powersync plugins link PATH [-h] [--install] [-v] + +ARGUMENTS + PATH [default: .] path to plugin + +FLAGS + -h, --help Show CLI help. + -v, --verbose + --[no-]install Install dependencies after linking the plugin. + +DESCRIPTION + Links a plugin into the CLI for development. + + Installation of a linked plugin will override a user-installed or core plugin. + + e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello' + command will override the user-installed or core plugin implementation. This is useful for development work. + + +EXAMPLES + $ powersync plugins link myplugin +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/link.ts)_ + +## `powersync plugins remove [PLUGIN]` + +Removes a plugin from the CLI. + +``` +USAGE + $ powersync plugins remove [PLUGIN...] [-h] [-v] + +ARGUMENTS + [PLUGIN...] plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ powersync plugins unlink + $ powersync plugins remove + +EXAMPLES + $ powersync plugins remove myplugin +``` + +## `powersync plugins reset` + +Remove all user-installed and linked plugins. + +``` +USAGE + $ powersync plugins reset [--hard] [--reinstall] + +FLAGS + --hard Delete node_modules and package manager related files in addition to uninstalling plugins. + --reinstall Reinstall all plugins after uninstalling. +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/reset.ts)_ + +## `powersync plugins uninstall [PLUGIN]` + +Removes a plugin from the CLI. + +``` +USAGE + $ powersync plugins uninstall [PLUGIN...] [-h] [-v] + +ARGUMENTS + [PLUGIN...] plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ powersync plugins unlink + $ powersync plugins remove + +EXAMPLES + $ powersync plugins uninstall myplugin +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/uninstall.ts)_ + +## `powersync plugins unlink [PLUGIN]` + +Removes a plugin from the CLI. + +``` +USAGE + $ powersync plugins unlink [PLUGIN...] [-h] [-v] + +ARGUMENTS + [PLUGIN...] plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ powersync plugins unlink + $ powersync plugins remove + +EXAMPLES + $ powersync plugins unlink myplugin +``` + +## `powersync plugins update` + +Update installed plugins. + +``` +USAGE + $ powersync plugins update [-h] [-v] + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Update installed plugins. +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.55/src/commands/plugins/update.ts)_ + +## `powersync stop` + +Stop a PowerSync instance. + +``` +USAGE + $ powersync stop + +DESCRIPTION + Stop a PowerSync instance. + + Stops the linked PowerSync Cloud instance. Cloud only. +``` + +_See code: [src/commands/stop.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/stop.ts)_ + +## `powersync validate` + +Validate configuration (sync rules, connection, etc.). + +``` +USAGE + $ powersync validate + +DESCRIPTION + Validate configuration (sync rules, connection, etc.). + + Validates configuration. Supported for both Cloud and self-hosted. +``` + +_See code: [src/commands/validate.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/validate.ts)_ + diff --git a/packages/cli/bin/dev.cmd b/packages/cli/bin/dev.cmd new file mode 100644 index 0000000..cec553b --- /dev/null +++ b/packages/cli/bin/dev.cmd @@ -0,0 +1,3 @@ +@echo off + +node --loader ts-node/esm --no-warnings=ExperimentalWarning "%~dp0\dev" %* diff --git a/packages/cli/bin/dev.js b/packages/cli/bin/dev.js new file mode 100755 index 0000000..a937e0c --- /dev/null +++ b/packages/cli/bin/dev.js @@ -0,0 +1,5 @@ +#!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning + +import {execute} from '@oclif/core' + +await execute({development: true, dir: import.meta.url}) diff --git a/packages/cli/bin/run.cmd b/packages/cli/bin/run.cmd new file mode 100644 index 0000000..968fc30 --- /dev/null +++ b/packages/cli/bin/run.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\run" %* diff --git a/packages/cli/bin/run.js b/packages/cli/bin/run.js new file mode 100755 index 0000000..dd50271 --- /dev/null +++ b/packages/cli/bin/run.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import {execute} from '@oclif/core' + +await execute({dir: import.meta.url}) diff --git a/packages/cli/eslint.config.mjs b/packages/cli/eslint.config.mjs new file mode 100644 index 0000000..da9dabf --- /dev/null +++ b/packages/cli/eslint.config.mjs @@ -0,0 +1,10 @@ +import { includeIgnoreFile } from '@eslint/compat'; +import oclif from 'eslint-config-oclif'; +import prettier from 'eslint-config-prettier'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const gitignorePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '.gitignore'); +const rootGitignorePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../.gitignore'); + +export default [includeIgnoreFile(gitignorePath), includeIgnoreFile(rootGitignorePath), ...oclif, prettier]; diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..19159ae --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,70 @@ +{ + "name": "@powersync/cli", + "description": "A CLI for managing PowerSync instances", + "version": "0.0.0", + "author": "POWERSYNC", + "bin": { + "powersync": "./bin/run.js" + }, + "bugs": "https://github.com/powersync-ja/cli/issues", + "dependencies": { + "@oclif/core": "^4", + "@oclif/plugin-help": "^6", + "@oclif/plugin-plugins": "^5" + }, + "devDependencies": { + "@eslint/compat": "^1", + "@oclif/prettier-config": "^0.2.1", + "@oclif/test": "^4", + "@types/node": "^22", + "eslint": "^9", + "eslint-config-oclif": "^6", + "eslint-config-prettier": "^10", + "vitest": "^4.0.0", + "oclif": "^4", + "shx": "^0.3.3", + "ts-node": "^10", + "typescript": "^5" + }, + "engines": { + "node": ">=18.0.0" + }, + "files": [ + "./bin", + "./dist", + "./oclif.manifest.json" + ], + "homepage": "https://github.com/powersync-ja/cli", + "keywords": [ + "oclif" + ], + "license": "Apache-2.0", + "main": "dist/index.js", + "type": "module", + "oclif": { + "bin": "powersync", + "dirname": "powersync", + "commands": "./dist/commands", + "plugins": [ + "@oclif/plugin-help", + "@oclif/plugin-plugins" + ], + "topicSeparator": " ", + "topics": { + "hello": { + "description": "Say hello to the world and others" + } + } + }, + "repository": "https://github.com/powersync-ja/powersync-js", + "scripts": { + "build": "shx rm -rf dist && tsc -b", + "lint": "eslint", + "postpack": "shx rm -f oclif.manifest.json", + "posttest": "pnpm run lint", + "prepack": "oclif manifest && oclif readme", + "test": "vitest", + "version": "oclif readme && git add README.md" + }, + "types": "dist/index.d.ts" +} diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts new file mode 100644 index 0000000..04aeab1 --- /dev/null +++ b/packages/cli/src/commands/deploy.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Deploy extends Command { + static description = 'Deploys changes to the PowerSync management service. Cloud only.' + static summary = 'Deploy sync rules and configuration changes.' + + async run(): Promise { + this.log('deploy: not yet implemented') + } +} diff --git a/packages/cli/src/commands/destroy.ts b/packages/cli/src/commands/destroy.ts new file mode 100644 index 0000000..c626d39 --- /dev/null +++ b/packages/cli/src/commands/destroy.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Destroy extends Command { + static description = 'Destroys the linked PowerSync Cloud instance. Cloud only.' + static summary = 'Destroy a PowerSync instance.' + + async run(): Promise { + this.log('destroy: not yet implemented') + } +} diff --git a/packages/cli/src/commands/fetch/config.ts b/packages/cli/src/commands/fetch/config.ts new file mode 100644 index 0000000..c108851 --- /dev/null +++ b/packages/cli/src/commands/fetch/config.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class FetchConfig extends Command { + static description = + 'Pulls the current instance config from PowerSync Cloud and writes to local powersync folder. Cloud only.' + static summary = 'Update local configuration with cloud state.' + + async run(): Promise { + this.log('fetch config: not yet implemented') + } +} diff --git a/packages/cli/src/commands/fetch/index.ts b/packages/cli/src/commands/fetch/index.ts new file mode 100644 index 0000000..722ea0d --- /dev/null +++ b/packages/cli/src/commands/fetch/index.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class Fetch extends Command { + static description = 'Commands to list instances, pull config, or get diagnostics status.' + static summary = 'Fetch data from PowerSync (instances, config, status).' + + async run(): Promise { + await this.parse(Fetch) + this.log('Use a subcommand: fetch instances | fetch config | fetch status') + } +} diff --git a/packages/cli/src/commands/fetch/instances.ts b/packages/cli/src/commands/fetch/instances.ts new file mode 100644 index 0000000..710ba7f --- /dev/null +++ b/packages/cli/src/commands/fetch/instances.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class FetchInstances extends Command { + static description = 'Lists instances in the current org/project. Cloud only.' + static summary = 'List PowerSync Cloud instances.' + + async run(): Promise { + this.log('fetch instances: not yet implemented') + } +} diff --git a/packages/cli/src/commands/fetch/status.ts b/packages/cli/src/commands/fetch/status.ts new file mode 100644 index 0000000..63348d3 --- /dev/null +++ b/packages/cli/src/commands/fetch/status.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class FetchStatus extends Command { + static description = + 'Fetches diagnostics (connections, sync rules state, etc.). Routes to Management service (Cloud) or linked instance (self-hosted).' + static summary = 'Fetch diagnostics status for an instance.' + + async run(): Promise { + this.log('fetch status: not yet implemented') + } +} diff --git a/packages/cli/src/commands/generate/index.ts b/packages/cli/src/commands/generate/index.ts new file mode 100644 index 0000000..98dafae --- /dev/null +++ b/packages/cli/src/commands/generate/index.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class Generate extends Command { + static description = 'Commands to generate client-side schema or development tokens.' + static summary = 'Generate artifacts (schema, token).' + + async run(): Promise { + await this.parse(Generate) + this.log('Use a subcommand: generate schema | generate token') + } +} diff --git a/packages/cli/src/commands/generate/schema.ts b/packages/cli/src/commands/generate/schema.ts new file mode 100644 index 0000000..165ed6a --- /dev/null +++ b/packages/cli/src/commands/generate/schema.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class GenerateSchema extends Command { + static description = + 'Generates client-side schema from instance schema and sync rules. Supported for Cloud and self-hosted.' + static summary = 'Create client-side schemas.' + + async run(): Promise { + this.log('generate schema: not yet implemented') + } +} diff --git a/packages/cli/src/commands/generate/token.ts b/packages/cli/src/commands/generate/token.ts new file mode 100644 index 0000000..61297bd --- /dev/null +++ b/packages/cli/src/commands/generate/token.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class GenerateToken extends Command { + static description = + 'Generates a development token for connecting clients. Cloud and self-hosted (when shared secret is in config).' + static summary = 'Create a client token for the PowerSync service.' + + async run(): Promise { + this.log('generate token: not yet implemented') + } +} diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts new file mode 100644 index 0000000..25ae25a --- /dev/null +++ b/packages/cli/src/commands/init.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class Init extends Command { + static description = + 'Creates a PowerSync project (e.g. powersync folder with service.yaml and sync-streams.yaml). Supports --type=cloud or self-hosted.' + static summary = 'Create a new PowerSync project.' + + async run(): Promise { + this.log('init: not yet implemented') + } +} diff --git a/packages/cli/src/commands/link.ts b/packages/cli/src/commands/link.ts new file mode 100644 index 0000000..9f0974e --- /dev/null +++ b/packages/cli/src/commands/link.ts @@ -0,0 +1,11 @@ +import {Command} from '@oclif/core' + +export default class Link extends Command { + static description = + "Associates a cloud instance (or self-hosted) with this directory's config. Optional instance ID, org_id, app_id." + static summary = 'Link configuration to a PowerSync instance.' + + async run(): Promise { + this.log('link: not yet implemented') + } +} diff --git a/packages/cli/src/commands/login.ts b/packages/cli/src/commands/login.ts new file mode 100644 index 0000000..4ed6329 --- /dev/null +++ b/packages/cli/src/commands/login.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Login extends Command { + static description = 'Authenticate the CLI with PowerSync (e.g. PAT token).' + static summary = 'Authenticate the CLI with PowerSync (e.g. PAT token).' + + async run(): Promise { + this.log('login: not yet implemented') + } +} diff --git a/packages/cli/src/commands/migrate.ts b/packages/cli/src/commands/migrate.ts new file mode 100644 index 0000000..9ca08d7 --- /dev/null +++ b/packages/cli/src/commands/migrate.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Migrate extends Command { + static description = 'Migrates a self-hosted instance configuration to PowerSync Cloud format. Self-hosted only.' + static summary = 'Migrate a self-hosted config to a cloud config.' + + async run(): Promise { + this.log('migrate: not yet implemented') + } +} diff --git a/packages/cli/src/commands/stop.ts b/packages/cli/src/commands/stop.ts new file mode 100644 index 0000000..cbb08b5 --- /dev/null +++ b/packages/cli/src/commands/stop.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Stop extends Command { + static description = 'Stops the linked PowerSync Cloud instance. Cloud only.' + static summary = 'Stop a PowerSync instance.' + + async run(): Promise { + this.log('stop: not yet implemented') + } +} diff --git a/packages/cli/src/commands/validate.ts b/packages/cli/src/commands/validate.ts new file mode 100644 index 0000000..c176f72 --- /dev/null +++ b/packages/cli/src/commands/validate.ts @@ -0,0 +1,10 @@ +import {Command} from '@oclif/core' + +export default class Validate extends Command { + static description = 'Validates configuration. Supported for both Cloud and self-hosted.' + static summary = 'Validate configuration (sync rules, connection, etc.).' + + async run(): Promise { + this.log('validate: not yet implemented') + } +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000..e32b0b2 --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1 @@ +export {run} from '@oclif/core' diff --git a/packages/cli/test/commands/init.test.ts b/packages/cli/test/commands/init.test.ts new file mode 100644 index 0000000..5ceae81 --- /dev/null +++ b/packages/cli/test/commands/init.test.ts @@ -0,0 +1,10 @@ +import { runCommand } from '@oclif/test' +import { describe, expect, it } from 'vitest' +import { root } from '../helpers/root.js' + +describe('init', () => { + it('runs init cmd', async () => { + const { stdout } = await runCommand('init', { root }) + expect(stdout).toContain('init: not yet implemented') + }) +}) diff --git a/packages/cli/test/commands/login.test.ts b/packages/cli/test/commands/login.test.ts new file mode 100644 index 0000000..d17a331 --- /dev/null +++ b/packages/cli/test/commands/login.test.ts @@ -0,0 +1,10 @@ +import { runCommand } from '@oclif/test' +import { describe, expect, it } from 'vitest' +import { root } from '../helpers/root.js' + +describe('login', () => { + it('runs login cmd', async () => { + const { stdout } = await runCommand('login', { root }) + expect(stdout).toContain('login: not yet implemented') + }) +}) diff --git a/packages/cli/test/helpers/root.ts b/packages/cli/test/helpers/root.ts new file mode 100644 index 0000000..4586f31 --- /dev/null +++ b/packages/cli/test/helpers/root.ts @@ -0,0 +1,7 @@ +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +/** Package root (packages/cli) so runCommand loads Config from the correct place. */ +export const root = resolve(__dirname, '../..') diff --git a/packages/cli/test/setup.ts b/packages/cli/test/setup.ts new file mode 100644 index 0000000..5fe2018 --- /dev/null +++ b/packages/cli/test/setup.ts @@ -0,0 +1,8 @@ +import { Config } from '@oclif/core' +import { root } from './helpers/root.js' + +/** + * Load Config from package root so runCommand uses the correct root. + * Fails fast if config cannot be loaded. + */ +await Config.load({ root }) diff --git a/packages/cli/test/tsconfig.json b/packages/cli/test/tsconfig.json new file mode 100644 index 0000000..95898fc --- /dev/null +++ b/packages/cli/test/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig", + "compilerOptions": { + "noEmit": true + }, + "references": [ + {"path": ".."} + ] +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..198ecdc --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "declaration": true, + "module": "Node16", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "target": "es2022", + "moduleResolution": "node16", + "composite": true + }, + "include": ["./src/**/*"], + "ts-node": { + "esm": true + } +} diff --git a/packages/cli/tsconfig.tsbuildinfo b/packages/cli/tsconfig.tsbuildinfo new file mode 100644 index 0000000..fe4152f --- /dev/null +++ b/packages/cli/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/alphabet.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/pjson.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/topic.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/hooks.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/s3-manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/ts-config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/ts-path.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/error.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/cli.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/module-load.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/handle.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/warn.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/parser.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/execute.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flush.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/formatter.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/util.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/main.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/module-loader.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/validate.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/performance.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/settings.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/util/ids.d.ts","../../node_modules/.pnpm/cli-spinners@2.9.2/node_modules/cli-spinners/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/types.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/base.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/simple.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/spinner.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/colorize-json.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/write.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/index.d.ts","./src/index.ts","./src/commands/deploy.ts","./src/commands/destroy.ts","./src/commands/init.ts","./src/commands/link.ts","./src/commands/login.ts","./src/commands/migrate.ts","./src/commands/stop.ts","./src/commands/validate.ts","./src/commands/fetch/config.ts","./src/commands/fetch/index.ts","./src/commands/fetch/instances.ts","./src/commands/fetch/status.ts","./src/commands/generate/index.ts","./src/commands/generate/schema.ts","./src/commands/generate/token.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[94,143,184,224],[71,73,74,83,92,94,143,184],[68,71,73,79,93,143,184],[80,81,82,143,184],[69,70,71,76,93,143,184],[79,143,184],[74,143,184],[79,85,143,184],[143,184],[79,85,89,143,184],[79,84,85,86,87,88,90,91,143,184],[79,143,184,224],[79,93,99,143,184],[79,93,143,184],[79,93,99,100,101,143,184],[72,79,83,90,92,93,95,96,97,98,102,103,104,105,108,109,110,111,120,143,184],[94,143,184],[68,69,70,71,72,93,143,184],[71,73,93,94,143,184],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,94,143,184],[93,143,184],[64,93,143,184],[67,68,143,184],[66,69,70,93,143,184],[66,73,143,184],[92,94,143,184],[94,106,107,143,184],[73,143,184],[113,143,184],[114,143,184],[113,114,143,184],[112,143,184],[84,88,91,115,116,117,118,119,143,184],[68,143,184],[143,181,184],[143,183,184],[184],[143,184,189,216],[143,184,185,195,203,213,224],[143,184,185,186,195,203],[138,139,140,143,184],[143,184,187,225],[143,184,188,189,196,204],[143,184,189,213,221],[143,184,190,192,195,203],[143,183,184,191],[143,184,192,193],[143,184,194,195],[143,183,184,195],[143,184,195,196,197,213,224],[143,184,195,196,197,210,213,216],[143,184,192,195,198,203,213,224],[143,184,195,196,198,199,203,213,221,224],[143,184,198,200,213,221,224],[141,142,143,144,145,146,147,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230],[143,184,195,201],[143,184,202,224,229],[143,184,192,195,203,213],[143,184,204],[143,184,205],[143,183,184,206],[143,184,207,223,229],[143,184,208],[143,184,209],[143,184,195,210,211],[143,184,210,212,225,227],[143,184,195,213,214,216],[143,184,215,216],[143,184,213,214],[143,184,216],[143,184,217],[143,184,213,218],[143,184,195,219,220],[143,184,219,220],[143,184,189,203,213,221],[143,184,222],[143,184,203,223],[143,184,198,209,224],[143,184,189,225],[143,184,213,226],[143,184,202,227],[143,184,228],[143,179,184],[143,179,184,195,197,206,213,216,224,227,229],[143,184,213,230],[143,156,160,184,224],[143,156,184,213,224],[143,151,184],[143,153,156,184,221,224],[143,184,203,221],[143,184,231],[143,151,184,231],[143,153,156,184,203,224],[143,148,149,152,155,184,195,213,224],[143,148,154,184],[143,152,156,184,216,224,231],[143,172,184,231],[143,150,151,184,231],[143,156,184],[143,150,151,152,153,154,155,156,157,158,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,184],[143,156,163,164,184],[143,154,156,164,165,184],[143,155,184],[143,148,151,156,184],[143,156,160,164,165,184],[143,160,184],[143,154,156,159,184,224],[143,148,153,154,156,160,163,184],[143,184,213],[143,151,156,172,184,229,231],[121,143,184],[143,184,196,231]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"032e362f68a69c4f6af9678b4f5fdcf5b6c348e6aa279a7b2c89099bb7887a0a","impliedFormat":1},{"version":"99fd2587995ea6001ac20d6ecebe748e163d62e820f369452919c265f140b3c9","impliedFormat":1},{"version":"0b730f11a4d506c4cefe2c4b0d407a789ecbe9992972e3cef3a16dc7752a9041","impliedFormat":1},{"version":"e1d8a12b5bdcc2111555f44f2af6131b509256fb4b0275b5d500ddc6b5f15057","impliedFormat":1},{"version":"e2f5f8a675634ad58a5c0b6dae43445a136207cf1c25be81b72c6cc9511a74d3","impliedFormat":1},{"version":"935f95054bf1cf971a72a4e0049586eaaa1030677fb9eedc199eb3da4ba8de0c","impliedFormat":1},{"version":"749a06b2b17de875b677443af38813af4ad08ce36fabc42dd1239e9814ccfb7a","impliedFormat":1},{"version":"948e7ab0a0498621ffff968d08f99a856ccfe650a40c88e77434d6fda848a867","impliedFormat":1},{"version":"76ba4acb99015f0af9f9015b097e65ede39c9b236415fbb5c497abf3f16cc4ff","impliedFormat":1},{"version":"97f38e731416236723389b761be37fe9fd1982c3daa8ddcb1cd4ad640460ff34","impliedFormat":1},{"version":"72aae4ad580cc65be46b00b5f036eadd5f28b9a6a33b5371b0316b1a00be72dd","impliedFormat":1},{"version":"e80cff0c41a5a798496621a10b173f9bd8934d309a74dae7f2c36841be07ed6d","impliedFormat":1},{"version":"b8858f8750c32bc24aa90df80af95b1aca764a2728e395b8b2aefeffbb0d4324","impliedFormat":1},{"version":"51b85172183e3bf32ae04b95da932713fed0eb1e9b0ac14658b27315d3cca7de","impliedFormat":1},{"version":"1d9706c7bf2cc171e52f67cc048e229622b59efe1922c82541bc61ea2cf8537e","impliedFormat":1},{"version":"938c160678c0c4bf4b1e28394f51ca546029c5f10928147fe7cd7203c2a2ceb4","impliedFormat":1},{"version":"24546d4a958a3262affbc00e6712d9595f72af75205eb1eaf4fa995fa036df71","impliedFormat":1},{"version":"f44bd3fa97e83bc62e5651a5d82b88bc875be385c4f7db698be4970827eb0134","impliedFormat":1},{"version":"1dfbc80539faad1965995a79f12c8d38119f7a1c49c831aea1c18540bb206ac6","impliedFormat":1},{"version":"3db5b76431251162950a870670c33d22d7e7fcb02f0f5818d96f16d941335a20","impliedFormat":1},{"version":"68772eaccdf08b5e44504747a91c311e2cd3b0b1b263035890a571439e144d4e","impliedFormat":1},{"version":"335f00f0ca1ec75c81e41503907753b4ea2f50f9ace17595afa7e583a5951489","impliedFormat":1},{"version":"eefb5931fa32da9b384a318c9c98314841326040cd8a5a9f4ef0acbd3ec3b924","impliedFormat":1},{"version":"1c7760d4af43ced46bce744555d7014ee47f3381b57cacc933ded7f0a8701aac","impliedFormat":1},{"version":"37ff6180311269649d3d76d4b222be7523d5476ffc34a99d6d401d4bbb7534d5","impliedFormat":1},{"version":"c3d08e2d4c972ebe21ca5d40e33feed01044769d358eaa13cf89b692134c4d32","impliedFormat":1},{"version":"4677854ad855b1a373d287e0f892dde2e5d60bee80fe67f05add92c630ed0bc0","impliedFormat":1},{"version":"d9f75829a0984c08c1633d04a954c7c4b5adb7e16c13b6cf207fbd9100838ca9","impliedFormat":1},{"version":"35413e3168706b2a4bed7538b355bc4ec3d5eff10f25b588485b30a22c56db1c","impliedFormat":1},{"version":"ae1d64e4ad308ad8a7010a5f7c67fd1466dcc5e0f6cb876a8e450716ae0c5c2e","impliedFormat":1},{"version":"dc38bb715e32aa87e3f74feacd63e6c9b364e0acbae8eaf1a0503037ba5d5553","impliedFormat":1},{"version":"efa0400a30b6a995b39f59d4e517d2bd624970b21153aadb611cf3f113e98295","impliedFormat":1},{"version":"d7e355137d4a8db67553be5b52bf98cf1ffdac39bb8668ecf19756981cc6876b","impliedFormat":1},{"version":"569f27bc2a2f9a416bd3ccebe8b6852e306f11a5c69d8fb4ac00a68a28a414d6","impliedFormat":1},{"version":"b6ef0db675b5145700813a721047bfcefe3927147daa0fc0bd92c0762e70b9f7","impliedFormat":1},{"version":"d009048209b7d3dd1d2dd2f8fe485b1bc1648d9750cf3a96ca1f142d8016c2b3","impliedFormat":1},{"version":"0e47b2faa8c1f0f93bd4deb6119e8f02f1a7c1f2394f88d4fc74b70e270d1eb4","impliedFormat":1},{"version":"ed4d24c29aacac45546aae136d210d935d918051c9bdf63945949c00ff7112e2","impliedFormat":1},{"version":"2ec372633f1e45c8047c7d97f079fccfc4c52de86e04eb6f4f37fafce0730671","impliedFormat":1},{"version":"a1d78fb84a18518e5dc6e5b8fc60e670be6ac36584099afbb483f7ad59e9decc","impliedFormat":1},{"version":"a0aa647e153798624c2c32ca663611eb62ddd131596989648c357fd31a80a292","impliedFormat":1},{"version":"ea366ad80040319ca2ac495f4823fa271d330286525d57a043b6feed08ce7917","impliedFormat":1},{"version":"98bb229db2d81eaec4ba5ef6e7bbb77f24c424e63217bed49a951e9c6b518507","impliedFormat":1},{"version":"8bed77d37a236f90a1bcfce2591f172d009f55da48b45a7469ae0a80b9302404","impliedFormat":1},{"version":"c79ab4ce4944757c8e5f578b6a49e4d21c2736dc7f78d5cb395e3fa01495f8f2","impliedFormat":1},{"version":"469865ae2f24c9ee11bb589d5e28e2d9682ebd7ca9e06bd3643291b16e34f47d","impliedFormat":1},{"version":"dc9282104c64b6aec45b8e0952b5c1777f03f63761049dd60fbcbc35e2306848","impliedFormat":1},{"version":"f64b0687abbd6646ffc0763c102f6c1048527f62659777e9bb302a3e1ef00630","impliedFormat":1},{"version":"b85d57f7dfd39ab2b001ecc3312dfa05259192683a81880749cbca3b28772e42","impliedFormat":1},{"version":"7199dc8fd25c403c9c37acaf7958f75c2b06baaa04c2c8f6e2e28e445fd57d40","impliedFormat":1},{"version":"43725d63f81e18c630acecc5e502bbd5d2a747fff10011e844736544aa4457c0","impliedFormat":1},{"version":"535dfa7bb97e97d8ac5fff37bae9c09fe6a758b52ffd06d50f4dcfd4f273b3c1","impliedFormat":1},{"version":"a478585c9957e2fa7a12f4719861fcce56768e82b68211e293916206ee8d3a61","impliedFormat":1},{"version":"f69b9b72755f8e9731a3e910367f75e9b8572d30e80b5a993e431f36dfdae24f","impliedFormat":1},{"version":"059d51bf1161687e7f6374af419ae67ecfbdb81eebb3493108ddf0c4ece902e4","impliedFormat":1},{"version":"70271cdcd48eda39af5870abcb3471eee639f1c30c3522f54ac64a66abd6bb0e","impliedFormat":1},{"version":"34ca43f6999082790b1cccf8b749346d67dad44cbd2a394f7a68590cc9265481","impliedFormat":1},{"version":"0992833cc5115272e0af47c8caa9c452e2efadcfbdd54c13ec081d735bb0ada6","impliedFormat":1},{"version":"c519bbc76e9214a46c8d38a9875cbead73ea681e403b34b3ce7b86a38e3f7d9a","signature":"658d7ae3d7654cb926a4d20defc7b8ff80e4f07c48b72f8daf118ca1dbb19cf6","impliedFormat":99},{"version":"c53d58d8708c3e1d3f57e97b88c1971b51b548ddd6b20705f47e10e6ed12577a","signature":"8b66835eba52683e3c5f48eccb9d5a31778b4e95b41ac635b25d8fb0282cd166","impliedFormat":99},{"version":"f18d2c0f9a8516dd46993857b0e1a01a59f2a3c206b9dda34f8b6591bc930058","signature":"19b51e1c1c63e7051bae00394f80bfacc468950d983f2678a5d4e80909d19008","impliedFormat":99},{"version":"6e0c6c3957bd54b788eb1a41f380e5f56e86deec3dfb31abf3eaace6abe766ee","signature":"fc3ed3fb77b03919ae7f9d783df6dee159efda9e199eee2415b8302544225950","impliedFormat":99},{"version":"531861e32c6a099ad7a7a6820f3c26f09f55411abf3654c214e472eee50e3e45","signature":"a08bbe0aff62a8de841806581a30a67a391e950e90ded683b69974af0bbcbc4e","impliedFormat":99},{"version":"588cd6fd9f975d60b94607a28418d42db5e28d3cdce35a57076193fb3899bdd8","signature":"fa602d50be70549daa1500419fa23fe977f2c2e2b48a18ec1e16eb6880e0bf89","impliedFormat":99},{"version":"c61ad5da610be01b680164f5958745dcf8d75e4d15626a76adb6e9f741134ddf","signature":"d96e9b1b0b145aca5fcd23a5314c0de5366c67005e41a55402852a0989c44d85","impliedFormat":99},{"version":"70a9379af39f9e72b3b3268341aeebc5bb0d86ec16435dc3ad8077756233a0ca","signature":"9d41e3c58467f4067a508da67aea427f8cd13bb11456c2b68172211362646d80","impliedFormat":99},{"version":"aa23e65ddd492fd8f4e5c2d453065fc04aedfaaaeee1f2b9fa33b3905ed1aa5c","signature":"0f6589f61f915be1f2dbcb00c5293898d1faa94ad76f4b9c4401f1550bf62399","impliedFormat":99},{"version":"b5e7c5963f7c8955304ed5c2994f98ea0542817e74f083137bc3f043b5f10d62","signature":"12d98fc500d48c23d0524d56fd27992b9e4146da11716af88035ee996337b3b5","impliedFormat":99},{"version":"4f6aab233e7967d99d83a1b1f8b7c043ce7e9329adf914fa54db6e5e79af22ee","signature":"d471d2b608b690601abc2cbd9b87724a31893b14d574bad531d631d26c092e75","impliedFormat":99},{"version":"8fc9a176cb4e74ea95ae50ce99a669cccc94236f9fe8643fd7d33e73093dded5","signature":"0ca6c6d5cb1a05a085eb74a6d24ccf864c848bc5f559624860e66bf1d9ebc563","impliedFormat":99},{"version":"4a69e761fd74985ae4c6ecc32d5627880bf0b95f432f1225ecf840e930ef7fd7","signature":"22b692698d687f87da7975dabb0b9399804a261e07eab0d434b420947487782b","impliedFormat":99},{"version":"7dacd8aedbed2b2156ee2d2f50fa073e3f95da695829d583e1236d285de044ca","signature":"2842fc0b7f7ca9bd25a4608646c9ea2fcc46599625d6bbba4fc5386580982d0c","impliedFormat":99},{"version":"e07ee5cf3732a287d310da2194d1d02cfa0bd0ee48c46e156ad6e8ea6d3b38ee","signature":"37ef0e518e13b08cb91b2ae0dc450dcbd6144274e8c9ff3a2bfd1ed661a7688a","impliedFormat":99},{"version":"9a590cb8a7ab265767d67a6f0355f0027b4452e7625c53a5b36130a48974ab7e","signature":"a456b7c515115590cdba93d3f827e7c8626f37b2b8d7a0d6814131cd34f7a7da","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cb3140d0e9cee0aea7264fd6a1d297394052a18eb05ca0220d133e6c043fb5","affectsGlobalScope":true,"impliedFormat":1},{"version":"362d474eb9feae178a83ead94d757c21e42d6d7090e4182f0c12e92830a3d25e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc27badd4bf4a2b0024a0cd32a9bbf0be7073902c5177a58be14242e7d8bf2c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"b972357e61ef2e072f8a88b9f4f5a70984c417237e6106f6b2390414a09ce523","affectsGlobalScope":true,"impliedFormat":1},{"version":"076cac5898bd833255def0f7c5717b83534212873505c9c958f1926d49f9bec6","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"75eb536b960b85f75e21490beeab53ea616646a995ad203e1af532d67a774fb6","impliedFormat":1},{"version":"36d0976d3dad74078f707af107b5082dbe42ffcadb3442ff140c36c8a33b4887","affectsGlobalScope":true,"impliedFormat":1},{"version":"86e0d632e9ef88593e8724ffb6af05104e13a08f9d8df733a30f9991ac387fff","impliedFormat":1},{"version":"7646ad748a9ca15bf43d4c88f83cc851c67f8ec9c1186295605b59ba6bb36dcb","impliedFormat":1},{"version":"cef8931bc129687165253f0642427c2a72705a4613b3ac461b9fa78c7cdaef32","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"47b62c294beb69daa5879f052e416b02e6518f3e4541ae98adbfb27805dd6711","impliedFormat":1},{"version":"f8375506002c556ec412c7e2a5a9ece401079ee5d9eb2c1372e9f5377fac56c7","impliedFormat":1},{"version":"8edd6482bd72eca772f9df15d05c838dd688cdbd4d62690891fca6578cfda6fe","impliedFormat":1},{"version":"07ba29a1a495b710aea48a4cf19ae12b3cbda2a8e9ac62192af477027a99e8de","impliedFormat":1},{"version":"6dead64c944504250dd2fc9095231f36887cfc1534f1ff57737c19f92d165c91","impliedFormat":1},{"version":"b9a4824bb83f25d6d227394db2ed99985308cf2a3a35f0d6d39aa72b15473982","impliedFormat":1},{"version":"6e9948b1e396106601365283680c319a9103c71a5725e7d03e26fe246df60c4c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e8e284b3832911aeede987e4d74cf0a00f2b03896b2fd3bf924344cc0f96b3c","impliedFormat":1},{"version":"37d37474a969ab1b91fc332eb6a375885dfd25279624dfa84dea48c9aedf4472","impliedFormat":1},{"version":"1ddd8c1a3ae1f8ab28affd53b13910be4afe0b35f28517b7f14c268e9e42647a","impliedFormat":1},{"version":"f1a79b6047d006548185e55478837dfbcdd234d6fe51532783f5dffd401cfb2b","impliedFormat":1},{"version":"cbc91187014fb1e738ef252751a9f84abf2989ec1c3b1637ec23b5b39cdf3d25","impliedFormat":1},{"version":"e822320b448edce0c7ede9cbeada034c72e1f1c8c8281974817030564c63dcb1","impliedFormat":1},{"version":"9d65568cba17c9db40251023406668695ad698ea4a34542364af3e78edd37811","affectsGlobalScope":true,"impliedFormat":1},{"version":"f23e3d484de54d235bf702072100b541553a1df2550bad691fe84995e15cf7be","impliedFormat":1},{"version":"821c79b046e40d54a447bebd9307e70b86399a89980a87bbc98114411169e274","impliedFormat":1},{"version":"17bc38afc78d40b2f54af216c0cc31a4bd0c6897a5945fa39945dfc43260be2c","impliedFormat":1},{"version":"d201b44ff390c220a94fb0ff6a534fe9fa15b44f8a86d0470009cdde3a3e62ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"d44445141f204d5672c502a39c1124bcf1df225eba05df0d2957f79122be87b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"de905bc5f7e7a81cb420e212b95ab5e3ab840f93e0cfa8ce879f6e7fa465d4a2","impliedFormat":1},{"version":"bc2ff43214898bc6d53cab92fb41b5309efec9cbb59a0650525980aee994de2b","impliedFormat":1},{"version":"bede3143eeddca3b8ec3592b09d7eb02042f9e195251040c5146eac09b173236","impliedFormat":1},{"version":"64a40cf4ec8a7a29db2b4bc35f042e5be8537c4be316e5221f40f30ca8ed7051","impliedFormat":1},{"version":"294c082d609e6523520290db4f1d54114ebc83643fb42abd965be5bcc5d9416b","impliedFormat":1},{"version":"cf7d740e39bd8adbdc7840ee91bef0af489052f6467edfcefb7197921757ec3b","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"b9f0681c4d2cb00a5cfe08a7be9662627b912de562926819ebddfe2ef6a9b5ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85151402164ab7cb665e58df5c1a29aa25ea4ed3a367f84a15589e7d7a9c8ca","impliedFormat":1},{"version":"89eb8abe2b5c146fbb8f3bf72f4e91de3541f2fb559ad5fed4ad5bf223a3dedb","impliedFormat":1},{"version":"bc6cb10764a82f3025c0f4822b8ad711c16d1a5c75789be2d188d553b69b2d48","affectsGlobalScope":true,"impliedFormat":1},{"version":"41d510caf7ed692923cb6ef5932dc9cf1ed0f57de8eb518c5bab8358a21af674","impliedFormat":1},{"version":"2751c5a6b9054b61c9b03b3770b2d39b1327564672b63e3485ac03ffeb28b4f6","impliedFormat":1},{"version":"dc058956a93388aab38307b7b3b9b6379e1021e73a244aab6ac9427dc3a252a7","impliedFormat":1},{"version":"f33302cf240672359992c356f2005d395b559e176196d03f31a28cc7b01e69bc","impliedFormat":1},{"version":"3ce25041ff6ae06c08fcaccd5fcd9baf4ca6e80e6cb5a922773a1985672e74c2","affectsGlobalScope":true,"impliedFormat":1},{"version":"652c0de14329a834ff06af6ad44670fac35849654a464fd9ae36edb92a362c12","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b1e178016d3fc554505ae087c249b205b1c50624d482c542be9d4682bab81fc","impliedFormat":1},{"version":"5db7c5bb02ef47aaaec6d262d50c4e9355c80937d649365c343fa5e84569621d","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"6831f13f06a15391dfeb2477d48ac58311ab675f85846a05499ee92d6e856933","affectsGlobalScope":true,"impliedFormat":1},{"version":"37bef1064b7d015aeaa7c0716fe23a0b3844abe2c0a3df7144153ca8445fe0da","impliedFormat":1},{"version":"83178a1174286d5f5178c5c75067e36c41b975c26be7b86d99cb18393eb30a41","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[[122,137]],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[95,1],[93,2],[80,3],[83,4],[81,5],[82,6],[84,6],[85,7],[86,8],[87,8],[88,9],[90,10],[92,11],[91,9],[96,6],[97,12],[98,9],[100,13],[99,14],[102,15],[101,6],[121,16],[64,9],[65,17],[73,18],[74,9],[75,17],[67,9],[72,19],[79,20],[66,9],[76,21],[94,22],[69,23],[71,24],[77,9],[68,9],[70,9],[78,9],[103,25],[104,6],[105,14],[89,26],[106,17],[108,27],[107,17],[109,9],[110,9],[111,28],[114,29],[115,30],[116,31],[113,32],[117,9],[120,33],[118,34],[119,9],[181,35],[182,35],[183,36],[143,37],[184,38],[185,39],[186,40],[138,9],[141,41],[139,9],[140,9],[187,42],[188,43],[189,44],[190,45],[191,46],[192,47],[193,47],[194,48],[195,49],[196,50],[197,51],[144,9],[142,9],[198,52],[199,53],[200,54],[231,55],[201,56],[202,57],[203,58],[204,59],[205,60],[206,61],[207,62],[208,63],[209,64],[210,65],[211,65],[212,66],[213,67],[215,68],[214,69],[216,70],[217,71],[218,72],[219,73],[220,74],[221,75],[222,76],[223,77],[224,78],[225,79],[226,80],[227,81],[228,82],[145,9],[146,9],[147,9],[180,83],[229,84],[230,85],[112,9],[61,9],[62,9],[12,9],[10,9],[11,9],[16,9],[15,9],[2,9],[17,9],[18,9],[19,9],[20,9],[21,9],[22,9],[23,9],[24,9],[3,9],[25,9],[26,9],[4,9],[27,9],[31,9],[28,9],[29,9],[30,9],[32,9],[33,9],[34,9],[5,9],[35,9],[36,9],[37,9],[38,9],[6,9],[42,9],[39,9],[40,9],[41,9],[43,9],[7,9],[44,9],[49,9],[50,9],[45,9],[46,9],[47,9],[48,9],[8,9],[54,9],[51,9],[52,9],[53,9],[55,9],[9,9],[56,9],[63,9],[57,9],[58,9],[60,9],[59,9],[1,9],[14,9],[13,9],[163,86],[170,87],[162,86],[177,88],[154,89],[153,90],[176,91],[171,92],[174,93],[156,94],[155,95],[151,96],[150,91],[173,97],[152,98],[157,99],[158,9],[161,99],[148,9],[179,100],[178,99],[165,101],[166,102],[168,103],[164,104],[167,105],[172,91],[159,106],[160,107],[169,108],[149,109],[175,110],[123,111],[124,111],[131,111],[132,111],[133,111],[134,111],[135,111],[136,111],[137,111],[125,111],[126,111],[127,111],[128,111],[129,111],[130,111],[122,111],[232,112],[233,9]],"latestChangedDtsFile":"./dist/commands/generate/token.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts new file mode 100644 index 0000000..a8cf5d1 --- /dev/null +++ b/packages/cli/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + include: ['test/**/*.test.ts'], + globals: true, + setupFiles: ['./test/setup.ts'], + // https://oclif.io/docs/testing/#capturing-stdout-and-stderr-with-vitest + disableConsoleIntercept: true + } +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6557a58 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7065 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@powersync/cli': + specifier: workspace:* + version: link:packages/cli + prettier: + specifier: ^3.0.0 + version: 3.8.1 + + packages/cli: + dependencies: + '@oclif/core': + specifier: ^4 + version: 4.8.0 + '@oclif/plugin-help': + specifier: ^6 + version: 6.2.37 + '@oclif/plugin-plugins': + specifier: ^5 + version: 5.4.55 + devDependencies: + '@eslint/compat': + specifier: ^1 + version: 1.4.1(eslint@9.39.2) + '@oclif/prettier-config': + specifier: ^0.2.1 + version: 0.2.1 + '@oclif/test': + specifier: ^4 + version: 4.1.16(@oclif/core@4.8.0) + '@types/node': + specifier: ^22 + version: 22.19.7 + eslint: + specifier: ^9 + version: 9.39.2 + eslint-config-oclif: + specifier: ^6 + version: 6.0.137(eslint@9.39.2)(typescript@5.9.3) + eslint-config-prettier: + specifier: ^10 + version: 10.1.8(eslint@9.39.2) + oclif: + specifier: ^4 + version: 4.22.73(@types/node@22.19.7) + shx: + specifier: ^0.3.3 + version: 0.3.4 + ts-node: + specifier: ^10 + version: 10.9.2(@types/node@22.19.7)(typescript@5.9.3) + typescript: + specifier: ^5 + version: 5.9.3 + vitest: + specifier: ^4.0.0 + version: 4.0.18(@types/node@22.19.7) + +packages: + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cloudfront@3.980.0': + resolution: {integrity: sha512-W22anGjm0shpDCQN0udPyFYMFx/sgr0N/KnhxknK/KT4Y3yyb5jEyjtfhikkiog2fSrCi6v4kBYyrVpbLqrMiA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-s3@3.980.0': + resolution: {integrity: sha512-ch8QqKehyn1WOYbd8LyDbWjv84Z9OEj9qUxz8q3IOCU3ftAVkVR0wAuN96a1xCHnpOJcQZo3rOB08RlyKdkGxQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sso@3.980.0': + resolution: {integrity: sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.5': + resolution: {integrity: sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/crc64-nvme@3.972.0': + resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.3': + resolution: {integrity: sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.5': + resolution: {integrity: sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.3': + resolution: {integrity: sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.3': + resolution: {integrity: sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.4': + resolution: {integrity: sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.3': + resolution: {integrity: sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.3': + resolution: {integrity: sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.3': + resolution: {integrity: sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.972.3': + resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-expect-continue@3.972.3': + resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.972.3': + resolution: {integrity: sha512-MkNGJ6qB9kpsLwL18kC/ZXppsJbftHVGCisqpEVbTQsum8CLYDX1Bmp/IvhRGNxsqCO2w9/4PwhDKBjG3Uvr4Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-location-constraint@3.972.3': + resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.972.5': + resolution: {integrity: sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-ssec@3.972.3': + resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.5': + resolution: {integrity: sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.980.0': + resolution: {integrity: sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.980.0': + resolution: {integrity: sha512-tO2jBj+ZIVM0nEgi1SyxWtaYGpuAJdsrugmWcI3/U2MPWCYsrvKasUo0026NvJJao38wyUq9B8XTG8Xu53j/VA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.980.0': + resolution: {integrity: sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-arn-parser@3.972.2': + resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.980.0': + resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + + '@aws-sdk/util-user-agent-node@3.972.3': + resolution: {integrity: sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.972.2': + resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@es-joy/jsdoccomment@0.50.2': + resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} + engines: {node: '>=18'} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.4.1': + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/css-tree@3.6.8': + resolution: {integrity: sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + '@eslint/css@0.10.0': + resolution: {integrity: sha512-pHoYRWS08oeU0qVez1pZCcbqHzoJnM5VMtrxH2nWDJ0ukq9DkwWV1BTY+PWK+eWBbndN9W0O9WjJTyAHsDoPOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/json@0.13.2': + resolution: {integrity: sha512-yWLyRE18rHgHXhWigRpiyv1LDPkvWtC6oa7QHXW7YdP6gosJoq7BiLZW2yCs9U7zN7X4U3ZeOJjepA10XAOIMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/momoa@3.3.10': + resolution: {integrity: sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==} + engines: {node: '>=18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@3.2.0': + resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@2.3.0': + resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@2.5.0': + resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} + engines: {node: '>=18'} + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@oclif/core@4.8.0': + resolution: {integrity: sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-help@6.2.37': + resolution: {integrity: sha512-5N/X/FzlJaYfpaHwDC0YHzOzKDWa41s9t+4FpCDu4f9OMReds4JeNBaaWk9rlIzdKjh2M6AC5Q18ORfECRkHGA==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-not-found@3.2.74': + resolution: {integrity: sha512-6RD/EuIUGxAYR45nMQg+nw+PqwCXUxkR6Eyn+1fvbVjtb9d+60OPwB77LCRUI4zKNI+n0LOFaMniEdSpb+A7kQ==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-plugins@5.4.55': + resolution: {integrity: sha512-Dmcryvss0CJwaGSVimhIcnWfQto1rAMA5nMN6v6syrOhR76ygw2X7YWvkI6PXCFB/aekT2LJeQHy9Hl/OQJiYQ==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-warn-if-update-available@3.1.55': + resolution: {integrity: sha512-VIEBoaoMOCjl3y+w/kdfZMODi0mVMnDuM0vkBf3nqeidhRXVXq87hBqYDdRwN1XoD+eDfE8tBbOP7qtSOONztQ==} + engines: {node: '>=18.0.0'} + + '@oclif/prettier-config@0.2.1': + resolution: {integrity: sha512-XB8kwQj8zynXjIIWRm+6gO/r8Qft2xKtwBMSmq1JRqtA6TpwpqECqiu8LosBCyg2JBXuUy2lU23/L98KIR7FrQ==} + + '@oclif/test@4.1.16': + resolution: {integrity: sha512-LPrF++WGGBE0pe3GUkzEteI5WrwTT7usGpIMSxkyJhYnFXKkwASyTcCmOhNH4QC65kqsLt1oBA88BMkCJqPtxg==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@oclif/core': '>= 3.0.0' + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.22.0': + resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.8': + resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.8': + resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.8': + resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.8': + resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.8': + resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.2.9': + resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.2.8': + resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.2.8': + resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.12': + resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.29': + resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.8': + resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.11.1': + resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.28': + resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.31': + resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.10': + resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.8': + resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@stylistic/eslint-plugin@3.1.0': + resolution: {integrity: sha512-pA6VOrOqk0+S8toJYhQGv2MWpQQR0QpeUo9AhNkC49Y26nxBQ/nH1rta9bUU1rPw2fJ1zZEMV5oCX5AazT7J2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin@5.7.1': + resolution: {integrity: sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@22.19.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.54.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-oclif@5.2.2: + resolution: {integrity: sha512-NNTyyolSmKJicgxtoWZ/hoy2Rw56WIoWCFxgnBkXqDgi9qPKMwZs2Nx2b6SHLJvCiWWhZhWr5V46CFPo3PSPag==} + engines: {node: '>=18.0.0'} + + eslint-config-oclif@6.0.137: + resolution: {integrity: sha512-23so0ju6qf+JGDtGUclybUT4JGUSapl2zp+f+JOHCzLFpxJ/4fPCU6KNMZWLPBecdjIertMNRVOmHddt5i83Fg==} + engines: {node: '>=18.18.0'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-xo-space@0.35.0: + resolution: {integrity: sha512-+79iVcoLi3PvGcjqYDpSPzbLfqYpNcMlhsCBRsnmDoHAn4npJG6YxmHpelQKpXM7v/EeZTUKb4e1xotWlei8KA==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-config-xo@0.44.0: + resolution: {integrity: sha512-YG4gdaor0mJJi8UBeRJqDPO42MedTWYMaUyucF5bhm2pi/HS98JIxfFQmTLuyj6hGpQlAazNfyVnn7JuDn+Sew==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-config-xo@0.49.0: + resolution: {integrity: sha512-hGtD689+fdJxggx1QbEjWfgGOsTasmYqtfk3Rsxru9QyKg2iOhXO2fvR9C7ck8AGw+n2wy6FsA8/MBIzznt5/Q==} + engines: {node: '>=20'} + peerDependencies: + eslint: '>=9.33.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-es@4.1.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsdoc@50.8.0: + resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-mocha@10.5.0: + resolution: {integrity: sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-n@15.7.0: + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-n@17.23.2: + resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-perfectionist@4.15.1: + resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + eslint: '>=8.45.0' + + eslint-plugin-unicorn@48.0.1: + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + + eslint-plugin-unicorn@56.0.1: + resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} + engines: {node: '>=18.18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.1: + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} + + git-hooks-list@3.2.0: + resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-call@5.3.0: + resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} + engines: {node: '>=8.0.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.23.0: + resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm@10.9.4: + resolution: {integrity: sha512-OnUG836FwboQIbqtefDNlyR0gTHzIfwRfE3DuiNewBvnMnWEpB0VEXwBlFVgqpNzIgYo/MHh3d2Hel/pszapAA==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-treeify@4.0.1: + resolution: {integrity: sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==} + engines: {node: '>= 16'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + oclif@4.22.73: + resolution: {integrity: sha512-nyODp0FrwdKc/jBPFeloGmAQA49Y6nC7ZANHwPZjok09RUCJpaJkuoe7EH6EOeMrS1Qsb+muYsV4fBa6bkVjIg==} + engines: {node: '>=18.0.0'} + hasBin: true + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rambda@7.5.0: + resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.15.1: + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tiny-jsonc@1.0.2: + resolution: {integrity: sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.54.0: + resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yarn@1.22.22: + resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} + engines: {node: '>=4.0.0'} + hasBin: true + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + +snapshots: + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-cloudfront@3.980.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-s3@3.980.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/middleware-bucket-endpoint': 3.972.3 + '@aws-sdk/middleware-expect-continue': 3.972.3 + '@aws-sdk/middleware-flexible-checksums': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-location-constraint': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-ssec': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/signature-v4-multi-region': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-blob-browser': 4.2.9 + '@smithy/hash-node': 4.2.8 + '@smithy/hash-stream-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/md5-js': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.980.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.973.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.0': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-login': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.4': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-ini': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.3': + dependencies: + '@aws-sdk/client-sso': 3.980.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/token-providers': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.972.3': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/crc64-nvme': 3.972.0 + '@aws-sdk/types': 3.973.1 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@smithy/core': 3.22.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.980.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.980.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.980.0': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.973.1': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.972.2': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.980.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.4': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.13.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.972.3': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.2': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@es-joy/jsdoccomment@0.50.2': + dependencies: + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.54.0 + comment-parser: 1.4.1 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@1.4.1(eslint@9.39.2)': + dependencies: + '@eslint/core': 0.17.0 + optionalDependencies: + eslint: 9.39.2 + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.2': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/css-tree@3.6.8': + dependencies: + mdn-data: 2.23.0 + source-map-js: 1.2.1 + + '@eslint/css@0.10.0': + dependencies: + '@eslint/core': 0.14.0 + '@eslint/css-tree': 3.6.8 + '@eslint/plugin-kit': 0.3.5 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/json@0.13.2': + dependencies: + '@eslint/core': 0.15.2 + '@eslint/plugin-kit': 0.3.5 + '@humanwhocodes/momoa': 3.3.10 + natural-compare: 1.4.0 + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.3.5': + dependencies: + '@eslint/core': 0.15.2 + levn: 0.4.1 + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/momoa@3.3.10': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@22.19.7)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.7) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/confirm@3.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/confirm@5.1.21(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/core@10.3.2(@types/node@22.19.7)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.7) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.15 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.19.7 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/editor@4.2.23(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/expand@4.0.23(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/external-editor@1.0.3(@types/node@22.19.7)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/input@4.3.1(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/number@3.0.23(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/password@4.0.23(@types/node@22.19.7)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/prompts@7.10.1(@types/node@22.19.7)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.7) + '@inquirer/confirm': 5.1.21(@types/node@22.19.7) + '@inquirer/editor': 4.2.23(@types/node@22.19.7) + '@inquirer/expand': 4.0.23(@types/node@22.19.7) + '@inquirer/input': 4.3.1(@types/node@22.19.7) + '@inquirer/number': 3.0.23(@types/node@22.19.7) + '@inquirer/password': 4.0.23(@types/node@22.19.7) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.7) + '@inquirer/search': 3.2.2(@types/node@22.19.7) + '@inquirer/select': 4.4.2(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/rawlist@4.1.11(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/search@3.2.2(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.7) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/select@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 + + '@inquirer/select@4.4.2(@types/node@22.19.7)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.7) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@3.0.10(@types/node@22.19.7)': + optionalDependencies: + '@types/node': 22.19.7 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nolyfill/is-core-module@1.0.39': {} + + '@oclif/core@4.8.0': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 9.0.5 + semver: 7.7.3 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.15 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/plugin-help@6.2.37': + dependencies: + '@oclif/core': 4.8.0 + + '@oclif/plugin-not-found@3.2.74(@types/node@22.19.7)': + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@22.19.7) + '@oclif/core': 4.8.0 + ansis: 3.17.0 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@types/node' + + '@oclif/plugin-plugins@5.4.55': + dependencies: + '@oclif/core': 4.8.0 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + npm: 10.9.4 + npm-package-arg: 11.0.3 + npm-run-path: 5.3.0 + object-treeify: 4.0.1 + semver: 7.7.3 + validate-npm-package-name: 5.0.1 + which: 4.0.0 + yarn: 1.22.22 + transitivePeerDependencies: + - supports-color + + '@oclif/plugin-warn-if-update-available@3.1.55': + dependencies: + '@oclif/core': 4.8.0 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + http-call: 5.3.0 + lodash: 4.17.23 + registry-auth-token: 5.1.1 + transitivePeerDependencies: + - supports-color + + '@oclif/prettier-config@0.2.1': {} + + '@oclif/test@4.1.16(@oclif/core@4.8.0)': + dependencies: + '@oclif/core': 4.8.0 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@smithy/abort-controller@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.2.1': + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/core@3.22.0': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.8': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.8': + dependencies: + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.2.9': + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.12': + dependencies: + '@smithy/core': 3.22.0 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.29': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.8': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.8': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + + '@smithy/shared-ini-file-loader@4.4.3': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.8': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.11.1': + dependencies: + '@smithy/core': 3.22.0 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 + tslib: 2.8.1 + + '@smithy/types@4.12.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.8': + dependencies: + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.28': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.31': + dependencies: + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.8': + dependencies: + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.10': + dependencies: + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.8': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@standard-schema/spec@1.1.0': {} + + '@stylistic/eslint-plugin@3.1.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@stylistic/eslint-plugin@5.7.1(eslint@9.39.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/types': 8.54.0 + eslint: 9.39.2 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/http-cache-semantics@4.2.0': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 22.19.7 + + '@types/node@22.19.7': + dependencies: + undici-types: 6.21.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/wrap-ansi@3.0.0': {} + + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + eslint: 9.39.2 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.54.0': {} + + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + eslint-visitor-keys: 4.2.1 + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.19.7))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@22.19.7) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansis@3.17.0: {} + + are-docs-informative@0.0.2: {} + + arg@4.1.3: {} + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + async-function@1.0.0: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async@3.2.6: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.9.19: {} + + bowser@2.13.1: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.283 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + builtin-modules@3.3.0: {} + + builtins@5.1.0: + dependencies: + semver: 7.7.3 + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + caniuse-lite@1.0.30001767: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + chai@6.2.2: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.8.1 + + chardet@2.1.1: {} + + ci-info@3.9.0: {} + + ci-info@4.4.0: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comment-parser@1.4.1: {} + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + confusing-browser-globals@1.0.11: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 + + content-type@1.0.5: {} + + core-js-compat@3.48.0: + dependencies: + browserslist: 4.28.1 + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-indent@7.0.2: {} + + detect-newline@4.0.1: {} + + diff@4.0.4: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-to-chromium@1.5.283: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + semver: 7.7.3 + + eslint-config-oclif@5.2.2(eslint@9.39.2): + dependencies: + eslint-config-xo-space: 0.35.0(eslint@9.39.2) + eslint-plugin-mocha: 10.5.0(eslint@9.39.2) + eslint-plugin-n: 15.7.0(eslint@9.39.2) + eslint-plugin-unicorn: 48.0.1(eslint@9.39.2) + transitivePeerDependencies: + - eslint + + eslint-config-oclif@6.0.137(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@eslint/compat': 1.4.1(eslint@9.39.2) + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@stylistic/eslint-plugin': 3.1.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + eslint-config-oclif: 5.2.2(eslint@9.39.2) + eslint-config-xo: 0.49.0(eslint@9.39.2) + eslint-config-xo-space: 0.35.0(eslint@9.39.2) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2) + eslint-plugin-jsdoc: 50.8.0(eslint@9.39.2) + eslint-plugin-mocha: 10.5.0(eslint@9.39.2) + eslint-plugin-n: 17.23.2(eslint@9.39.2)(typescript@5.9.3) + eslint-plugin-perfectionist: 4.15.1(eslint@9.39.2)(typescript@5.9.3) + eslint-plugin-unicorn: 56.0.1(eslint@9.39.2) + typescript-eslint: 8.54.0(eslint@9.39.2)(typescript@5.9.3) + transitivePeerDependencies: + - eslint + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - typescript + + eslint-config-prettier@10.1.8(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + + eslint-config-xo-space@0.35.0(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + eslint-config-xo: 0.44.0(eslint@9.39.2) + + eslint-config-xo@0.44.0(eslint@9.39.2): + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 9.39.2 + + eslint-config-xo@0.49.0(eslint@9.39.2): + dependencies: + '@eslint/css': 0.10.0 + '@eslint/json': 0.13.2 + '@stylistic/eslint-plugin': 5.7.1(eslint@9.39.2) + confusing-browser-globals: 1.0.11 + eslint: 9.39.2 + globals: 16.5.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + get-tsconfig: 4.13.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2) + transitivePeerDependencies: + - supports-color + + eslint-plugin-es-x@7.8.0(eslint@9.39.2): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.2 + eslint-compat-utils: 0.5.1(eslint@9.39.2) + + eslint-plugin-es@4.1.0(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.2 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsdoc@50.8.0(eslint@9.39.2): + dependencies: + '@es-joy/jsdoccomment': 0.50.2 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.3(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint: 9.39.2 + espree: 10.4.0 + esquery: 1.7.0 + parse-imports-exports: 0.2.4 + semver: 7.7.3 + spdx-expression-parse: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-mocha@10.5.0(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + eslint-utils: 3.0.0(eslint@9.39.2) + globals: 13.24.0 + rambda: 7.5.0 + + eslint-plugin-n@15.7.0(eslint@9.39.2): + dependencies: + builtins: 5.1.0 + eslint: 9.39.2 + eslint-plugin-es: 4.1.0(eslint@9.39.2) + eslint-utils: 3.0.0(eslint@9.39.2) + ignore: 5.3.2 + is-core-module: 2.16.1 + minimatch: 3.1.2 + resolve: 1.22.11 + semver: 7.7.3 + + eslint-plugin-n@17.23.2(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + enhanced-resolve: 5.18.4 + eslint: 9.39.2 + eslint-plugin-es-x: 7.8.0(eslint@9.39.2) + get-tsconfig: 4.13.1 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + eslint-plugin-perfectionist@4.15.1(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-unicorn@48.0.1(eslint@9.39.2): + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 9.39.2 + esquery: 1.7.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + lodash: 4.17.23 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.3 + strip-indent: 3.0.0 + + eslint-plugin-unicorn@56.0.1(eslint@9.39.2): + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + ci-info: 4.4.0 + clean-regexp: 1.0.0 + core-js-compat: 3.48.0 + eslint: 9.39.2 + esquery: 1.7.0 + globals: 15.15.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.3 + strip-indent: 3.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-utils@3.0.0(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-levenshtein@3.0.0: + dependencies: + fastest-levenshtein: 1.0.16 + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.2 + + fastest-levenshtein@1.0.16: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root@2.0.0: + dependencies: + micromatch: 4.0.8 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data-encoder@2.1.4: {} + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stdin@9.0.0: {} + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-hooks-list@3.2.0: {} + + github-slugger@2.0.0: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + 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 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.15.0: {} + + globals@16.5.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.8.1 + + hosted-git-info@2.8.9: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + http-cache-semantics@4.2.0: {} + + http-call@5.3.0: + dependencies: + content-type: 1.0.5 + debug: 4.4.3(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-retry-allowed@1.2.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@4.1.0: {} + + jsesc@0.5.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.23: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + mdn-data@2.23.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + natural-orderby@5.0.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-releases@2.0.27: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.11 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + normalize-url@8.1.1: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.3 + validate-npm-package-name: 5.0.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm@10.9.4: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-treeify@4.0.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obug@2.1.1: {} + + oclif@4.22.73(@types/node@22.19.7): + dependencies: + '@aws-sdk/client-cloudfront': 3.980.0 + '@aws-sdk/client-s3': 3.980.0 + '@inquirer/confirm': 3.2.0 + '@inquirer/input': 2.3.0 + '@inquirer/select': 2.5.0 + '@oclif/core': 4.8.0 + '@oclif/plugin-help': 6.2.37 + '@oclif/plugin-not-found': 3.2.74(@types/node@22.19.7) + '@oclif/plugin-warn-if-update-available': 3.1.55 + ansis: 3.17.0 + async-retry: 1.3.3 + change-case: 4.1.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 2.0.0 + got: 13.0.0 + lodash: 4.17.23 + normalize-package-data: 6.0.2 + semver: 7.7.3 + sort-package-json: 2.15.1 + tiny-jsonc: 1.0.2 + validate-npm-package-name: 5.0.1 + transitivePeerDependencies: + - '@types/node' + - aws-crt + - supports-color + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-cancelable@3.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-statements@1.0.11: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pluralize@8.0.0: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.8.1: {} + + proc-log@4.2.0: {} + + proto-list@1.2.4: {} + + punycode@2.3.1: {} + + quick-lru@5.1.1: {} + + rambda@7.5.0: {} + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + rechoir@0.6.2: + dependencies: + resolve: 1.22.11 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + retry@0.13.1: {} + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shx@0.3.4: + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + sort-object-keys@1.1.3: {} + + sort-package-json@2.15.1: + dependencies: + detect-indent: 7.0.2 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.2.0 + is-plain-obj: 4.1.0 + semver: 7.7.3 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.15 + + source-map-js@1.2.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + stable-hash@0.0.5: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strnum@2.1.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.3.0: {} + + tiny-jsonc@1.0.2: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-declaration-location@1.0.7(typescript@5.9.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.9.3 + + ts-node@10.9.2(@types/node@22.19.7)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.19.7 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.54.0(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + universalify@0.1.2: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.8.1 + + upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vite@7.3.1(@types/node@22.19.7): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.7 + fsevents: 2.3.3 + + vitest@4.0.18(@types/node@22.19.7): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.19.7)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@22.19.7) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.7 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + yarn@1.22.22: {} + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..dee51e9 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" From 2e6fa58a1daf87ad0743b40f1aae529feaf3d6d5 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Tue, 3 Feb 2026 13:37:12 +0200 Subject: [PATCH 002/141] confg templates --- packages/cli/package.json | 3 +- .../templates/cloud/powersync/service.yaml | 152 ++ .../cli/templates/cloud/powersync/sync.yaml | 26 + .../self-hosted/base/powersync/service.yaml | 219 ++ .../self-hosted/base/powersync/sync.yaml | 26 + packages/cli/templates/vscode/settings.json | 6 + pnpm-lock.yaml | 1771 ++++++++++++++++- 7 files changed, 2193 insertions(+), 10 deletions(-) create mode 100644 packages/cli/templates/cloud/powersync/service.yaml create mode 100644 packages/cli/templates/cloud/powersync/sync.yaml create mode 100644 packages/cli/templates/self-hosted/base/powersync/service.yaml create mode 100644 packages/cli/templates/self-hosted/base/powersync/sync.yaml create mode 100644 packages/cli/templates/vscode/settings.json diff --git a/packages/cli/package.json b/packages/cli/package.json index 19159ae..f224a1a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -10,7 +10,8 @@ "dependencies": { "@oclif/core": "^4", "@oclif/plugin-help": "^6", - "@oclif/plugin-plugins": "^5" + "@oclif/plugin-plugins": "^5", + "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types" }, "devDependencies": { "@eslint/compat": "^1", diff --git a/packages/cli/templates/cloud/powersync/service.yaml b/packages/cli/templates/cloud/powersync/service.yaml new file mode 100644 index 0000000..f6f9f3e --- /dev/null +++ b/packages/cli/templates/cloud/powersync/service.yaml @@ -0,0 +1,152 @@ +# TODO update this with published schema +# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/json-schema/powersync-config.json +# +# PowerSync Cloud config – example template with all schema options documented. +# Uncomment one block per type (one connection type + optional client_auth). We recommend secrets as: secret: !env ENV_NAME (see ../../.vscode/settings.json). +# Docs: https://docs.powersync.com/usage/sync-rules +# +# ----------------------------------------------------------------------------- +# TOP LEVEL +# ----------------------------------------------------------------------------- + +# region (required): deployment region, e.g. us +# Note: This cannot be changed after the initial deployment +region: us + +# replication: database connections for sync +# Note: only a single connection is currently supported +replication: + connections: + # ------------------------------------------------------------------------- + # PostgreSQL – uncomment this entire block to use + # ------------------------------------------------------------------------- + # - type: postgresql + # hostname: example.com + # database: one + # username: postgres + # password: + # secret: !env POWERSYNC_DATABASE_PASSWORD + # port: 5432 + # name: string + # id: string + # tag: string + # uri: string + # Options: verify-full | verify-ca + # sslmode: verify-full + # cacert: string + # client_certificate: string + # client_private_key: + # secret: !env POWERSYNC_DATABASE_CLIENT_KEY + # vpc_endpoint_hostname: string + # debug_api: boolean + + # ------------------------------------------------------------------------- + # MongoDB – uncomment this entire block to use (comment out PostgreSQL above) + # ------------------------------------------------------------------------- + # - type: mongodb + # uri: mongodb+srv://user:pass@host/db + # name: string + # id: string + # tag: string + # username: string + # password: + # secret: !env POWERSYNC_MONGODB_PASSWORD + # database: string + # # Options: off | auto_configure | read_only + # post_images: off + # vpc_endpoint_hostname: string + + # ------------------------------------------------------------------------- + # MySQL – uncomment this entire block to use (comment out PostgreSQL above) + # ------------------------------------------------------------------------- + # - type: mysql + # hostname: db.example.com + # port: 3306 + # database: mydb + # username: sync + # password: + # secret: !env POWERSYNC_MYSQL_PASSWORD + # name: string + # id: string + # tag: string + # uri: string + # client_certificate: string + # client_private_key: + # secret: !env POWERSYNC_MYSQL_CLIENT_KEY + # debug_api: false + + # ------------------------------------------------------------------------- + # MSSQL – uncomment this entire block to use (comment out PostgreSQL above) + # ------------------------------------------------------------------------- + # - type: mssql + # hostname: sql.example.com + # port: 1433 + # database: mydb + # schema: dbo + # username: sync + # password: + # secret: !env POWERSYNC_MSSQL_PASSWORD + # name: string + # id: string + # tag: string + # uri: string + # # Options: default | azure-active-directory-password | azure-active-directory-service-principal-secret + # authentication: + # type: default + # options: + # password: + # secret: !env POWERSYNC_MSSQL_PASSWORD + # additionalConfig: + # pollingIntervalMs: 5000 + # pollingBatchSize: 1000 + # trustServerCertificate: false + # debug_api: false + +# ----------------------------------------------------------------------------- +# CLIENT AUTH (optional) – uncomment this entire block to enable +# ----------------------------------------------------------------------------- +# client_auth: + +# # PowerSync will use the same JWT secret as Supabase. +# supabase: false + +# # Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. +# supabase_jwt_secret: +# secret: !env POWERSYNC_SUPABASE_JWT_SECRET + +# # Additional audiences to accept when validating incoming JWT tokens (the instance domain is always accepted) +# additional_audiences: [] + +# # Enables development tokens to be generated and accepted by the instance +# allow_temporary_tokens: false + +# # URL to a JSON Web Key Set (JWKS) endpoint; the instance fetches public keys from this URL to verify JWT signatures from clients. +# jwks_uri: https://example.com/jwks.json +# # Inline JSON Web Key Set; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. +# jwks: +# keys: +# # HMAC (symmetric) – Options: HS256 | HS384 | HS512 +# - kty: oct +# alg: HS256 +# kid: example-key +# k: +# secret: !env POWERSYNC_CLIENT_AUTH_KEY +# # RSA – Options for alg: RS256 | RS384 | RS512 +# - kty: RSA +# kid: my-rsa-key +# n: "" +# e: "" +# alg: RS256 +# # EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 +# - kty: EC +# kid: my-ec-key +# crv: P-256 +# x: "" +# y: "" +# alg: ES256 +# # OKP (EdDSA) – Options for crv: Ed25519 | Ed448 +# - kty: OKP +# kid: my-okp-key +# crv: Ed25519 +# x: "" +# alg: EdDSA diff --git a/packages/cli/templates/cloud/powersync/sync.yaml b/packages/cli/templates/cloud/powersync/sync.yaml new file mode 100644 index 0000000..3e7b524 --- /dev/null +++ b/packages/cli/templates/cloud/powersync/sync.yaml @@ -0,0 +1,26 @@ +# yaml-language-server: $schema=https://unpkg.com/@powersync/service-sync-rules@latest/schema/sync_rules.json +# +# See Documentation for more information: +# https://docs.powersync.com/usage/sync-rules + +# See https://docs.powersync.com/usage/sync-rules/compatibility for config:edition details +config: + edition: 2 + +# Define sync rules to control which data is synced to each user +# Docs: https://docs.powersync.com/usage/sync-rules +bucket_definitions: + global: + # Sync rules without parameter queries will sync to all users + data: + # Sync all rows + - SELECT * FROM mytable + # Only sync some rows + - SELECT * FROM mytable WHERE mycolumn = false + # Wildcards can be used, useful in development to quickly sync all tables + #- SELECT * FROM "%" + by_user: + # Only sync rows belonging to the user, using fields from the auth token + parameters: SELECT request.user_id() as user_id + data: + - SELECT * FROM mytable WHERE mytable.user_id = bucket.user_id diff --git a/packages/cli/templates/self-hosted/base/powersync/service.yaml b/packages/cli/templates/self-hosted/base/powersync/service.yaml new file mode 100644 index 0000000..db6a5cb --- /dev/null +++ b/packages/cli/templates/self-hosted/base/powersync/service.yaml @@ -0,0 +1,219 @@ +# yaml-language-server: $schema=https://unpkg.com/@powersync/service-schema@latest/json-schema/powersync-config.json +# +# PowerSync self-hosted config – example template with all schema options documented. +# Uncomment one block per type where applicable. We recommend secrets via !env ENV_NAME. +# Docs: https://docs.powersync.com/self-hosting +# +# ----------------------------------------------------------------------------- +# TELEMETRY – configuration for service telemetry and monitoring +# ----------------------------------------------------------------------------- +# See https://docs.powersync.com/self-hosting/telemetry +telemetry: + # When true, disables sharing of anonymized telemetry data + disable_telemetry_sharing: false + # Port on which Prometheus metrics will be exposed. When set, metrics will be available on this port for scraping. + +# ----------------------------------------------------------------------------- +# REPLICATION – configuration for data replication; array of data source connections +# ----------------------------------------------------------------------------- +replication: + connections: + # ------------------------------------------------------------------------- + # PostgreSQL – uncomment this entire block to use + # ------------------------------------------------------------------------- + # - type: postgresql + # uri: !env PS_DATA_SOURCE_URI + # # Unique identifier for the connection. Optional when only a single connection is present. + # # id: string + # # Additional meta tag for the connection, used for categorization or grouping. + # # tag: string + # # hostname: string + # # port: number | string + # # username: string + # # password: !env PS_DATABASE_PASSWORD + # # database: string + # # Options: verify-full | verify-ca | disable + # sslmode: disable + # # cacert: string + # # client_certificate: string + # # client_private_key: string + # # tls_servername: string + # # reject_ip_ranges: [ string ] + # # slot_name_prefix: string + # # max_pool_size: number + # # When enabled, allows query execution. + # # debug_api: boolean + + # ------------------------------------------------------------------------- + # MongoDB – uncomment this entire block to use (comment out PostgreSQL above) + # ------------------------------------------------------------------------- + # - type: mongodb + # uri: !env PS_MONGODB_URI + # database: string + # username: string + # password: !env PS_MONGODB_PASSWORD + # id: string + # tag: string + # reject_ip_ranges: [] + # # Options: off | auto_configure | read_only + # post_images: off + # debug_api: false + + # ------------------------------------------------------------------------- + # MySQL – uncomment this entire block to use (comment out PostgreSQL above) + # ------------------------------------------------------------------------- + # - type: mysql + # uri: !env PS_MYSQL_URI + # hostname: db.example.com + # port: 3306 + # database: mydb + # username: sync + # password: !env PS_MYSQL_PASSWORD + # id: string + # tag: string + # server_id: number + # cacert: string + # client_certificate: string + # client_private_key: string + # reject_ip_ranges: [] + # binlog_queue_memory_limit: number + # debug_api: false + +# ----------------------------------------------------------------------------- +# STORAGE – configuration for the storage backend (sync bucket storage) +# ----------------------------------------------------------------------------- +storage: + type: mongodb + uri: !env PS_MONGO_URI + # database: string + # username: string + # password: !env PS_MONGO_PASSWORD + # reject_ip_ranges: [] + # Maximum number of connections to the storage database, per process. Defaults to 8. + # max_pool_size: 8 + +# ----------------------------------------------------------------------------- +# PostgreSQL storage – uncomment this block and comment out the MongoDB storage block above to use PostgreSQL +# ----------------------------------------------------------------------------- +# storage: +# type: postgresql +# uri: !env PS_STORAGE_URI +# id: string +# tag: string +# hostname: string +# port: 5432 +# username: string +# password: !env PS_STORAGE_PASSWORD +# database: string +# # Options: verify-full | verify-ca | disable +# sslmode: verify-full +# cacert: string +# client_certificate: string +# client_private_key: string +# tls_servername: string +# reject_ip_ranges: [] +# slot_name_prefix: string +# max_pool_size: 8 +# batch_limits: +# max_estimated_size: number +# max_record_count: number +# max_current_data_batch_size: number + +# ----------------------------------------------------------------------------- +# PORT – the port on which the service will listen for connections (number or string) +# ----------------------------------------------------------------------------- +port: !env PS_PORT + +# ----------------------------------------------------------------------------- +# SYNC RULES – configuration for synchronization rules that define data access patterns +# ----------------------------------------------------------------------------- +# One of path or content is supported. path is used in this example. +sync_rules: + # Path to the sync rules YAML file. + path: sync_rules.yaml + # Inline sync rules content as a string (use this or path, not both). + # content: string + # Whether to exit the process if there is an error parsing sync rules. + # exit_on_error: boolean + +# ----------------------------------------------------------------------------- +# CLIENT AUTH (optional) – configuration for client authentication mechanisms +# ----------------------------------------------------------------------------- +# client_auth: +# # PowerSync will use the same JWT secret as Supabase. +# supabase: false +# # Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. +# supabase_jwt_secret: !env PS_SUPABASE_JWT_SECRET +# # URI or array of URIs pointing to JWKS endpoints for client authentication; instance fetches public keys to verify JWT signatures. +# jwks_uri: https://example.com/jwks.json +# # Inline JWKS configuration; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. +# jwks: +# keys: +# # HMAC (symmetric) – Options: HS256 | HS384 | HS512 +# - kty: oct +# alg: HS256 +# kid: example-key +# k: !env PS_CLIENT_AUTH_KEY +# # RSA – Options for alg: RS256 | RS384 | RS512 +# - kty: RSA +# kid: my-rsa-key +# n: "" +# e: "" +# alg: RS256 +# # EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 +# - kty: EC +# kid: my-ec-key +# crv: P-256 +# x: "" +# y: "" +# alg: ES256 +# # OKP (EdDSA) – Options for crv: Ed25519 | Ed448 +# - kty: OKP +# kid: my-okp-key +# crv: Ed25519 +# x: "" +# alg: EdDSA +# # When true, blocks JWKS URIs that resolve to local network addresses. +# block_local_jwks: false +# # IP ranges to reject when validating JWKS URIs. +# jwks_reject_ip_ranges: [] +# # Valid audiences for JWT validation. +# audience: ['authenticated'] + +# ----------------------------------------------------------------------------- +# API – API service configuration and parameters +# ----------------------------------------------------------------------------- +api: + # API access tokens for administrative operations. + tokens: + - use_a_better_token_in_production + # Performance and safety parameters for the API service. + # parameters: + # # Maximum number of connections (http streams or websockets) per API process. Default of 200. + # max_concurrent_connections: 200 + # # Should not be significantly more than storage.max_pool_size, otherwise it would block on the pool. Default of 10. + # max_data_fetch_concurrency: 10 + # # Maximum number of buckets for each connection; hard limit so the service errors instead of crashing when a sync rule is misconfigured. Default of 1000. + # max_buckets_per_connection: 1000 + # # Limit on parameter query results before converting to a unique set. Default of 1000. + # max_parameter_query_results: 1000 + +# ----------------------------------------------------------------------------- +# HEALTHCHECK (optional) – mechanisms for exposing health check data +# ----------------------------------------------------------------------------- +# healthcheck: +# probes: +# # Enables exposing healthcheck status via filesystem files. +# use_filesystem: boolean +# # Enables exposing healthcheck status via HTTP endpoints. +# use_http: boolean +# # Deprecated. Enables HTTP probes for both API and UNIFIED service modes. FileSystem probes are always enabled. +# use_legacy: boolean + +# ----------------------------------------------------------------------------- +# MIGRATIONS (optional) – configuration for database schema migrations +# ----------------------------------------------------------------------------- +# migrations: +# # When true, disables automatic storage database schema migrations. +# # Migrations need to manually be started by the consuming application. +# disable_auto_migration: false diff --git a/packages/cli/templates/self-hosted/base/powersync/sync.yaml b/packages/cli/templates/self-hosted/base/powersync/sync.yaml new file mode 100644 index 0000000..3e7b524 --- /dev/null +++ b/packages/cli/templates/self-hosted/base/powersync/sync.yaml @@ -0,0 +1,26 @@ +# yaml-language-server: $schema=https://unpkg.com/@powersync/service-sync-rules@latest/schema/sync_rules.json +# +# See Documentation for more information: +# https://docs.powersync.com/usage/sync-rules + +# See https://docs.powersync.com/usage/sync-rules/compatibility for config:edition details +config: + edition: 2 + +# Define sync rules to control which data is synced to each user +# Docs: https://docs.powersync.com/usage/sync-rules +bucket_definitions: + global: + # Sync rules without parameter queries will sync to all users + data: + # Sync all rows + - SELECT * FROM mytable + # Only sync some rows + - SELECT * FROM mytable WHERE mycolumn = false + # Wildcards can be used, useful in development to quickly sync all tables + #- SELECT * FROM "%" + by_user: + # Only sync rows belonging to the user, using fields from the auth token + parameters: SELECT request.user_id() as user_id + data: + - SELECT * FROM mytable WHERE mytable.user_id = bucket.user_id diff --git a/packages/cli/templates/vscode/settings.json b/packages/cli/templates/vscode/settings.json new file mode 100644 index 0000000..bf62100 --- /dev/null +++ b/packages/cli/templates/vscode/settings.json @@ -0,0 +1,6 @@ +{ + "yaml.customTags": [ + "!env scalar" + ] + } + \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6557a58..09cc468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@oclif/plugin-plugins': specifier: ^5 version: 5.4.55 + '@powersync/management-types': + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types + version: file:../service/powersync-hosted/public-packages/types(yaml@2.8.2) devDependencies: '@eslint/compat': specifier: ^1 @@ -62,7 +65,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.0 - version: 4.0.18(@types/node@22.19.7) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(yaml@2.8.2) packages: @@ -233,6 +236,74 @@ packages: resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} + '@azure-rest/core-client@2.5.1': + resolution: {integrity: sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==} + engines: {node: '>=20.0.0'} + + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} + engines: {node: '>=20.0.0'} + + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} + engines: {node: '>=20.0.0'} + + '@azure/core-http-compat@2.3.1': + resolution: {integrity: sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==} + engines: {node: '>=20.0.0'} + + '@azure/core-lro@2.7.2': + resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} + engines: {node: '>=18.0.0'} + + '@azure/core-paging@1.6.2': + resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} + engines: {node: '>=18.0.0'} + + '@azure/core-rest-pipeline@1.22.2': + resolution: {integrity: sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==} + engines: {node: '>=20.0.0'} + + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} + engines: {node: '>=20.0.0'} + + '@azure/identity@4.13.0': + resolution: {integrity: sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==} + engines: {node: '>=20.0.0'} + + '@azure/keyvault-common@2.0.0': + resolution: {integrity: sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==} + engines: {node: '>=18.0.0'} + + '@azure/keyvault-keys@4.10.0': + resolution: {integrity: sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==} + engines: {node: '>=18.0.0'} + + '@azure/logger@1.3.0': + resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} + engines: {node: '>=20.0.0'} + + '@azure/msal-browser@4.28.1': + resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@15.14.1': + resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@3.8.6': + resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} + engines: {node: '>=16'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -241,10 +312,17 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -497,6 +575,10 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@humanwhocodes/momoa@3.3.10': resolution: {integrity: sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==} engines: {node: '>=18'} @@ -663,6 +745,9 @@ packages: '@types/node': optional: true + '@journeyapps-labs/micro-codecs@1.0.1': + resolution: {integrity: sha512-Iy2sElOvk6C9NpzLHi0M2CYmVHVSRYK0y+BP/wRzaJ45z/3OUuXdwp9TqCEfVlqDIdDafoia7ES6X7oBWEBODw==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -673,6 +758,12 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-joda/core@5.7.0': + resolution: {integrity: sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==} + + '@js-sdsl/ordered-set@4.4.2': + resolution: {integrity: sha512-ieYQ8WlBPKYzEo81H3q0DFbd8WtFRXXABb4+vRCF0AO3WWtJZFxYvRGdipUXGrd6tlSySmqhcPuO3J6SCodCxg==} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -709,6 +800,90 @@ packages: peerDependencies: '@oclif/core': '>= 3.0.0' + '@opentelemetry/api-logs@0.203.0': + resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@2.0.1': + resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.5.0': + resolution: {integrity: sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0': + resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.203.0': + resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.203.0': + resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.203.0': + resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.0.1': + resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.5.0': + resolution: {integrity: sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.203.0': + resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.0.1': + resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.5.0': + resolution: {integrity: sha512-BeJLtU+f5Gf905cJX9vXFQorAr6TAfK3SPvTFqP+scfIpDQEJfRaGJWta7sJgP+m4dNtBf9y3yvBKVAZZtJQVA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.0.1': + resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.39.0': + resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + engines: {node: '>=14'} + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -721,6 +896,63 @@ packages: resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} + '@powersync/lib-services-framework@0.7.14': + resolution: {integrity: sha512-beQyt75NMkiRiZOqcLGuKnCnPzwe59hCO9GjUn8Ox70PQoXncIw/9W7A9OiECQkRnWKuzX5LVarUrMnm6GCh0A==} + + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types': + resolution: {directory: ../service/powersync-hosted/public-packages/types, type: directory} + + '@powersync/service-core@1.18.2': + resolution: {integrity: sha512-5ffw+V2KybJI0zDeLYSoOrhZNZRBldJfCysZ8Ht0kYwYwvRcdWH558K5YHqFYxao3yszTmOMLJuseUs4Aq5k7w==} + + '@powersync/service-errors@0.3.6': + resolution: {integrity: sha512-dLbh8E+VyaKiOSwoqeYledFq3Fiz90SOkTzi2Ej4Wo1L9jBcuT2TZDRMIw2bQc27UQ6iXAZp8pEvS8lhfx5gWw==} + + '@powersync/service-jsonbig@0.17.12': + resolution: {integrity: sha512-ilssJP6I+v8LfBCIwRJlKZhuxVT7pGhYg/B2+xsodVRRmTkyRDpmBpV+RlabksbtR1H0G3aXm5AtNYwmfblBkQ==} + + '@powersync/service-module-mssql@0.1.2': + resolution: {integrity: sha512-tMYOHtXdnwVs0hXgs9Rh+EYXI9QjjXguTOnX6LeEWxu+WayMOK5FhLUxbdAi5bMYV27Xu86jTofhkgdIbrn9Pg==} + + '@powersync/service-rsocket-router@0.2.11': + resolution: {integrity: sha512-ChnVdoXestJGLd6vfwITkMvYwmOyEnKyZmfQf1ByuyfRi3sM+FByy6QGTgcKx14GxCMEU0aanf0Q5zOPhAvp4Q==} + + '@powersync/service-sync-rules@0.29.10': + resolution: {integrity: sha512-z26aJVvTVeYhFuopItQEwU3snS0BfTrPRA6PWkpfgN6RAEOCzb0oj8L/D3RM4w0k6FqyxEQb7/TI11YAUv7Lrg==} + + '@powersync/service-types@0.13.3': + resolution: {integrity: sha512-4QLFpvuZlAo3aBBfBvN/K1r8cvY7iRm7H2USuGFBLATq8onL33njPpho/ps2sm4LxPhwlQcUU0ApywAHajhCzg==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.57.1': resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] @@ -1069,6 +1301,9 @@ packages: resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1084,10 +1319,16 @@ packages: peerDependencies: eslint: '>=9.0.0' + '@syncpoint/wkx@0.5.2': + resolution: {integrity: sha512-o3gaGp38Gg31Pl2jULfLmOpSEyg2gcgrccCZ5kdEjKwhjV+lC38s0p2fLpDijpoL6JsCYSmgNSJ6JJBuN67YDQ==} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tediousjs/connection-string@0.6.0': + resolution: {integrity: sha512-GxlsW354Vi6QqbUgdPyQVcQjI7cZBdGV5vOYVYuCVDTylx2wl3WHR2HlhcxxHTrMigbelpXsdcZso+66uxPfow==} + '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -1124,12 +1365,27 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node@13.13.52': + resolution: {integrity: sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==} + + '@types/node@15.14.9': + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + '@types/node@24.10.10': + resolution: {integrity: sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/readable-stream@4.0.23': + resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} @@ -1192,6 +1448,10 @@ packages: resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typespec/ts-http-runtime@0.3.2': + resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} + engines: {node: '>=20.0.0'} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -1287,9 +1547,23 @@ packages: cpu: [x64] os: [win32] + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.18': resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@4.0.18': resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: @@ -1301,21 +1575,40 @@ packages: vite: optional: true + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.18': resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.18': resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.18': resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.18': resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1330,9 +1623,16 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1391,6 +1691,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -1404,10 +1707,22 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.9.19: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + bl@6.1.6: + resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} + bowser@2.13.1: resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} @@ -1426,6 +1741,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1433,6 +1758,14 @@ packages: builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -1466,6 +1799,10 @@ packages: capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -1480,6 +1817,10 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1508,9 +1849,36 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -1534,6 +1902,10 @@ packages: core-js-compat@3.48.0: resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1541,6 +1913,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1574,9 +1950,29 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -1585,6 +1981,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -1601,6 +2001,9 @@ packages: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} + discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1608,10 +2011,17 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -1623,6 +2033,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + enhanced-resolve@5.18.4: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} @@ -1880,6 +2293,14 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -1896,6 +2317,9 @@ packages: fast-levenshtein@3.0.0: resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-parser@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true @@ -1913,6 +2337,13 @@ packages: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1942,6 +2373,9 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -1950,6 +2384,10 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -2098,14 +2536,25 @@ packages: resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} engines: {node: '>=8.0.0'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2144,6 +2593,10 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} + engines: {node: '>= 10'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2191,6 +2644,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2211,6 +2669,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2279,6 +2742,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2289,14 +2756,26 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + ix@5.0.0: + resolution: {integrity: sha512-6LyyrHnvNrSy5pKtW/KA+KKusHrB223aBJCJlIGPN7QBfDkEEtNrAkAz9lLLShIcdJntq6BiPCHuKaCM/9wwXw==} + jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} hasBin: true + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + js-md4@0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -2326,6 +2805,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2336,9 +2818,30 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2358,12 +2861,46 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lossless-json@2.0.11: + resolution: {integrity: sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2417,9 +2954,17 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mssql@12.2.0: + resolution: {integrity: sha512-lwwLHAqcWOz8okjboQpIEp5OghUFGJhuuQZS3+WF1ZXbaEaCEGKOfiQET3w/5Xz0tyZfDNCQVCm9wp5GwXut6g==} + engines: {node: '>=18'} + hasBin: true + mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2438,6 +2983,9 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true + native-duplexpair@1.0.0: + resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2445,9 +2993,26 @@ packages: resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} engines: {node: '>=18'} + nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -2544,6 +3109,10 @@ packages: - which - write-file-atomic + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -2583,6 +3152,13 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2664,6 +3240,13 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pgsql-ast-parser@11.2.0: + resolution: {integrity: sha512-/8KCcQjePoQDOtfZQuoV/4Y3WpmQVp7E+RFayAdjJpdBdu2dBnKnuQe9XU4g5Td5qC0G+i/fFK/DlNjvWwg+FA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2700,9 +3283,17 @@ packages: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2711,9 +3302,16 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + rambda@7.5.0: resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -2722,6 +3320,14 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -2750,6 +3356,10 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -2769,6 +3379,10 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -2778,6 +3392,13 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rsocket-core@1.0.0-alpha.3: + resolution: {integrity: sha512-BzIe2w8dFJlUS5N9fGUNRkxL19kd64bxbXsT11wj7isLfKkPZeNXisB2p/LWvSjFzWStnpOiScZ0g3/8ROE0pw==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -2793,6 +3414,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2894,9 +3519,15 @@ packages: spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2923,6 +3554,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2939,6 +3573,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} @@ -2958,12 +3595,26 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + + tedious@19.2.0: + resolution: {integrity: sha512-2dDjX0KP54riDvJPiiIozv0WRS/giJb3/JG2lWpa2dgM0Gha7mLAxbTR3ltPkGzfoS6M3oDnhYnWuzeaZibHuQ==} + engines: {node: '>=18.17'} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + tiny-jsonc@1.0.2: resolution: {integrity: sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw==} tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -2972,20 +3623,39 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + ts-codec@1.3.0: + resolution: {integrity: sha512-OOaGvS0UwjyOychFZwjqSm47K65lzTCSup47RDG30crZr2MGnQCHQ13duAI4OcnzuYITNN6JDdS8RrtB0g204Q==} + ts-declaration-location@1.0.7: resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: @@ -3069,6 +3739,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3091,6 +3764,17 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -3101,6 +3785,15 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3141,6 +3834,34 @@ packages: yaml: optional: true + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@4.0.18: resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3175,6 +3896,10 @@ packages: jsdom: optional: true + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3210,6 +3935,14 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3228,6 +3961,27 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yarn@1.22.22: resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} engines: {node: '>=4.0.0'} @@ -3245,6 +3999,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + snapshots: '@aws-crypto/crc32@5.2.0': @@ -3778,6 +4535,151 @@ snapshots: '@aws/lambda-invoke-store@0.2.3': {} + '@azure-rest/core-client@2.5.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@typespec/ts-http-runtime': 0.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-client@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-http-compat@2.3.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + transitivePeerDependencies: + - supports-color + + '@azure/core-lro@2.7.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-paging@1.6.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-rest-pipeline@1.22.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@typespec/ts-http-runtime': 0.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.3.1': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@typespec/ts-http-runtime': 0.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/identity@4.13.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@azure/msal-browser': 4.28.1 + '@azure/msal-node': 3.8.6 + open: 10.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-common@2.0.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-keys@4.10.0': + dependencies: + '@azure-rest/core-client': 2.5.1 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-http-compat': 2.3.1 + '@azure/core-lro': 2.7.2 + '@azure/core-paging': 1.6.2 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/keyvault-common': 2.0.0 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.3.0': + dependencies: + '@typespec/ts-http-runtime': 0.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/msal-browser@4.28.1': + dependencies: + '@azure/msal-common': 15.14.1 + + '@azure/msal-common@15.14.1': {} + + '@azure/msal-node@3.8.6': + dependencies: + '@azure/msal-common': 15.14.1 + jsonwebtoken: 9.0.3 + uuid: 8.3.2 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -3786,10 +4688,18 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} + '@colors/colors@1.6.0': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -3984,6 +4894,8 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/momoa@2.0.4': {} + '@humanwhocodes/momoa@3.3.10': {} '@humanwhocodes/retry@0.4.3': {} @@ -4154,6 +5066,32 @@ snapshots: optionalDependencies: '@types/node': 22.19.7 + '@journeyapps-labs/micro-codecs@1.0.1(yaml@2.8.2)': + dependencies: + '@types/node': 24.10.10 + bson: 6.10.4 + ts-codec: 1.3.0 + vitest: 3.2.4(@types/node@24.10.10)(yaml@2.8.2) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@vitest/browser' + - '@vitest/ui' + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -4163,6 +5101,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@js-joda/core@5.7.0': {} + + '@js-sdsl/ordered-set@4.4.2': {} + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -4243,6 +5185,95 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/api-logs@0.203.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.39.0 + + '@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.39.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + + '@opentelemetry/resources@2.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + + '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + + '@opentelemetry/semantic-conventions@1.39.0': {} + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -4255,6 +5286,162 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@powersync/lib-services-framework@0.7.14': + dependencies: + '@powersync/service-errors': 0.3.6 + '@powersync/service-sync-rules': 0.29.10 + ajv: 8.17.1 + better-ajv-errors: 1.2.0(ajv@8.17.1) + bson: 6.10.4 + dotenv: 16.6.1 + ipaddr.js: 2.3.0 + lodash: 4.17.23 + ts-codec: 1.3.0 + uuid: 11.1.0 + winston: 3.19.0 + zod: 3.25.76 + + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types(yaml@2.8.2)': + dependencies: + '@journeyapps-labs/micro-codecs': 1.0.1(yaml@2.8.2) + '@powersync/service-module-mssql': 0.1.2 + '@powersync/service-types': 0.13.3 + bson: 6.10.4 + ts-codec: 1.3.0 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@vitest/browser' + - '@vitest/ui' + - babel-plugin-macros + - bufferutil + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - utf-8-validate + - yaml + + '@powersync/service-core@1.18.2': + dependencies: + '@js-sdsl/ordered-set': 4.4.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.5.0(@opentelemetry/api@1.9.0) + '@powersync/lib-services-framework': 0.7.14 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-rsocket-router': 0.2.11 + '@powersync/service-sync-rules': 0.29.10 + '@powersync/service-types': 0.13.3 + async: 3.2.6 + async-mutex: 0.5.0 + bson: 6.10.4 + commander: 12.1.0 + cors: 2.8.6 + ipaddr.js: 2.3.0 + ix: 5.0.0 + jose: 4.15.9 + lodash: 4.17.23 + lru-cache: 10.4.3 + negotiator: 1.0.0 + node-fetch: 3.3.2 + ts-codec: 1.3.0 + uri-js: 4.4.1 + uuid: 11.1.0 + winston: 3.19.0 + yaml: 2.8.2 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - utf-8-validate + + '@powersync/service-errors@0.3.6': {} + + '@powersync/service-jsonbig@0.17.12': + dependencies: + lossless-json: 2.0.11 + + '@powersync/service-module-mssql@0.1.2': + dependencies: + '@powersync/lib-services-framework': 0.7.14 + '@powersync/service-core': 1.18.2 + '@powersync/service-errors': 0.3.6 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.29.10 + '@powersync/service-types': 0.13.3 + mssql: 12.2.0 + semver: 7.7.3 + ts-codec: 1.3.0 + uri-js: 4.4.1 + uuid: 11.1.0 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - supports-color + - utf-8-validate + + '@powersync/service-rsocket-router@0.2.11': + dependencies: + '@powersync/lib-services-framework': 0.7.14 + rsocket-core: 1.0.0-alpha.3 + ts-codec: 1.3.0 + uuid: 11.1.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@powersync/service-sync-rules@0.29.10': + dependencies: + '@powersync/service-jsonbig': 0.17.12 + '@syncpoint/wkx': 0.5.2 + ajv: 8.17.1 + pgsql-ast-parser: 11.2.0 + uuid: 11.1.0 + yaml: 2.8.2 + + '@powersync/service-types@0.13.3': + dependencies: + dedent: 1.7.1 + ts-codec: 1.3.0 + uri-js: 4.4.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true @@ -4672,6 +5859,11 @@ snapshots: dependencies: tslib: 2.8.1 + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@3.1.0(eslint@9.39.2)(typescript@5.9.3)': @@ -4696,10 +5888,16 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 + '@syncpoint/wkx@0.5.2': + dependencies: + '@types/node': 15.14.9 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 + '@tediousjs/connection-string@0.6.0': {} + '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -4732,12 +5930,26 @@ snapshots: dependencies: '@types/node': 22.19.7 + '@types/node@13.13.52': {} + + '@types/node@15.14.9': {} + '@types/node@22.19.7': dependencies: undici-types: 6.21.0 + '@types/node@24.10.10': + dependencies: + undici-types: 7.16.0 + '@types/normalize-package-data@2.4.4': {} + '@types/readable-stream@4.0.23': + dependencies: + '@types/node': 22.19.7 + + '@types/triple-beam@1.3.5': {} + '@types/wrap-ansi@3.0.0': {} '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': @@ -4831,6 +6043,14 @@ snapshots: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 + '@typespec/ts-http-runtime@0.3.2': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -4890,6 +6110,14 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + '@vitest/expect@4.0.18': dependencies: '@standard-schema/spec': 1.1.0 @@ -4899,36 +6127,74 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.19.7))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.7) + vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + '@vitest/runner@4.0.18': dependencies: '@vitest/utils': 4.0.18 pathe: 2.0.3 + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/snapshot@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + '@vitest/spy@4.0.18': {} + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@vitest/utils@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -4939,6 +6205,8 @@ snapshots: acorn@8.15.0: {} + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4946,6 +6214,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -5018,6 +6293,10 @@ snapshots: async-function@1.0.0: {} + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -5030,8 +6309,26 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + baseline-browser-mapping@2.9.19: {} + better-ajv-errors@1.2.0(ajv@8.17.1): + dependencies: + '@babel/code-frame': 7.29.0 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.17.1 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + bl@6.1.6: + dependencies: + '@types/readable-stream': 4.0.23 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.7.0 + bowser@2.13.1: {} brace-expansion@1.1.12: @@ -5055,12 +6352,27 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bson@6.10.4: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} builtins@5.1.0: dependencies: semver: 7.7.3 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + cac@6.7.14: {} + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -5105,6 +6417,14 @@ snapshots: tslib: 2.8.1 upper-case-first: 2.0.2 + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chai@6.2.2: {} chalk@4.1.2: @@ -5129,6 +6449,8 @@ snapshots: chardet@2.1.1: {} + check-error@2.1.3: {} + ci-info@3.9.0: {} ci-info@4.4.0: {} @@ -5149,8 +6471,29 @@ snapshots: dependencies: color-name: 1.1.4 + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + color-name@1.1.4: {} + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + commander@11.1.0: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + comment-parser@1.4.1: {} concat-map@0.0.1: {} @@ -5174,6 +6517,11 @@ snapshots: dependencies: browserslist: 4.28.1 + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + create-require@1.1.1: {} cross-spawn@7.0.6: @@ -5182,6 +6530,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + data-uri-to-buffer@4.0.1: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -5214,8 +6564,19 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@1.7.1: {} + + deep-eql@5.0.2: {} + deep-is@0.1.4: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -5224,6 +6585,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -5236,6 +6599,8 @@ snapshots: diff@4.0.4: {} + discontinuous-range@1.0.0: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -5245,12 +6610,18 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ejs@3.1.10: dependencies: jake: 10.9.4 @@ -5259,6 +6630,8 @@ snapshots: emoji-regex@8.0.0: {} + enabled@2.0.0: {} + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 @@ -5708,6 +7081,10 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + + events@3.3.0: {} + expect-type@1.3.0: {} fast-deep-equal@3.1.3: {} @@ -5720,6 +7097,8 @@ snapshots: dependencies: fastest-levenshtein: 1.0.16 + fast-uri@3.1.0: {} + fast-xml-parser@5.2.5: dependencies: strnum: 2.1.2 @@ -5730,6 +7109,13 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -5763,12 +7149,18 @@ snapshots: flatted@3.3.3: {} + fn.name@1.1.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 form-data-encoder@2.1.4: {} + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -5929,15 +7321,31 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -5968,6 +7376,8 @@ snapshots: interpret@1.4.0: {} + ipaddr.js@2.3.0: {} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -6020,6 +7430,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -6040,6 +7452,10 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -6100,20 +7516,35 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@2.0.5: {} isexe@2.0.0: {} isexe@3.1.1: {} + ix@5.0.0: + dependencies: + '@types/node': 13.13.52 + tslib: 2.8.1 + jake@10.9.4: dependencies: async: 3.2.6 filelist: 1.0.4 picocolors: 1.1.1 + jose@4.15.9: {} + + js-md4@0.3.2: {} + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -6132,6 +7563,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -6142,10 +7575,40 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.3 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + kuler@2.0.0: {} + + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6163,10 +7626,39 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash@4.17.23: {} + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + long@5.3.2: {} + + lossless-json@2.0.11: {} + + loupe@3.2.1: {} + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -6210,8 +7702,20 @@ snapshots: minimist@1.2.8: {} + moo@0.5.2: {} + ms@2.1.3: {} + mssql@12.2.0: + dependencies: + '@tediousjs/connection-string': 0.6.0 + commander: 11.1.0 + debug: 4.4.3(supports-color@8.1.1) + tarn: 3.0.2 + tedious: 19.2.0 + transitivePeerDependencies: + - supports-color + mute-stream@1.0.0: {} mute-stream@2.0.0: {} @@ -6220,15 +7724,34 @@ snapshots: napi-postinstall@0.3.4: {} + native-duplexpair@1.0.0: {} + natural-compare@1.4.0: {} natural-orderby@5.0.0: {} + nearley@2.20.1: + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + + negotiator@1.0.0: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.8.1 + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-releases@2.0.27: {} normalize-package-data@2.5.0: @@ -6259,6 +7782,8 @@ snapshots: npm@10.9.4: {} + object-assign@4.1.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -6331,6 +7856,17 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6415,6 +7951,13 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + + pgsql-ast-parser@11.2.0: + dependencies: + moo: 0.5.2 + nearley: 2.20.1 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -6437,14 +7980,38 @@ snapshots: proc-log@4.2.0: {} + process@0.11.10: {} + proto-list@1.2.4: {} + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.19.7 + long: 5.3.2 + punycode@2.3.1: {} quick-lru@5.1.1: {} + railroad-diagrams@1.0.0: {} + rambda@7.5.0: {} + randexp@0.4.6: + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -6458,6 +8025,20 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + rechoir@0.6.2: dependencies: resolve: 1.22.11 @@ -6494,6 +8075,8 @@ snapshots: dependencies: jsesc: 0.5.0 + require-from-string@2.0.2: {} + resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} @@ -6510,6 +8093,8 @@ snapshots: dependencies: lowercase-keys: 3.0.0 + ret@0.1.15: {} + retry@0.13.1: {} rollup@4.57.1: @@ -6543,6 +8128,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + rsocket-core@1.0.0-alpha.3: {} + + run-applescript@7.1.0: {} + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -6564,6 +8153,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} semver@5.7.2: {} @@ -6688,8 +8279,12 @@ snapshots: spdx-license-ids@3.0.22: {} + sprintf-js@1.1.3: {} + stable-hash@0.0.5: {} + stack-trace@0.0.10: {} + stackback@0.0.2: {} std-env@3.10.0: {} @@ -6728,6 +8323,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -6740,6 +8339,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + strnum@2.1.2: {} supports-color@7.2.0: @@ -6754,10 +8357,31 @@ snapshots: tapable@2.3.0: {} + tarn@3.0.2: {} + + tedious@19.2.0: + dependencies: + '@azure/core-auth': 1.10.1 + '@azure/identity': 4.13.0 + '@azure/keyvault-keys': 4.10.0 + '@js-joda/core': 5.7.0 + '@types/node': 22.19.7 + bl: 6.1.6 + iconv-lite: 0.7.2 + js-md4: 0.3.2 + native-duplexpair: 1.0.0 + sprintf-js: 1.1.3 + transitivePeerDependencies: + - supports-color + + text-hex@1.0.0: {} + tiny-jsonc@1.0.2: {} tinybench@2.9.0: {} + tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -6765,16 +8389,26 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.4: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + triple-beam@1.4.1: {} + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 + ts-codec@1.3.0: {} + ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.3 @@ -6878,6 +8512,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + universalify@0.1.2: {} unrs-resolver@1.11.1: @@ -6922,6 +8558,12 @@ snapshots: dependencies: punycode: 2.3.1 + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + uuid@8.3.2: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -6931,7 +8573,30 @@ snapshots: validate-npm-package-name@5.0.1: {} - vite@7.3.1(@types/node@22.19.7): + vary@1.1.2: {} + + vite-node@3.2.4(@types/node@24.10.10)(yaml@2.8.2): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@8.1.1) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.1(@types/node@24.10.10)(yaml@2.8.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.1(@types/node@22.19.7)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -6942,11 +8607,66 @@ snapshots: optionalDependencies: '@types/node': 22.19.7 fsevents: 2.3.3 + yaml: 2.8.2 + + vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.10 + fsevents: 2.3.3 + yaml: 2.8.2 + + vitest@3.2.4(@types/node@24.10.10)(yaml@2.8.2): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3(supports-color@8.1.1) + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.10.10)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.10 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vitest@4.0.18(@types/node@22.19.7): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.19.7)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -6963,9 +8683,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@22.19.7) + vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/node': 22.19.7 transitivePeerDependencies: - jiti @@ -6980,6 +8701,8 @@ snapshots: - tsx - yaml + web-streams-polyfill@3.3.3: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -7038,6 +8761,26 @@ snapshots: dependencies: string-width: 4.2.3 + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -7056,6 +8799,14 @@ snapshots: wrappy@1.0.2: {} + ws@8.19.0: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + yaml@2.8.2: {} + yarn@1.22.22: {} yn@3.1.1: {} @@ -7063,3 +8814,5 @@ snapshots: yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {} + + zod@3.25.76: {} From 73763b2f4fd00e5c80d3c0db0544e20502be2feb Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Tue, 3 Feb 2026 17:06:07 +0200 Subject: [PATCH 003/141] Schema packages. Improve templates. WIP link commands. --- .envrc | 3 + packages/cli/README.md | 65 ++--- packages/cli/eslint.config.mjs | 13 +- packages/cli/package.json | 12 +- packages/cli/src/commands/init.ts | 69 ++++- packages/cli/src/commands/link.ts | 11 - packages/cli/src/commands/link/cloud.ts | 52 ++++ packages/cli/src/commands/link/index.ts | 13 + packages/cli/src/commands/link/self-hosted.ts | 47 ++++ packages/cli/src/utils/flags.ts | 12 + .../cli/templates/cloud/powersync/link.yaml | 6 + .../templates/cloud/powersync/service.yaml | 186 ++++++------- .../cli/templates/cloud/powersync/sync.yaml | 12 +- .../self-hosted/base/powersync/link.yaml | 6 + .../self-hosted/base/powersync/service.yaml | 202 +++++++------- .../self-hosted/base/powersync/sync.yaml | 12 +- packages/cli/test/commands/init.test.ts | 97 ++++++- packages/cli/test/commands/login.test.ts | 1 + packages/cli/test/setup.ts | 1 + packages/cli/tsconfig.tsbuildinfo | 2 +- packages/cli/vitest.config.ts | 10 +- packages/schemas/.gitignore | 2 + packages/schemas/json-schema/link-config.json | 42 +++ packages/schemas/package.json | 28 ++ packages/schemas/scripts/create-schemas.ts | 13 + packages/schemas/src/LinkConfig.ts | 34 +++ packages/schemas/src/index.ts | 2 + packages/schemas/tsconfig.json | 13 + packages/schemas/tsconfig.tsbuildinfo | 1 + pnpm-lock.yaml | 249 +++++++++++------- 30 files changed, 847 insertions(+), 369 deletions(-) create mode 100644 .envrc delete mode 100644 packages/cli/src/commands/link.ts create mode 100644 packages/cli/src/commands/link/cloud.ts create mode 100644 packages/cli/src/commands/link/index.ts create mode 100644 packages/cli/src/commands/link/self-hosted.ts create mode 100644 packages/cli/src/utils/flags.ts create mode 100644 packages/cli/templates/cloud/powersync/link.yaml create mode 100644 packages/cli/templates/self-hosted/base/powersync/link.yaml create mode 100644 packages/schemas/.gitignore create mode 100644 packages/schemas/json-schema/link-config.json create mode 100644 packages/schemas/package.json create mode 100644 packages/schemas/scripts/create-schemas.ts create mode 100644 packages/schemas/src/LinkConfig.ts create mode 100644 packages/schemas/src/index.ts create mode 100644 packages/schemas/tsconfig.json create mode 100644 packages/schemas/tsconfig.tsbuildinfo diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..013a35c --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +layout node +use node +[ -f .env ] && dotenv \ No newline at end of file diff --git a/packages/cli/README.md b/packages/cli/README.md index 6700b48..eac3402 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -7,14 +7,16 @@ CLI for PowerSync [![Downloads/week](https://img.shields.io/npm/dw/@powersync/cli.svg)](https://npmjs.org/package/@powersync/cli) -* [@powersync/cli](#powersynccli) -* [Usage](#usage) -* [Commands](#commands) + +- [@powersync/cli](#powersynccli) +- [Usage](#usage) +- [Commands](#commands) # Usage + ```sh-session $ npm install -g @powersync/cli $ powersync COMMAND @@ -26,37 +28,39 @@ USAGE $ powersync COMMAND ... ``` + # Commands -* [`powersync deploy`](#powersync-deploy) -* [`powersync destroy`](#powersync-destroy) -* [`powersync fetch`](#powersync-fetch) -* [`powersync fetch config`](#powersync-fetch-config) -* [`powersync fetch instances`](#powersync-fetch-instances) -* [`powersync fetch status`](#powersync-fetch-status) -* [`powersync generate`](#powersync-generate) -* [`powersync generate schema`](#powersync-generate-schema) -* [`powersync generate token`](#powersync-generate-token) -* [`powersync help [COMMAND]`](#powersync-help-command) -* [`powersync init`](#powersync-init) -* [`powersync link`](#powersync-link) -* [`powersync login`](#powersync-login) -* [`powersync migrate`](#powersync-migrate) -* [`powersync plugins`](#powersync-plugins) -* [`powersync plugins add PLUGIN`](#powersync-plugins-add-plugin) -* [`powersync plugins:inspect PLUGIN...`](#powersync-pluginsinspect-plugin) -* [`powersync plugins install PLUGIN`](#powersync-plugins-install-plugin) -* [`powersync plugins link PATH`](#powersync-plugins-link-path) -* [`powersync plugins remove [PLUGIN]`](#powersync-plugins-remove-plugin) -* [`powersync plugins reset`](#powersync-plugins-reset) -* [`powersync plugins uninstall [PLUGIN]`](#powersync-plugins-uninstall-plugin) -* [`powersync plugins unlink [PLUGIN]`](#powersync-plugins-unlink-plugin) -* [`powersync plugins update`](#powersync-plugins-update) -* [`powersync stop`](#powersync-stop) -* [`powersync validate`](#powersync-validate) + +- [`powersync deploy`](#powersync-deploy) +- [`powersync destroy`](#powersync-destroy) +- [`powersync fetch`](#powersync-fetch) +- [`powersync fetch config`](#powersync-fetch-config) +- [`powersync fetch instances`](#powersync-fetch-instances) +- [`powersync fetch status`](#powersync-fetch-status) +- [`powersync generate`](#powersync-generate) +- [`powersync generate schema`](#powersync-generate-schema) +- [`powersync generate token`](#powersync-generate-token) +- [`powersync help [COMMAND]`](#powersync-help-command) +- [`powersync init`](#powersync-init) +- [`powersync link`](#powersync-link) +- [`powersync login`](#powersync-login) +- [`powersync migrate`](#powersync-migrate) +- [`powersync plugins`](#powersync-plugins) +- [`powersync plugins add PLUGIN`](#powersync-plugins-add-plugin) +- [`powersync plugins:inspect PLUGIN...`](#powersync-pluginsinspect-plugin) +- [`powersync plugins install PLUGIN`](#powersync-plugins-install-plugin) +- [`powersync plugins link PATH`](#powersync-plugins-link-path) +- [`powersync plugins remove [PLUGIN]`](#powersync-plugins-remove-plugin) +- [`powersync plugins reset`](#powersync-plugins-reset) +- [`powersync plugins uninstall [PLUGIN]`](#powersync-plugins-uninstall-plugin) +- [`powersync plugins unlink [PLUGIN]`](#powersync-plugins-unlink-plugin) +- [`powersync plugins update`](#powersync-plugins-update) +- [`powersync stop`](#powersync-stop) +- [`powersync validate`](#powersync-validate) ## `powersync deploy` @@ -251,7 +255,7 @@ USAGE DESCRIPTION Link configuration to a PowerSync instance. - Associates a cloud instance (or self-hosted) with this directory's config. Optional instance ID, org_id, app_id. + Associates a cloud instance (or self-hosted) with this directory's config. Optional instance ID, org_id, project_id. ``` _See code: [src/commands/link.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/link.ts)_ @@ -609,4 +613,5 @@ DESCRIPTION ``` _See code: [src/commands/validate.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/validate.ts)_ + diff --git a/packages/cli/eslint.config.mjs b/packages/cli/eslint.config.mjs index da9dabf..0bc4ebb 100644 --- a/packages/cli/eslint.config.mjs +++ b/packages/cli/eslint.config.mjs @@ -7,4 +7,15 @@ import { fileURLToPath } from 'node:url'; const gitignorePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '.gitignore'); const rootGitignorePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../.gitignore'); -export default [includeIgnoreFile(gitignorePath), includeIgnoreFile(rootGitignorePath), ...oclif, prettier]; +export default [ + includeIgnoreFile(gitignorePath), + includeIgnoreFile(rootGitignorePath), + ...oclif, + prettier, + { + rules: { + // fs.cp/cpSync available since Node 16.7.0; engine is >=18 + 'n/no-unsupported-features/node-builtins': 'off' + } + } +]; diff --git a/packages/cli/package.json b/packages/cli/package.json index f224a1a..b1a205e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -11,21 +11,23 @@ "@oclif/core": "^4", "@oclif/plugin-help": "^6", "@oclif/plugin-plugins": "^5", - "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types" + "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types", + "ts-codec": "^1.3.0", + "yaml": "^2" }, "devDependencies": { "@eslint/compat": "^1", "@oclif/prettier-config": "^0.2.1", "@oclif/test": "^4", - "@types/node": "^22", + "@types/node": "^18", "eslint": "^9", "eslint-config-oclif": "^6", "eslint-config-prettier": "^10", - "vitest": "^4.0.0", "oclif": "^4", "shx": "^0.3.3", "ts-node": "^10", - "typescript": "^5" + "typescript": "^5", + "vitest": "^4.0.0" }, "engines": { "node": ">=18.0.0" @@ -33,6 +35,7 @@ "files": [ "./bin", "./dist", + "./templates", "./oclif.manifest.json" ], "homepage": "https://github.com/powersync-ja/cli", @@ -63,6 +66,7 @@ "lint": "eslint", "postpack": "shx rm -f oclif.manifest.json", "posttest": "pnpm run lint", + "pretest": "pnpm run build", "prepack": "oclif manifest && oclif readme", "test": "vitest", "version": "oclif readme && git add README.md" diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 25ae25a..6c7a8e5 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -1,11 +1,72 @@ -import {Command} from '@oclif/core' +import { Command, Flags } from '@oclif/core'; +import { cpSync, existsSync, mkdirSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { commonFlags } from '../utils/flags.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +/** Absolute path to templates (package root when running from dist/commands/ or src/commands/). */ +const TEMPLATES_DIR = join(__dirname, '..', '..', 'templates'); export default class Init extends Command { static description = - 'Creates a PowerSync project (e.g. powersync folder with service.yaml and sync-streams.yaml). Supports --type=cloud or self-hosted.' - static summary = 'Create a new PowerSync project.' + 'Creates a new PowerSync project in the current directory. Supports --type=cloud or self-hosted.'; + static flags = { + ...commonFlags, + type: Flags.string({ + default: 'cloud', + description: 'Type of PowerSync instance to scaffold.', + options: ['cloud', 'self-hosted'] + }) + }; + static summary = 'Create a new PowerSync project.'; async run(): Promise { - this.log('init: not yet implemented') + const { flags } = await this.parse(Init); + const { directory, type } = flags; + + const cwd = process.cwd(); + const targetDir = join(cwd, directory); + + if (existsSync(targetDir)) { + this.error( + `Directory "${directory}" already exists. Delete the folder to start over, or link existing config to PowerSync Cloud with \`powersync link\`.`, + { exit: 1 } + ); + } + + const templateSubdir = type === 'cloud' ? 'cloud' : 'self-hosted/base'; + const templatePath = join(TEMPLATES_DIR, templateSubdir, 'powersync'); + + if (!existsSync(templatePath)) { + this.error(`Template not found for type "${type}" at ${templatePath}`, { + exit: 1 + }); + } + + mkdirSync(targetDir, { recursive: true }); + cpSync(templatePath, targetDir, { recursive: true }); + + const cloudInstructions = `To deploy to PowerSync Cloud, run: +powersync link +powersync deploy + `.trim(); + + const selfHostedInstructions = + `Self Hosted projects currently require external configuration for starting and deploying. +Please refer to the PowerSync Self-Hosted documentation for more information. + `.trim(); + + const instructions = type === 'cloud' ? cloudInstructions : selfHostedInstructions; + this.log( + `Created PowerSync ${type} project! +Configuration files are located in: +${targetDir} + +${instructions} + `.trim() + ); } } diff --git a/packages/cli/src/commands/link.ts b/packages/cli/src/commands/link.ts deleted file mode 100644 index 9f0974e..0000000 --- a/packages/cli/src/commands/link.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {Command} from '@oclif/core' - -export default class Link extends Command { - static description = - "Associates a cloud instance (or self-hosted) with this directory's config. Optional instance ID, org_id, app_id." - static summary = 'Link configuration to a PowerSync instance.' - - async run(): Promise { - this.log('link: not yet implemented') - } -} diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts new file mode 100644 index 0000000..5d74e7e --- /dev/null +++ b/packages/cli/src/commands/link/cloud.ts @@ -0,0 +1,52 @@ +import { Command, Flags } from '@oclif/core'; +import { existsSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { stringify as stringifyYaml } from 'yaml'; + +import { commonFlags } from '../../utils/flags.js'; + +const LINK_FILENAME = 'link.yaml'; + +export default class LinkCloud extends Command { + static description = 'Link this directory to a PowerSync Cloud instance.'; + static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; + static enableStrictArgs = true; + + static flags = { + ...commonFlags, + 'instance-id': Flags.string({ + description: 'PowerSync Cloud instance ID.', + required: true + }), + 'org-id': Flags.string({ + description: 'Organization ID.', + required: true + }), + 'project-id': Flags.string({ + description: 'Project ID.', + required: true + }) + }; + + async run(): Promise { + const { flags } = await this.parse(LinkCloud); + const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; + + const projectDir = join(process.cwd(), directory); + if (!existsSync(projectDir)) { + this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { + exit: 1 + }); + } + + const linkPath = join(projectDir, LINK_FILENAME); + const config = { + type: 'cloud' as const, + instance_id: instanceId, + org_id: orgId, + project_id: projectId + }; + writeFileSync(linkPath, stringifyYaml(config), 'utf8'); + this.log(`Updated ${directory}/${LINK_FILENAME} with Cloud instance link.`); + } +} diff --git a/packages/cli/src/commands/link/index.ts b/packages/cli/src/commands/link/index.ts new file mode 100644 index 0000000..4f4c45d --- /dev/null +++ b/packages/cli/src/commands/link/index.ts @@ -0,0 +1,13 @@ +import { Command } from '@oclif/core'; + +export default class Link extends Command { + static description = + "Associates a PowerSync instance with this directory's config. Use a subcommand for cloud or self-hosted."; + static summary = 'Link configuration to a PowerSync instance.'; + static enableStrictArgs = true; + + async run(): Promise { + await this.parse(Link); + this.log('Use a subcommand: link cloud | link self-hosted'); + } +} diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts new file mode 100644 index 0000000..4d0c02e --- /dev/null +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -0,0 +1,47 @@ +import { Command, Flags } from '@oclif/core'; +import { existsSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { stringify as stringifyYaml } from 'yaml'; + +import { commonFlags } from '../../utils/flags.js'; + +const LINK_FILENAME = 'link.yaml'; + +export default class LinkSelfHosted extends Command { + static description = 'Link this directory to a self-hosted PowerSync instance.'; + static summary = 'Link to self-hosted PowerSync (API URL and token).'; + static enableStrictArgs = true; + + static flags = { + ...commonFlags, + url: Flags.string({ + description: 'Self-hosted PowerSync API base URL (e.g. https://powersync.example.com).', + required: true + }), + 'api-key': Flags.string({ + description: 'API key / token for the self-hosted instance.', + required: true + }) + }; + + async run(): Promise { + const { flags } = await this.parse(LinkSelfHosted); + const { directory, url, 'api-key': apiKey } = flags; + + const projectDir = join(process.cwd(), directory); + if (!existsSync(projectDir)) { + this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { + exit: 1 + }); + } + + const linkPath = join(projectDir, LINK_FILENAME); + const config = { + type: 'self-hosted' as const, + api_url: url, + api_key: apiKey + }; + writeFileSync(linkPath, stringifyYaml(config), 'utf8'); + this.log(`Updated ${directory}/${LINK_FILENAME} with self-hosted link.`); + } +} diff --git a/packages/cli/src/utils/flags.ts b/packages/cli/src/utils/flags.ts new file mode 100644 index 0000000..b83a14c --- /dev/null +++ b/packages/cli/src/utils/flags.ts @@ -0,0 +1,12 @@ +import { Flags } from '@oclif/core'; + +/** Directory containing PowerSync config (default: powersync). Used by init and link. */ +export const directoryFlag = Flags.string({ + default: 'powersync', + description: 'Directory containing PowerSync config (default: powersync).' +}); + +/** Shared flags for commands that target a PowerSync project directory. */ +export const commonFlags = { + directory: directoryFlag +}; diff --git a/packages/cli/templates/cloud/powersync/link.yaml b/packages/cli/templates/cloud/powersync/link.yaml new file mode 100644 index 0000000..c42320c --- /dev/null +++ b/packages/cli/templates/cloud/powersync/link.yaml @@ -0,0 +1,6 @@ +# TODO update this with published schema +# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/new-cli/packages/schemas/json-schema/link-config.json + +# This file is managed by the PowerSync CLI. +# Run \`powersync link --help\` for more information. +type: cloud diff --git a/packages/cli/templates/cloud/powersync/service.yaml b/packages/cli/templates/cloud/powersync/service.yaml index f6f9f3e..7b61df7 100644 --- a/packages/cli/templates/cloud/powersync/service.yaml +++ b/packages/cli/templates/cloud/powersync/service.yaml @@ -15,136 +15,136 @@ region: us # replication: database connections for sync # Note: only a single connection is currently supported -replication: - connections: - # ------------------------------------------------------------------------- - # PostgreSQL – uncomment this entire block to use - # ------------------------------------------------------------------------- - # - type: postgresql - # hostname: example.com - # database: one - # username: postgres - # password: - # secret: !env POWERSYNC_DATABASE_PASSWORD - # port: 5432 - # name: string - # id: string - # tag: string - # uri: string - # Options: verify-full | verify-ca - # sslmode: verify-full - # cacert: string - # client_certificate: string - # client_private_key: - # secret: !env POWERSYNC_DATABASE_CLIENT_KEY - # vpc_endpoint_hostname: string - # debug_api: boolean +# replication: +# connections: +# ------------------------------------------------------------------------- +# PostgreSQL – uncomment this entire block to use +# ------------------------------------------------------------------------- +# - type: postgresql +# hostname: example.com +# database: one +# username: postgres +# password: +# secret: !env POWERSYNC_DATABASE_PASSWORD +# port: 5432 +# name: string +# id: string +# tag: string +# uri: string +# Options: verify-full | verify-ca +# sslmode: verify-full +# cacert: string +# client_certificate: string +# client_private_key: +# secret: !env POWERSYNC_DATABASE_CLIENT_KEY +# vpc_endpoint_hostname: string +# debug_api: boolean - # ------------------------------------------------------------------------- - # MongoDB – uncomment this entire block to use (comment out PostgreSQL above) - # ------------------------------------------------------------------------- - # - type: mongodb - # uri: mongodb+srv://user:pass@host/db - # name: string - # id: string - # tag: string - # username: string - # password: - # secret: !env POWERSYNC_MONGODB_PASSWORD - # database: string - # # Options: off | auto_configure | read_only - # post_images: off - # vpc_endpoint_hostname: string +# ------------------------------------------------------------------------- +# MongoDB – uncomment this entire block to use (comment out PostgreSQL above) +# ------------------------------------------------------------------------- +# - type: mongodb +# uri: mongodb+srv://user:pass@host/db +# name: string +# id: string +# tag: string +# username: string +# password: +# secret: !env POWERSYNC_MONGODB_PASSWORD +# database: string +# Options: off | auto_configure | read_only +# post_images: off +# vpc_endpoint_hostname: string - # ------------------------------------------------------------------------- - # MySQL – uncomment this entire block to use (comment out PostgreSQL above) - # ------------------------------------------------------------------------- - # - type: mysql - # hostname: db.example.com - # port: 3306 - # database: mydb - # username: sync - # password: - # secret: !env POWERSYNC_MYSQL_PASSWORD - # name: string - # id: string - # tag: string - # uri: string - # client_certificate: string - # client_private_key: - # secret: !env POWERSYNC_MYSQL_CLIENT_KEY - # debug_api: false +# ------------------------------------------------------------------------- +# MySQL – uncomment this entire block to use (comment out PostgreSQL above) +# ------------------------------------------------------------------------- +# - type: mysql +# hostname: db.example.com +# port: 3306 +# database: mydb +# username: sync +# password: +# secret: !env POWERSYNC_MYSQL_PASSWORD +# name: string +# id: string +# tag: string +# uri: string +# client_certificate: string +# client_private_key: +# secret: !env POWERSYNC_MYSQL_CLIENT_KEY +# debug_api: false - # ------------------------------------------------------------------------- - # MSSQL – uncomment this entire block to use (comment out PostgreSQL above) - # ------------------------------------------------------------------------- - # - type: mssql - # hostname: sql.example.com - # port: 1433 - # database: mydb - # schema: dbo - # username: sync - # password: - # secret: !env POWERSYNC_MSSQL_PASSWORD - # name: string - # id: string - # tag: string - # uri: string - # # Options: default | azure-active-directory-password | azure-active-directory-service-principal-secret - # authentication: - # type: default - # options: - # password: - # secret: !env POWERSYNC_MSSQL_PASSWORD - # additionalConfig: - # pollingIntervalMs: 5000 - # pollingBatchSize: 1000 - # trustServerCertificate: false - # debug_api: false +# ------------------------------------------------------------------------- +# MSSQL – uncomment this entire block to use (comment out PostgreSQL above) +# ------------------------------------------------------------------------- +# - type: mssql +# hostname: sql.example.com +# port: 1433 +# database: mydb +# schema: dbo +# username: sync +# password: +# secret: !env POWERSYNC_MSSQL_PASSWORD +# name: string +# id: string +# tag: string +# uri: string +# Options: default | azure-active-directory-password | azure-active-directory-service-principal-secret +# authentication: +# type: default +# options: +# password: +# secret: !env POWERSYNC_MSSQL_PASSWORD +# additionalConfig: +# pollingIntervalMs: 5000 +# pollingBatchSize: 1000 +# trustServerCertificate: false +# debug_api: false # ----------------------------------------------------------------------------- # CLIENT AUTH (optional) – uncomment this entire block to enable # ----------------------------------------------------------------------------- # client_auth: -# # PowerSync will use the same JWT secret as Supabase. +# PowerSync will use the same JWT secret as Supabase. # supabase: false -# # Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. +# Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. # supabase_jwt_secret: # secret: !env POWERSYNC_SUPABASE_JWT_SECRET -# # Additional audiences to accept when validating incoming JWT tokens (the instance domain is always accepted) +# Additional audiences to accept when validating incoming JWT tokens (the instance domain is always accepted) # additional_audiences: [] -# # Enables development tokens to be generated and accepted by the instance +# Enables development tokens to be generated and accepted by the instance # allow_temporary_tokens: false -# # URL to a JSON Web Key Set (JWKS) endpoint; the instance fetches public keys from this URL to verify JWT signatures from clients. +# URL to a JSON Web Key Set (JWKS) endpoint; the instance fetches public keys from this URL to verify JWT signatures from clients. # jwks_uri: https://example.com/jwks.json -# # Inline JSON Web Key Set; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. +# Inline JSON Web Key Set; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. # jwks: # keys: -# # HMAC (symmetric) – Options: HS256 | HS384 | HS512 +# HMAC (symmetric) – Options: HS256 | HS384 | HS512 # - kty: oct # alg: HS256 # kid: example-key # k: # secret: !env POWERSYNC_CLIENT_AUTH_KEY -# # RSA – Options for alg: RS256 | RS384 | RS512 +# RSA – Options for alg: RS256 | RS384 | RS512 # - kty: RSA # kid: my-rsa-key # n: "" # e: "" # alg: RS256 -# # EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 +# EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 # - kty: EC # kid: my-ec-key # crv: P-256 # x: "" # y: "" # alg: ES256 -# # OKP (EdDSA) – Options for crv: Ed25519 | Ed448 +# OKP (EdDSA) – Options for crv: Ed25519 | Ed448 # - kty: OKP # kid: my-okp-key # crv: Ed25519 diff --git a/packages/cli/templates/cloud/powersync/sync.yaml b/packages/cli/templates/cloud/powersync/sync.yaml index 3e7b524..2bf1d29 100644 --- a/packages/cli/templates/cloud/powersync/sync.yaml +++ b/packages/cli/templates/cloud/powersync/sync.yaml @@ -11,16 +11,16 @@ config: # Docs: https://docs.powersync.com/usage/sync-rules bucket_definitions: global: - # Sync rules without parameter queries will sync to all users +# Sync rules without parameter queries will sync to all users data: - # Sync all rows +# Sync all rows - SELECT * FROM mytable - # Only sync some rows +# Only sync some rows - SELECT * FROM mytable WHERE mycolumn = false - # Wildcards can be used, useful in development to quickly sync all tables - #- SELECT * FROM "%" +# Wildcards can be used, useful in development to quickly sync all tables +# - SELECT * FROM "%" by_user: - # Only sync rows belonging to the user, using fields from the auth token +# Only sync rows belonging to the user, using fields from the auth token parameters: SELECT request.user_id() as user_id data: - SELECT * FROM mytable WHERE mytable.user_id = bucket.user_id diff --git a/packages/cli/templates/self-hosted/base/powersync/link.yaml b/packages/cli/templates/self-hosted/base/powersync/link.yaml new file mode 100644 index 0000000..4030fba --- /dev/null +++ b/packages/cli/templates/self-hosted/base/powersync/link.yaml @@ -0,0 +1,6 @@ +# TODO update this with published schema +# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/new-cli/packages/schemas/json-schema/link-config.json + +# This file is managed by the PowerSync CLI. +# Run \`powersync link --help\` for more information. +type: self-hosted diff --git a/packages/cli/templates/self-hosted/base/powersync/service.yaml b/packages/cli/templates/self-hosted/base/powersync/service.yaml index db6a5cb..5a7c136 100644 --- a/packages/cli/templates/self-hosted/base/powersync/service.yaml +++ b/packages/cli/templates/self-hosted/base/powersync/service.yaml @@ -9,75 +9,75 @@ # ----------------------------------------------------------------------------- # See https://docs.powersync.com/self-hosting/telemetry telemetry: - # When true, disables sharing of anonymized telemetry data +# When true, disables sharing of anonymized telemetry data disable_telemetry_sharing: false - # Port on which Prometheus metrics will be exposed. When set, metrics will be available on this port for scraping. +# Port on which Prometheus metrics will be exposed. When set, metrics will be available on this port for scraping. # ----------------------------------------------------------------------------- # REPLICATION – configuration for data replication; array of data source connections # ----------------------------------------------------------------------------- -replication: - connections: - # ------------------------------------------------------------------------- - # PostgreSQL – uncomment this entire block to use - # ------------------------------------------------------------------------- - # - type: postgresql - # uri: !env PS_DATA_SOURCE_URI - # # Unique identifier for the connection. Optional when only a single connection is present. - # # id: string - # # Additional meta tag for the connection, used for categorization or grouping. - # # tag: string - # # hostname: string - # # port: number | string - # # username: string - # # password: !env PS_DATABASE_PASSWORD - # # database: string - # # Options: verify-full | verify-ca | disable - # sslmode: disable - # # cacert: string - # # client_certificate: string - # # client_private_key: string - # # tls_servername: string - # # reject_ip_ranges: [ string ] - # # slot_name_prefix: string - # # max_pool_size: number - # # When enabled, allows query execution. - # # debug_api: boolean +# replication: +# connections: +# ------------------------------------------------------------------------- +# PostgreSQL – uncomment this entire block to use +# ------------------------------------------------------------------------- +# - type: postgresql +# uri: !env PS_DATA_SOURCE_URI +# Unique identifier for the connection. Optional when only a single connection is present. +# id: string +# Additional meta tag for the connection, used for categorization or grouping. +# tag: string +# hostname: string +# port: number | string +# username: string +# password: !env PS_DATABASE_PASSWORD +# database: string +# Options: verify-full | verify-ca | disable +# sslmode: disable +# cacert: string +# client_certificate: string +# client_private_key: string +# tls_servername: string +# reject_ip_ranges: [ string ] +# slot_name_prefix: string +# max_pool_size: number +# When enabled, allows query execution. +# debug_api: boolean - # ------------------------------------------------------------------------- - # MongoDB – uncomment this entire block to use (comment out PostgreSQL above) - # ------------------------------------------------------------------------- - # - type: mongodb - # uri: !env PS_MONGODB_URI - # database: string - # username: string - # password: !env PS_MONGODB_PASSWORD - # id: string - # tag: string - # reject_ip_ranges: [] - # # Options: off | auto_configure | read_only - # post_images: off - # debug_api: false +# ------------------------------------------------------------------------- +# MongoDB – uncomment this entire block to use (comment out PostgreSQL above) +# ------------------------------------------------------------------------- +# - type: mongodb +# uri: !env PS_MONGODB_URI +# database: string +# username: string +# password: !env PS_MONGODB_PASSWORD +# id: string +# tag: string +# reject_ip_ranges: [] +# Options: off | auto_configure | read_only +# post_images: off +# debug_api: false - # ------------------------------------------------------------------------- - # MySQL – uncomment this entire block to use (comment out PostgreSQL above) - # ------------------------------------------------------------------------- - # - type: mysql - # uri: !env PS_MYSQL_URI - # hostname: db.example.com - # port: 3306 - # database: mydb - # username: sync - # password: !env PS_MYSQL_PASSWORD - # id: string - # tag: string - # server_id: number - # cacert: string - # client_certificate: string - # client_private_key: string - # reject_ip_ranges: [] - # binlog_queue_memory_limit: number - # debug_api: false +# ------------------------------------------------------------------------- +# MySQL – uncomment this entire block to use (comment out PostgreSQL above) +# ------------------------------------------------------------------------- +# - type: mysql +# uri: !env PS_MYSQL_URI +# hostname: db.example.com +# port: 3306 +# database: mydb +# username: sync +# password: !env PS_MYSQL_PASSWORD +# id: string +# tag: string +# server_id: number +# cacert: string +# client_certificate: string +# client_private_key: string +# reject_ip_ranges: [] +# binlog_queue_memory_limit: number +# debug_api: false # ----------------------------------------------------------------------------- # STORAGE – configuration for the storage backend (sync bucket storage) @@ -85,12 +85,12 @@ replication: storage: type: mongodb uri: !env PS_MONGO_URI - # database: string - # username: string - # password: !env PS_MONGO_PASSWORD - # reject_ip_ranges: [] - # Maximum number of connections to the storage database, per process. Defaults to 8. - # max_pool_size: 8 +# database: string +# username: string +# password: !env PS_MONGO_PASSWORD +# reject_ip_ranges: [] +# Maximum number of connections to the storage database, per process. Defaults to 8. +# max_pool_size: 8 # ----------------------------------------------------------------------------- # PostgreSQL storage – uncomment this block and comment out the MongoDB storage block above to use PostgreSQL @@ -105,7 +105,7 @@ storage: # username: string # password: !env PS_STORAGE_PASSWORD # database: string -# # Options: verify-full | verify-ca | disable +# Options: verify-full | verify-ca | disable # sslmode: verify-full # cacert: string # client_certificate: string @@ -129,91 +129,91 @@ port: !env PS_PORT # ----------------------------------------------------------------------------- # One of path or content is supported. path is used in this example. sync_rules: - # Path to the sync rules YAML file. +# Path to the sync rules YAML file. path: sync_rules.yaml - # Inline sync rules content as a string (use this or path, not both). - # content: string - # Whether to exit the process if there is an error parsing sync rules. - # exit_on_error: boolean +# Inline sync rules content as a string (use this or path, not both). +# content: string +# Whether to exit the process if there is an error parsing sync rules. +# exit_on_error: boolean # ----------------------------------------------------------------------------- # CLIENT AUTH (optional) – configuration for client authentication mechanisms # ----------------------------------------------------------------------------- # client_auth: -# # PowerSync will use the same JWT secret as Supabase. +# PowerSync will use the same JWT secret as Supabase. # supabase: false -# # Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. +# Legacy: If your Supabase project does not use the new JWT signing keys, you must provide your project's legacy JWT secret to use Supabase Auth. Get it from your project's API settings in the Supabase Dashboard. # supabase_jwt_secret: !env PS_SUPABASE_JWT_SECRET -# # URI or array of URIs pointing to JWKS endpoints for client authentication; instance fetches public keys to verify JWT signatures. +# URI or array of URIs pointing to JWKS endpoints for client authentication; instance fetches public keys to verify JWT signatures. # jwks_uri: https://example.com/jwks.json -# # Inline JWKS configuration; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. +# Inline JWKS configuration; provide keys directly instead of (or in addition to) jwks_uri to verify JWT signatures. # jwks: # keys: -# # HMAC (symmetric) – Options: HS256 | HS384 | HS512 +# HMAC (symmetric) – Options: HS256 | HS384 | HS512 # - kty: oct # alg: HS256 # kid: example-key # k: !env PS_CLIENT_AUTH_KEY -# # RSA – Options for alg: RS256 | RS384 | RS512 +# RSA – Options for alg: RS256 | RS384 | RS512 # - kty: RSA # kid: my-rsa-key # n: "" # e: "" # alg: RS256 -# # EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 +# EC – Options for crv: P-256 | P-384 | P-512; alg: ES256 | ES384 | ES512 # - kty: EC # kid: my-ec-key # crv: P-256 # x: "" # y: "" # alg: ES256 -# # OKP (EdDSA) – Options for crv: Ed25519 | Ed448 +# OKP (EdDSA) – Options for crv: Ed25519 | Ed448 # - kty: OKP # kid: my-okp-key # crv: Ed25519 # x: "" # alg: EdDSA -# # When true, blocks JWKS URIs that resolve to local network addresses. +# When true, blocks JWKS URIs that resolve to local network addresses. # block_local_jwks: false -# # IP ranges to reject when validating JWKS URIs. +# IP ranges to reject when validating JWKS URIs. # jwks_reject_ip_ranges: [] -# # Valid audiences for JWT validation. +# Valid audiences for JWT validation. # audience: ['authenticated'] # ----------------------------------------------------------------------------- # API – API service configuration and parameters # ----------------------------------------------------------------------------- api: - # API access tokens for administrative operations. +# API access tokens for administrative operations. tokens: - use_a_better_token_in_production - # Performance and safety parameters for the API service. - # parameters: - # # Maximum number of connections (http streams or websockets) per API process. Default of 200. - # max_concurrent_connections: 200 - # # Should not be significantly more than storage.max_pool_size, otherwise it would block on the pool. Default of 10. - # max_data_fetch_concurrency: 10 - # # Maximum number of buckets for each connection; hard limit so the service errors instead of crashing when a sync rule is misconfigured. Default of 1000. - # max_buckets_per_connection: 1000 - # # Limit on parameter query results before converting to a unique set. Default of 1000. - # max_parameter_query_results: 1000 +# Performance and safety parameters for the API service. +# parameters: +# Maximum number of connections (http streams or websockets) per API process. Default of 200. +# max_concurrent_connections: 200 +# Should not be significantly more than storage.max_pool_size, otherwise it would block on the pool. Default of 10. +# max_data_fetch_concurrency: 10 +# Maximum number of buckets for each connection; hard limit so the service errors instead of crashing when a sync rule is misconfigured. Default of 1000. +# max_buckets_per_connection: 1000 +# Limit on parameter query results before converting to a unique set. Default of 1000. +# max_parameter_query_results: 1000 # ----------------------------------------------------------------------------- # HEALTHCHECK (optional) – mechanisms for exposing health check data # ----------------------------------------------------------------------------- # healthcheck: # probes: -# # Enables exposing healthcheck status via filesystem files. +# Enables exposing healthcheck status via filesystem files. # use_filesystem: boolean -# # Enables exposing healthcheck status via HTTP endpoints. +# Enables exposing healthcheck status via HTTP endpoints. # use_http: boolean -# # Deprecated. Enables HTTP probes for both API and UNIFIED service modes. FileSystem probes are always enabled. +# Deprecated. Enables HTTP probes for both API and UNIFIED service modes. FileSystem probes are always enabled. # use_legacy: boolean # ----------------------------------------------------------------------------- # MIGRATIONS (optional) – configuration for database schema migrations # ----------------------------------------------------------------------------- # migrations: -# # When true, disables automatic storage database schema migrations. -# # Migrations need to manually be started by the consuming application. +# When true, disables automatic storage database schema migrations. +# Migrations need to manually be started by the consuming application. # disable_auto_migration: false diff --git a/packages/cli/templates/self-hosted/base/powersync/sync.yaml b/packages/cli/templates/self-hosted/base/powersync/sync.yaml index 3e7b524..2bf1d29 100644 --- a/packages/cli/templates/self-hosted/base/powersync/sync.yaml +++ b/packages/cli/templates/self-hosted/base/powersync/sync.yaml @@ -11,16 +11,16 @@ config: # Docs: https://docs.powersync.com/usage/sync-rules bucket_definitions: global: - # Sync rules without parameter queries will sync to all users +# Sync rules without parameter queries will sync to all users data: - # Sync all rows +# Sync all rows - SELECT * FROM mytable - # Only sync some rows +# Only sync some rows - SELECT * FROM mytable WHERE mycolumn = false - # Wildcards can be used, useful in development to quickly sync all tables - #- SELECT * FROM "%" +# Wildcards can be used, useful in development to quickly sync all tables +# - SELECT * FROM "%" by_user: - # Only sync rows belonging to the user, using fields from the auth token +# Only sync rows belonging to the user, using fields from the auth token parameters: SELECT request.user_id() as user_id data: - SELECT * FROM mytable WHERE mytable.user_id = bucket.user_id diff --git a/packages/cli/test/commands/init.test.ts b/packages/cli/test/commands/init.test.ts index 5ceae81..45ef8c8 100644 --- a/packages/cli/test/commands/init.test.ts +++ b/packages/cli/test/commands/init.test.ts @@ -1,10 +1,91 @@ -import { runCommand } from '@oclif/test' -import { describe, expect, it } from 'vitest' -import { root } from '../helpers/root.js' +import { runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { parse as parseYaml } from 'yaml'; + +import { root } from '../helpers/root.js'; + +const CUSTOM_DIR = 'custom-dir'; +const EXISTING_DIR = 'existing-dir'; describe('init', () => { - it('runs init cmd', async () => { - const { stdout } = await runCommand('init', { root }) - expect(stdout).toContain('init: not yet implemented') - }) -}) + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'init-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('creates project with default directory and type', async () => { + const { stdout } = await runCommand('init', { root }); + expect(stdout).toContain('Created PowerSync cloud project'); + const projectDir = join(tmpDir, 'powersync'); + const serviceYamlPath = join(projectDir, 'service.yaml'); + expect(existsSync(serviceYamlPath)).toBe(true); + expect(existsSync(join(projectDir, 'sync.yaml'))).toBe(true); + const serviceYaml = parseYaml(readFileSync(serviceYamlPath, 'utf8')); + expect(serviceYaml.telemetry).toBeUndefined(); + const linkYamlPath = join(projectDir, 'link.yaml'); + expect(existsSync(linkYamlPath)).toBe(true); + const linkYaml = parseYaml(readFileSync(linkYamlPath, 'utf8')); + expect(linkYaml.type).toBe('cloud'); + }); + + it('errors when directory already exists', async () => { + mkdirSync(join(tmpDir, EXISTING_DIR), { recursive: true }); + const result = await runCommand(`init --directory=${EXISTING_DIR}`, { + root + }); + expect(result.error?.message).toMatch( + new RegExp( + `Directory "${EXISTING_DIR}" already exists. Delete the folder to start over, or link existing config to PowerSync Cloud with \`powersync link\`.` + ) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('creates project with --directory flag', async () => { + const { stdout } = await runCommand(`init --directory=${CUSTOM_DIR}`, { + root + }); + expect(stdout).toContain(`Created PowerSync cloud project`); + const projectDir = join(tmpDir, CUSTOM_DIR); + const serviceYamlPath = join(projectDir, 'service.yaml'); + expect(existsSync(serviceYamlPath)).toBe(true); + expect(existsSync(join(projectDir, 'sync.yaml'))).toBe(true); + const serviceYaml = parseYaml(readFileSync(serviceYamlPath, 'utf8')); + expect(serviceYaml.telemetry).toBeUndefined(); + const linkYamlPath = join(projectDir, 'link.yaml'); + expect(existsSync(linkYamlPath)).toBe(true); + const linkYaml = parseYaml(readFileSync(linkYamlPath, 'utf8')); + expect(linkYaml.type).toBe('cloud'); + }); + + it('creates self-hosted project with --type=self-hosted', async () => { + const { stdout } = await runCommand( + `init --type=self-hosted --directory=${CUSTOM_DIR}`, + { root } + ); + expect(stdout).toContain(`Created PowerSync self-hosted project`); + const projectDir = join(tmpDir, CUSTOM_DIR); + const serviceYamlPath = join(projectDir, 'service.yaml'); + expect(existsSync(serviceYamlPath)).toBe(true); + expect(existsSync(join(projectDir, 'sync.yaml'))).toBe(true); + const serviceYaml = parseYaml(readFileSync(serviceYamlPath, 'utf8')); + expect(serviceYaml.telemetry).toBeDefined(); + expect(serviceYaml.telemetry.disable_telemetry_sharing).toBe(false); + const linkYamlPath = join(projectDir, 'link.yaml'); + expect(existsSync(linkYamlPath)).toBe(true); + const linkYaml = parseYaml(readFileSync(linkYamlPath, 'utf8')); + expect(linkYaml.type).toBe('self-hosted'); + }); +}); diff --git a/packages/cli/test/commands/login.test.ts b/packages/cli/test/commands/login.test.ts index d17a331..1b2f4bc 100644 --- a/packages/cli/test/commands/login.test.ts +++ b/packages/cli/test/commands/login.test.ts @@ -1,5 +1,6 @@ import { runCommand } from '@oclif/test' import { describe, expect, it } from 'vitest' + import { root } from '../helpers/root.js' describe('login', () => { diff --git a/packages/cli/test/setup.ts b/packages/cli/test/setup.ts index 5fe2018..7c2b555 100644 --- a/packages/cli/test/setup.ts +++ b/packages/cli/test/setup.ts @@ -1,4 +1,5 @@ import { Config } from '@oclif/core' + import { root } from './helpers/root.js' /** diff --git a/packages/cli/tsconfig.tsbuildinfo b/packages/cli/tsconfig.tsbuildinfo index fe4152f..88dcde8 100644 --- a/packages/cli/tsconfig.tsbuildinfo +++ b/packages/cli/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/alphabet.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/pjson.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/topic.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/hooks.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/s3-manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/ts-config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/ts-path.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/error.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/cli.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/module-load.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/handle.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/warn.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/parser.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/execute.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flush.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/formatter.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/util.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/main.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/module-loader.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/validate.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/performance.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/settings.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/util/ids.d.ts","../../node_modules/.pnpm/cli-spinners@2.9.2/node_modules/cli-spinners/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/types.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/base.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/simple.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/spinner.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/colorize-json.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/write.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/index.d.ts","./src/index.ts","./src/commands/deploy.ts","./src/commands/destroy.ts","./src/commands/init.ts","./src/commands/link.ts","./src/commands/login.ts","./src/commands/migrate.ts","./src/commands/stop.ts","./src/commands/validate.ts","./src/commands/fetch/config.ts","./src/commands/fetch/index.ts","./src/commands/fetch/instances.ts","./src/commands/fetch/status.ts","./src/commands/generate/index.ts","./src/commands/generate/schema.ts","./src/commands/generate/token.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@18.19.130/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[94,143,184,224],[71,73,74,83,92,94,143,184],[68,71,73,79,93,143,184],[80,81,82,143,184],[69,70,71,76,93,143,184],[79,143,184],[74,143,184],[79,85,143,184],[143,184],[79,85,89,143,184],[79,84,85,86,87,88,90,91,143,184],[79,143,184,224],[79,93,99,143,184],[79,93,143,184],[79,93,99,100,101,143,184],[72,79,83,90,92,93,95,96,97,98,102,103,104,105,108,109,110,111,120,143,184],[94,143,184],[68,69,70,71,72,93,143,184],[71,73,93,94,143,184],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,94,143,184],[93,143,184],[64,93,143,184],[67,68,143,184],[66,69,70,93,143,184],[66,73,143,184],[92,94,143,184],[94,106,107,143,184],[73,143,184],[113,143,184],[114,143,184],[113,114,143,184],[112,143,184],[84,88,91,115,116,117,118,119,143,184],[68,143,184],[143,181,184],[143,183,184],[184],[143,184,189,216],[143,184,185,195,203,213,224],[143,184,185,186,195,203],[138,139,140,143,184],[143,184,187,225],[143,184,188,189,196,204],[143,184,189,213,221],[143,184,190,192,195,203],[143,183,184,191],[143,184,192,193],[143,184,194,195],[143,183,184,195],[143,184,195,196,197,213,224],[143,184,195,196,197,210,213,216],[143,184,192,195,198,203,213,224],[143,184,195,196,198,199,203,213,221,224],[143,184,198,200,213,221,224],[141,142,143,144,145,146,147,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230],[143,184,195,201],[143,184,202,224,229],[143,184,192,195,203,213],[143,184,204],[143,184,205],[143,183,184,206],[143,184,207,223,229],[143,184,208],[143,184,209],[143,184,195,210,211],[143,184,210,212,225,227],[143,184,195,213,214,216],[143,184,215,216],[143,184,213,214],[143,184,216],[143,184,217],[143,184,213,218],[143,184,195,219,220],[143,184,219,220],[143,184,189,203,213,221],[143,184,222],[143,184,203,223],[143,184,198,209,224],[143,184,189,225],[143,184,213,226],[143,184,202,227],[143,184,228],[143,179,184],[143,179,184,195,197,206,213,216,224,227,229],[143,184,213,230],[143,156,160,184,224],[143,156,184,213,224],[143,151,184],[143,153,156,184,221,224],[143,184,203,221],[143,184,231],[143,151,184,231],[143,153,156,184,203,224],[143,148,149,152,155,184,195,213,224],[143,148,154,184],[143,152,156,184,216,224,231],[143,172,184,231],[143,150,151,184,231],[143,156,184],[143,150,151,152,153,154,155,156,157,158,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,184],[143,156,163,164,184],[143,154,156,164,165,184],[143,155,184],[143,148,151,156,184],[143,156,160,164,165,184],[143,160,184],[143,154,156,159,184,224],[143,148,153,154,156,160,163,184],[143,184,213],[143,151,156,172,184,229,231],[121,143,184],[143,184,196,231]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"032e362f68a69c4f6af9678b4f5fdcf5b6c348e6aa279a7b2c89099bb7887a0a","impliedFormat":1},{"version":"99fd2587995ea6001ac20d6ecebe748e163d62e820f369452919c265f140b3c9","impliedFormat":1},{"version":"0b730f11a4d506c4cefe2c4b0d407a789ecbe9992972e3cef3a16dc7752a9041","impliedFormat":1},{"version":"e1d8a12b5bdcc2111555f44f2af6131b509256fb4b0275b5d500ddc6b5f15057","impliedFormat":1},{"version":"e2f5f8a675634ad58a5c0b6dae43445a136207cf1c25be81b72c6cc9511a74d3","impliedFormat":1},{"version":"935f95054bf1cf971a72a4e0049586eaaa1030677fb9eedc199eb3da4ba8de0c","impliedFormat":1},{"version":"749a06b2b17de875b677443af38813af4ad08ce36fabc42dd1239e9814ccfb7a","impliedFormat":1},{"version":"948e7ab0a0498621ffff968d08f99a856ccfe650a40c88e77434d6fda848a867","impliedFormat":1},{"version":"76ba4acb99015f0af9f9015b097e65ede39c9b236415fbb5c497abf3f16cc4ff","impliedFormat":1},{"version":"97f38e731416236723389b761be37fe9fd1982c3daa8ddcb1cd4ad640460ff34","impliedFormat":1},{"version":"72aae4ad580cc65be46b00b5f036eadd5f28b9a6a33b5371b0316b1a00be72dd","impliedFormat":1},{"version":"e80cff0c41a5a798496621a10b173f9bd8934d309a74dae7f2c36841be07ed6d","impliedFormat":1},{"version":"b8858f8750c32bc24aa90df80af95b1aca764a2728e395b8b2aefeffbb0d4324","impliedFormat":1},{"version":"51b85172183e3bf32ae04b95da932713fed0eb1e9b0ac14658b27315d3cca7de","impliedFormat":1},{"version":"1d9706c7bf2cc171e52f67cc048e229622b59efe1922c82541bc61ea2cf8537e","impliedFormat":1},{"version":"938c160678c0c4bf4b1e28394f51ca546029c5f10928147fe7cd7203c2a2ceb4","impliedFormat":1},{"version":"24546d4a958a3262affbc00e6712d9595f72af75205eb1eaf4fa995fa036df71","impliedFormat":1},{"version":"f44bd3fa97e83bc62e5651a5d82b88bc875be385c4f7db698be4970827eb0134","impliedFormat":1},{"version":"1dfbc80539faad1965995a79f12c8d38119f7a1c49c831aea1c18540bb206ac6","impliedFormat":1},{"version":"3db5b76431251162950a870670c33d22d7e7fcb02f0f5818d96f16d941335a20","impliedFormat":1},{"version":"68772eaccdf08b5e44504747a91c311e2cd3b0b1b263035890a571439e144d4e","impliedFormat":1},{"version":"335f00f0ca1ec75c81e41503907753b4ea2f50f9ace17595afa7e583a5951489","impliedFormat":1},{"version":"eefb5931fa32da9b384a318c9c98314841326040cd8a5a9f4ef0acbd3ec3b924","impliedFormat":1},{"version":"1c7760d4af43ced46bce744555d7014ee47f3381b57cacc933ded7f0a8701aac","impliedFormat":1},{"version":"37ff6180311269649d3d76d4b222be7523d5476ffc34a99d6d401d4bbb7534d5","impliedFormat":1},{"version":"c3d08e2d4c972ebe21ca5d40e33feed01044769d358eaa13cf89b692134c4d32","impliedFormat":1},{"version":"4677854ad855b1a373d287e0f892dde2e5d60bee80fe67f05add92c630ed0bc0","impliedFormat":1},{"version":"d9f75829a0984c08c1633d04a954c7c4b5adb7e16c13b6cf207fbd9100838ca9","impliedFormat":1},{"version":"35413e3168706b2a4bed7538b355bc4ec3d5eff10f25b588485b30a22c56db1c","impliedFormat":1},{"version":"ae1d64e4ad308ad8a7010a5f7c67fd1466dcc5e0f6cb876a8e450716ae0c5c2e","impliedFormat":1},{"version":"dc38bb715e32aa87e3f74feacd63e6c9b364e0acbae8eaf1a0503037ba5d5553","impliedFormat":1},{"version":"efa0400a30b6a995b39f59d4e517d2bd624970b21153aadb611cf3f113e98295","impliedFormat":1},{"version":"d7e355137d4a8db67553be5b52bf98cf1ffdac39bb8668ecf19756981cc6876b","impliedFormat":1},{"version":"569f27bc2a2f9a416bd3ccebe8b6852e306f11a5c69d8fb4ac00a68a28a414d6","impliedFormat":1},{"version":"b6ef0db675b5145700813a721047bfcefe3927147daa0fc0bd92c0762e70b9f7","impliedFormat":1},{"version":"d009048209b7d3dd1d2dd2f8fe485b1bc1648d9750cf3a96ca1f142d8016c2b3","impliedFormat":1},{"version":"0e47b2faa8c1f0f93bd4deb6119e8f02f1a7c1f2394f88d4fc74b70e270d1eb4","impliedFormat":1},{"version":"ed4d24c29aacac45546aae136d210d935d918051c9bdf63945949c00ff7112e2","impliedFormat":1},{"version":"2ec372633f1e45c8047c7d97f079fccfc4c52de86e04eb6f4f37fafce0730671","impliedFormat":1},{"version":"a1d78fb84a18518e5dc6e5b8fc60e670be6ac36584099afbb483f7ad59e9decc","impliedFormat":1},{"version":"a0aa647e153798624c2c32ca663611eb62ddd131596989648c357fd31a80a292","impliedFormat":1},{"version":"ea366ad80040319ca2ac495f4823fa271d330286525d57a043b6feed08ce7917","impliedFormat":1},{"version":"98bb229db2d81eaec4ba5ef6e7bbb77f24c424e63217bed49a951e9c6b518507","impliedFormat":1},{"version":"8bed77d37a236f90a1bcfce2591f172d009f55da48b45a7469ae0a80b9302404","impliedFormat":1},{"version":"c79ab4ce4944757c8e5f578b6a49e4d21c2736dc7f78d5cb395e3fa01495f8f2","impliedFormat":1},{"version":"469865ae2f24c9ee11bb589d5e28e2d9682ebd7ca9e06bd3643291b16e34f47d","impliedFormat":1},{"version":"dc9282104c64b6aec45b8e0952b5c1777f03f63761049dd60fbcbc35e2306848","impliedFormat":1},{"version":"f64b0687abbd6646ffc0763c102f6c1048527f62659777e9bb302a3e1ef00630","impliedFormat":1},{"version":"b85d57f7dfd39ab2b001ecc3312dfa05259192683a81880749cbca3b28772e42","impliedFormat":1},{"version":"7199dc8fd25c403c9c37acaf7958f75c2b06baaa04c2c8f6e2e28e445fd57d40","impliedFormat":1},{"version":"43725d63f81e18c630acecc5e502bbd5d2a747fff10011e844736544aa4457c0","impliedFormat":1},{"version":"535dfa7bb97e97d8ac5fff37bae9c09fe6a758b52ffd06d50f4dcfd4f273b3c1","impliedFormat":1},{"version":"a478585c9957e2fa7a12f4719861fcce56768e82b68211e293916206ee8d3a61","impliedFormat":1},{"version":"f69b9b72755f8e9731a3e910367f75e9b8572d30e80b5a993e431f36dfdae24f","impliedFormat":1},{"version":"059d51bf1161687e7f6374af419ae67ecfbdb81eebb3493108ddf0c4ece902e4","impliedFormat":1},{"version":"70271cdcd48eda39af5870abcb3471eee639f1c30c3522f54ac64a66abd6bb0e","impliedFormat":1},{"version":"34ca43f6999082790b1cccf8b749346d67dad44cbd2a394f7a68590cc9265481","impliedFormat":1},{"version":"0992833cc5115272e0af47c8caa9c452e2efadcfbdd54c13ec081d735bb0ada6","impliedFormat":1},{"version":"c519bbc76e9214a46c8d38a9875cbead73ea681e403b34b3ce7b86a38e3f7d9a","signature":"658d7ae3d7654cb926a4d20defc7b8ff80e4f07c48b72f8daf118ca1dbb19cf6","impliedFormat":99},{"version":"c53d58d8708c3e1d3f57e97b88c1971b51b548ddd6b20705f47e10e6ed12577a","signature":"8b66835eba52683e3c5f48eccb9d5a31778b4e95b41ac635b25d8fb0282cd166","impliedFormat":99},{"version":"f18d2c0f9a8516dd46993857b0e1a01a59f2a3c206b9dda34f8b6591bc930058","signature":"19b51e1c1c63e7051bae00394f80bfacc468950d983f2678a5d4e80909d19008","impliedFormat":99},{"version":"6e0c6c3957bd54b788eb1a41f380e5f56e86deec3dfb31abf3eaace6abe766ee","signature":"fc3ed3fb77b03919ae7f9d783df6dee159efda9e199eee2415b8302544225950","impliedFormat":99},{"version":"531861e32c6a099ad7a7a6820f3c26f09f55411abf3654c214e472eee50e3e45","signature":"a08bbe0aff62a8de841806581a30a67a391e950e90ded683b69974af0bbcbc4e","impliedFormat":99},{"version":"588cd6fd9f975d60b94607a28418d42db5e28d3cdce35a57076193fb3899bdd8","signature":"fa602d50be70549daa1500419fa23fe977f2c2e2b48a18ec1e16eb6880e0bf89","impliedFormat":99},{"version":"c61ad5da610be01b680164f5958745dcf8d75e4d15626a76adb6e9f741134ddf","signature":"d96e9b1b0b145aca5fcd23a5314c0de5366c67005e41a55402852a0989c44d85","impliedFormat":99},{"version":"70a9379af39f9e72b3b3268341aeebc5bb0d86ec16435dc3ad8077756233a0ca","signature":"9d41e3c58467f4067a508da67aea427f8cd13bb11456c2b68172211362646d80","impliedFormat":99},{"version":"aa23e65ddd492fd8f4e5c2d453065fc04aedfaaaeee1f2b9fa33b3905ed1aa5c","signature":"0f6589f61f915be1f2dbcb00c5293898d1faa94ad76f4b9c4401f1550bf62399","impliedFormat":99},{"version":"b5e7c5963f7c8955304ed5c2994f98ea0542817e74f083137bc3f043b5f10d62","signature":"12d98fc500d48c23d0524d56fd27992b9e4146da11716af88035ee996337b3b5","impliedFormat":99},{"version":"4f6aab233e7967d99d83a1b1f8b7c043ce7e9329adf914fa54db6e5e79af22ee","signature":"d471d2b608b690601abc2cbd9b87724a31893b14d574bad531d631d26c092e75","impliedFormat":99},{"version":"8fc9a176cb4e74ea95ae50ce99a669cccc94236f9fe8643fd7d33e73093dded5","signature":"0ca6c6d5cb1a05a085eb74a6d24ccf864c848bc5f559624860e66bf1d9ebc563","impliedFormat":99},{"version":"4a69e761fd74985ae4c6ecc32d5627880bf0b95f432f1225ecf840e930ef7fd7","signature":"22b692698d687f87da7975dabb0b9399804a261e07eab0d434b420947487782b","impliedFormat":99},{"version":"7dacd8aedbed2b2156ee2d2f50fa073e3f95da695829d583e1236d285de044ca","signature":"2842fc0b7f7ca9bd25a4608646c9ea2fcc46599625d6bbba4fc5386580982d0c","impliedFormat":99},{"version":"e07ee5cf3732a287d310da2194d1d02cfa0bd0ee48c46e156ad6e8ea6d3b38ee","signature":"37ef0e518e13b08cb91b2ae0dc450dcbd6144274e8c9ff3a2bfd1ed661a7688a","impliedFormat":99},{"version":"9a590cb8a7ab265767d67a6f0355f0027b4452e7625c53a5b36130a48974ab7e","signature":"a456b7c515115590cdba93d3f827e7c8626f37b2b8d7a0d6814131cd34f7a7da","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cb3140d0e9cee0aea7264fd6a1d297394052a18eb05ca0220d133e6c043fb5","affectsGlobalScope":true,"impliedFormat":1},{"version":"362d474eb9feae178a83ead94d757c21e42d6d7090e4182f0c12e92830a3d25e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc27badd4bf4a2b0024a0cd32a9bbf0be7073902c5177a58be14242e7d8bf2c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"b972357e61ef2e072f8a88b9f4f5a70984c417237e6106f6b2390414a09ce523","affectsGlobalScope":true,"impliedFormat":1},{"version":"076cac5898bd833255def0f7c5717b83534212873505c9c958f1926d49f9bec6","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"75eb536b960b85f75e21490beeab53ea616646a995ad203e1af532d67a774fb6","impliedFormat":1},{"version":"36d0976d3dad74078f707af107b5082dbe42ffcadb3442ff140c36c8a33b4887","affectsGlobalScope":true,"impliedFormat":1},{"version":"86e0d632e9ef88593e8724ffb6af05104e13a08f9d8df733a30f9991ac387fff","impliedFormat":1},{"version":"7646ad748a9ca15bf43d4c88f83cc851c67f8ec9c1186295605b59ba6bb36dcb","impliedFormat":1},{"version":"cef8931bc129687165253f0642427c2a72705a4613b3ac461b9fa78c7cdaef32","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"47b62c294beb69daa5879f052e416b02e6518f3e4541ae98adbfb27805dd6711","impliedFormat":1},{"version":"f8375506002c556ec412c7e2a5a9ece401079ee5d9eb2c1372e9f5377fac56c7","impliedFormat":1},{"version":"8edd6482bd72eca772f9df15d05c838dd688cdbd4d62690891fca6578cfda6fe","impliedFormat":1},{"version":"07ba29a1a495b710aea48a4cf19ae12b3cbda2a8e9ac62192af477027a99e8de","impliedFormat":1},{"version":"6dead64c944504250dd2fc9095231f36887cfc1534f1ff57737c19f92d165c91","impliedFormat":1},{"version":"b9a4824bb83f25d6d227394db2ed99985308cf2a3a35f0d6d39aa72b15473982","impliedFormat":1},{"version":"6e9948b1e396106601365283680c319a9103c71a5725e7d03e26fe246df60c4c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e8e284b3832911aeede987e4d74cf0a00f2b03896b2fd3bf924344cc0f96b3c","impliedFormat":1},{"version":"37d37474a969ab1b91fc332eb6a375885dfd25279624dfa84dea48c9aedf4472","impliedFormat":1},{"version":"1ddd8c1a3ae1f8ab28affd53b13910be4afe0b35f28517b7f14c268e9e42647a","impliedFormat":1},{"version":"f1a79b6047d006548185e55478837dfbcdd234d6fe51532783f5dffd401cfb2b","impliedFormat":1},{"version":"cbc91187014fb1e738ef252751a9f84abf2989ec1c3b1637ec23b5b39cdf3d25","impliedFormat":1},{"version":"e822320b448edce0c7ede9cbeada034c72e1f1c8c8281974817030564c63dcb1","impliedFormat":1},{"version":"9d65568cba17c9db40251023406668695ad698ea4a34542364af3e78edd37811","affectsGlobalScope":true,"impliedFormat":1},{"version":"f23e3d484de54d235bf702072100b541553a1df2550bad691fe84995e15cf7be","impliedFormat":1},{"version":"821c79b046e40d54a447bebd9307e70b86399a89980a87bbc98114411169e274","impliedFormat":1},{"version":"17bc38afc78d40b2f54af216c0cc31a4bd0c6897a5945fa39945dfc43260be2c","impliedFormat":1},{"version":"d201b44ff390c220a94fb0ff6a534fe9fa15b44f8a86d0470009cdde3a3e62ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"d44445141f204d5672c502a39c1124bcf1df225eba05df0d2957f79122be87b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"de905bc5f7e7a81cb420e212b95ab5e3ab840f93e0cfa8ce879f6e7fa465d4a2","impliedFormat":1},{"version":"bc2ff43214898bc6d53cab92fb41b5309efec9cbb59a0650525980aee994de2b","impliedFormat":1},{"version":"bede3143eeddca3b8ec3592b09d7eb02042f9e195251040c5146eac09b173236","impliedFormat":1},{"version":"64a40cf4ec8a7a29db2b4bc35f042e5be8537c4be316e5221f40f30ca8ed7051","impliedFormat":1},{"version":"294c082d609e6523520290db4f1d54114ebc83643fb42abd965be5bcc5d9416b","impliedFormat":1},{"version":"cf7d740e39bd8adbdc7840ee91bef0af489052f6467edfcefb7197921757ec3b","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"b9f0681c4d2cb00a5cfe08a7be9662627b912de562926819ebddfe2ef6a9b5ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85151402164ab7cb665e58df5c1a29aa25ea4ed3a367f84a15589e7d7a9c8ca","impliedFormat":1},{"version":"89eb8abe2b5c146fbb8f3bf72f4e91de3541f2fb559ad5fed4ad5bf223a3dedb","impliedFormat":1},{"version":"bc6cb10764a82f3025c0f4822b8ad711c16d1a5c75789be2d188d553b69b2d48","affectsGlobalScope":true,"impliedFormat":1},{"version":"41d510caf7ed692923cb6ef5932dc9cf1ed0f57de8eb518c5bab8358a21af674","impliedFormat":1},{"version":"2751c5a6b9054b61c9b03b3770b2d39b1327564672b63e3485ac03ffeb28b4f6","impliedFormat":1},{"version":"dc058956a93388aab38307b7b3b9b6379e1021e73a244aab6ac9427dc3a252a7","impliedFormat":1},{"version":"f33302cf240672359992c356f2005d395b559e176196d03f31a28cc7b01e69bc","impliedFormat":1},{"version":"3ce25041ff6ae06c08fcaccd5fcd9baf4ca6e80e6cb5a922773a1985672e74c2","affectsGlobalScope":true,"impliedFormat":1},{"version":"652c0de14329a834ff06af6ad44670fac35849654a464fd9ae36edb92a362c12","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b1e178016d3fc554505ae087c249b205b1c50624d482c542be9d4682bab81fc","impliedFormat":1},{"version":"5db7c5bb02ef47aaaec6d262d50c4e9355c80937d649365c343fa5e84569621d","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"6831f13f06a15391dfeb2477d48ac58311ab675f85846a05499ee92d6e856933","affectsGlobalScope":true,"impliedFormat":1},{"version":"37bef1064b7d015aeaa7c0716fe23a0b3844abe2c0a3df7144153ca8445fe0da","impliedFormat":1},{"version":"83178a1174286d5f5178c5c75067e36c41b975c26be7b86d99cb18393eb30a41","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[[122,137]],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[95,1],[93,2],[80,3],[83,4],[81,5],[82,6],[84,6],[85,7],[86,8],[87,8],[88,9],[90,10],[92,11],[91,9],[96,6],[97,12],[98,9],[100,13],[99,14],[102,15],[101,6],[121,16],[64,9],[65,17],[73,18],[74,9],[75,17],[67,9],[72,19],[79,20],[66,9],[76,21],[94,22],[69,23],[71,24],[77,9],[68,9],[70,9],[78,9],[103,25],[104,6],[105,14],[89,26],[106,17],[108,27],[107,17],[109,9],[110,9],[111,28],[114,29],[115,30],[116,31],[113,32],[117,9],[120,33],[118,34],[119,9],[181,35],[182,35],[183,36],[143,37],[184,38],[185,39],[186,40],[138,9],[141,41],[139,9],[140,9],[187,42],[188,43],[189,44],[190,45],[191,46],[192,47],[193,47],[194,48],[195,49],[196,50],[197,51],[144,9],[142,9],[198,52],[199,53],[200,54],[231,55],[201,56],[202,57],[203,58],[204,59],[205,60],[206,61],[207,62],[208,63],[209,64],[210,65],[211,65],[212,66],[213,67],[215,68],[214,69],[216,70],[217,71],[218,72],[219,73],[220,74],[221,75],[222,76],[223,77],[224,78],[225,79],[226,80],[227,81],[228,82],[145,9],[146,9],[147,9],[180,83],[229,84],[230,85],[112,9],[61,9],[62,9],[12,9],[10,9],[11,9],[16,9],[15,9],[2,9],[17,9],[18,9],[19,9],[20,9],[21,9],[22,9],[23,9],[24,9],[3,9],[25,9],[26,9],[4,9],[27,9],[31,9],[28,9],[29,9],[30,9],[32,9],[33,9],[34,9],[5,9],[35,9],[36,9],[37,9],[38,9],[6,9],[42,9],[39,9],[40,9],[41,9],[43,9],[7,9],[44,9],[49,9],[50,9],[45,9],[46,9],[47,9],[48,9],[8,9],[54,9],[51,9],[52,9],[53,9],[55,9],[9,9],[56,9],[63,9],[57,9],[58,9],[60,9],[59,9],[1,9],[14,9],[13,9],[163,86],[170,87],[162,86],[177,88],[154,89],[153,90],[176,91],[171,92],[174,93],[156,94],[155,95],[151,96],[150,91],[173,97],[152,98],[157,99],[158,9],[161,99],[148,9],[179,100],[178,99],[165,101],[166,102],[168,103],[164,104],[167,105],[172,91],[159,106],[160,107],[169,108],[149,109],[175,110],[123,111],[124,111],[131,111],[132,111],[133,111],[134,111],[135,111],[136,111],[137,111],[125,111],[126,111],[127,111],[128,111],[129,111],[130,111],[122,111],[232,112],[233,9]],"latestChangedDtsFile":"./dist/commands/generate/token.d.ts","version":"5.9.3"} \ No newline at end of file +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/alphabet.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/pjson.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/topic.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/hooks.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/s3-manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/ts-config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/ts-path.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/error.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/cli.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/module-load.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/handle.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/warn.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/parser.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/execute.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flush.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/formatter.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/util.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/main.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/module-loader.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/validate.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/performance.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/settings.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/util/ids.d.ts","../../node_modules/.pnpm/cli-spinners@2.9.2/node_modules/cli-spinners/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/types.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/base.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/simple.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/spinner.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/colorize-json.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/write.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/index.d.ts","./src/index.ts","./src/commands/deploy.ts","./src/commands/destroy.ts","./src/commands/init.ts","./src/commands/link.ts","./src/commands/login.ts","./src/commands/migrate.ts","./src/commands/stop.ts","./src/commands/validate.ts","./src/commands/fetch/config.ts","./src/commands/fetch/index.ts","./src/commands/fetch/instances.ts","./src/commands/fetch/status.ts","./src/commands/generate/index.ts","./src/commands/generate/schema.ts","./src/commands/generate/token.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[94,143,192,209,210,235],[71,73,74,83,92,94,143,192,209,210],[68,71,73,79,93,143,192,209,210],[80,81,82,143,192,209,210],[69,70,71,76,93,143,192,209,210],[79,143,192,209,210],[74,143,192,209,210],[79,85,143,192,209,210],[143,192,209,210],[79,85,89,143,192,209,210],[79,84,85,86,87,88,90,91,143,192,209,210],[79,143,192,209,210,235],[79,93,99,143,192,209,210],[79,93,143,192,209,210],[79,93,99,100,101,143,192,209,210],[72,79,83,90,92,93,95,96,97,98,102,103,104,105,108,109,110,111,120,143,192,209,210],[94,143,192,209,210],[68,69,70,71,72,93,143,192,209,210],[71,73,93,94,143,192,209,210],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,94,143,192,209,210],[93,143,192,209,210],[64,93,143,192,209,210],[67,68,143,192,209,210],[66,69,70,93,143,192,209,210],[66,73,143,192,209,210],[92,94,143,192,209,210],[94,106,107,143,192,209,210],[73,143,192,209,210],[113,143,192,209,210],[114,143,192,209,210],[113,114,143,192,209,210],[112,143,192,209,210],[84,88,91,115,116,117,118,119,143,192,209,210],[68,143,192,209,210],[143,189,190,192,209,210],[143,191,192,209,210],[192,209,210],[143,192,197,209,210,227],[143,192,193,198,203,209,210,212,224,235],[143,192,193,194,203,209,210,212],[138,139,140,143,192,209,210],[143,192,195,209,210,236],[143,192,196,197,204,209,210,213],[143,192,197,209,210,224,232],[143,192,198,200,203,209,210,212],[143,191,192,199,209,210],[143,192,200,201,209,210],[143,192,202,203,209,210],[143,191,192,203,209,210],[143,192,203,204,205,209,210,224,235],[143,192,203,204,205,209,210,219,224,227],[143,185,192,200,203,206,209,210,212,224,235],[143,192,203,204,206,207,209,210,212,224,232,235],[143,192,206,208,209,210,224,232,235],[141,142,143,144,145,146,147,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241],[143,192,203,209,210],[143,192,209,210,211,235],[143,192,200,203,209,210,212,224],[143,192,209,210,213],[143,192,209,210,214],[143,191,192,209,210,215],[143,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241],[143,192,209,210,217],[143,192,209,210,218],[143,192,203,209,210,219,220],[143,192,209,210,219,221,236,238],[143,192,204,209,210],[143,192,203,209,210,224,225,227],[143,192,209,210,226,227],[143,192,209,210,224,225],[143,192,209,210,227],[143,192,209,210,228],[143,189,192,209,210,224,229],[143,192,203,209,210,230,231],[143,192,209,210,230,231],[143,192,197,209,210,212,224,232],[143,192,209,210,233],[143,192,209,210,212,234],[143,192,206,209,210,218,235],[143,192,197,209,210,236],[143,192,209,210,224,237],[143,192,209,210,211,238],[143,192,209,210,239],[143,185,192,209,210],[143,185,192,203,205,209,210,215,224,227,235,237,238,240],[143,192,209,210,224,241],[143,157,161,192,209,210,235],[143,157,192,209,210,224,235],[143,152,192,209,210],[143,154,157,192,209,210,232,235],[143,192,209,210,212,232],[143,192,209,210,242],[143,152,192,209,210,242],[143,154,157,192,209,210,212,235],[143,149,150,153,156,192,203,209,210,224,235],[143,157,164,192,209,210],[143,149,155,192,209,210],[143,157,178,179,192,209,210],[143,153,157,192,209,210,227,235,242],[143,178,192,209,210,242],[143,151,152,192,209,210,242],[143,157,192,209,210],[143,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,192,209,210],[143,157,172,192,209,210],[143,157,164,165,192,209,210],[143,155,157,165,166,192,209,210],[143,156,192,209,210],[143,149,152,157,192,209,210],[143,157,161,165,166,192,209,210],[143,161,192,209,210],[143,155,157,160,192,209,210,235],[143,149,154,157,164,192,209,210],[143,192,209,210,224],[143,152,157,178,192,209,210,240,242],[121,143,192,209,210],[121,143,192,204,209,210,214,235],[143,192,204,209,210,242]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"032e362f68a69c4f6af9678b4f5fdcf5b6c348e6aa279a7b2c89099bb7887a0a","impliedFormat":1},{"version":"99fd2587995ea6001ac20d6ecebe748e163d62e820f369452919c265f140b3c9","impliedFormat":1},{"version":"0b730f11a4d506c4cefe2c4b0d407a789ecbe9992972e3cef3a16dc7752a9041","impliedFormat":1},{"version":"e1d8a12b5bdcc2111555f44f2af6131b509256fb4b0275b5d500ddc6b5f15057","impliedFormat":1},{"version":"e2f5f8a675634ad58a5c0b6dae43445a136207cf1c25be81b72c6cc9511a74d3","impliedFormat":1},{"version":"935f95054bf1cf971a72a4e0049586eaaa1030677fb9eedc199eb3da4ba8de0c","impliedFormat":1},{"version":"749a06b2b17de875b677443af38813af4ad08ce36fabc42dd1239e9814ccfb7a","impliedFormat":1},{"version":"948e7ab0a0498621ffff968d08f99a856ccfe650a40c88e77434d6fda848a867","impliedFormat":1},{"version":"76ba4acb99015f0af9f9015b097e65ede39c9b236415fbb5c497abf3f16cc4ff","impliedFormat":1},{"version":"97f38e731416236723389b761be37fe9fd1982c3daa8ddcb1cd4ad640460ff34","impliedFormat":1},{"version":"72aae4ad580cc65be46b00b5f036eadd5f28b9a6a33b5371b0316b1a00be72dd","impliedFormat":1},{"version":"e80cff0c41a5a798496621a10b173f9bd8934d309a74dae7f2c36841be07ed6d","impliedFormat":1},{"version":"b8858f8750c32bc24aa90df80af95b1aca764a2728e395b8b2aefeffbb0d4324","impliedFormat":1},{"version":"51b85172183e3bf32ae04b95da932713fed0eb1e9b0ac14658b27315d3cca7de","impliedFormat":1},{"version":"1d9706c7bf2cc171e52f67cc048e229622b59efe1922c82541bc61ea2cf8537e","impliedFormat":1},{"version":"938c160678c0c4bf4b1e28394f51ca546029c5f10928147fe7cd7203c2a2ceb4","impliedFormat":1},{"version":"24546d4a958a3262affbc00e6712d9595f72af75205eb1eaf4fa995fa036df71","impliedFormat":1},{"version":"f44bd3fa97e83bc62e5651a5d82b88bc875be385c4f7db698be4970827eb0134","impliedFormat":1},{"version":"1dfbc80539faad1965995a79f12c8d38119f7a1c49c831aea1c18540bb206ac6","impliedFormat":1},{"version":"3db5b76431251162950a870670c33d22d7e7fcb02f0f5818d96f16d941335a20","impliedFormat":1},{"version":"68772eaccdf08b5e44504747a91c311e2cd3b0b1b263035890a571439e144d4e","impliedFormat":1},{"version":"335f00f0ca1ec75c81e41503907753b4ea2f50f9ace17595afa7e583a5951489","impliedFormat":1},{"version":"eefb5931fa32da9b384a318c9c98314841326040cd8a5a9f4ef0acbd3ec3b924","impliedFormat":1},{"version":"1c7760d4af43ced46bce744555d7014ee47f3381b57cacc933ded7f0a8701aac","impliedFormat":1},{"version":"37ff6180311269649d3d76d4b222be7523d5476ffc34a99d6d401d4bbb7534d5","impliedFormat":1},{"version":"c3d08e2d4c972ebe21ca5d40e33feed01044769d358eaa13cf89b692134c4d32","impliedFormat":1},{"version":"4677854ad855b1a373d287e0f892dde2e5d60bee80fe67f05add92c630ed0bc0","impliedFormat":1},{"version":"d9f75829a0984c08c1633d04a954c7c4b5adb7e16c13b6cf207fbd9100838ca9","impliedFormat":1},{"version":"35413e3168706b2a4bed7538b355bc4ec3d5eff10f25b588485b30a22c56db1c","impliedFormat":1},{"version":"ae1d64e4ad308ad8a7010a5f7c67fd1466dcc5e0f6cb876a8e450716ae0c5c2e","impliedFormat":1},{"version":"dc38bb715e32aa87e3f74feacd63e6c9b364e0acbae8eaf1a0503037ba5d5553","impliedFormat":1},{"version":"efa0400a30b6a995b39f59d4e517d2bd624970b21153aadb611cf3f113e98295","impliedFormat":1},{"version":"d7e355137d4a8db67553be5b52bf98cf1ffdac39bb8668ecf19756981cc6876b","impliedFormat":1},{"version":"569f27bc2a2f9a416bd3ccebe8b6852e306f11a5c69d8fb4ac00a68a28a414d6","impliedFormat":1},{"version":"b6ef0db675b5145700813a721047bfcefe3927147daa0fc0bd92c0762e70b9f7","impliedFormat":1},{"version":"d009048209b7d3dd1d2dd2f8fe485b1bc1648d9750cf3a96ca1f142d8016c2b3","impliedFormat":1},{"version":"0e47b2faa8c1f0f93bd4deb6119e8f02f1a7c1f2394f88d4fc74b70e270d1eb4","impliedFormat":1},{"version":"ed4d24c29aacac45546aae136d210d935d918051c9bdf63945949c00ff7112e2","impliedFormat":1},{"version":"2ec372633f1e45c8047c7d97f079fccfc4c52de86e04eb6f4f37fafce0730671","impliedFormat":1},{"version":"a1d78fb84a18518e5dc6e5b8fc60e670be6ac36584099afbb483f7ad59e9decc","impliedFormat":1},{"version":"a0aa647e153798624c2c32ca663611eb62ddd131596989648c357fd31a80a292","impliedFormat":1},{"version":"ea366ad80040319ca2ac495f4823fa271d330286525d57a043b6feed08ce7917","impliedFormat":1},{"version":"98bb229db2d81eaec4ba5ef6e7bbb77f24c424e63217bed49a951e9c6b518507","impliedFormat":1},{"version":"8bed77d37a236f90a1bcfce2591f172d009f55da48b45a7469ae0a80b9302404","impliedFormat":1},{"version":"c79ab4ce4944757c8e5f578b6a49e4d21c2736dc7f78d5cb395e3fa01495f8f2","impliedFormat":1},{"version":"469865ae2f24c9ee11bb589d5e28e2d9682ebd7ca9e06bd3643291b16e34f47d","impliedFormat":1},{"version":"dc9282104c64b6aec45b8e0952b5c1777f03f63761049dd60fbcbc35e2306848","impliedFormat":1},{"version":"f64b0687abbd6646ffc0763c102f6c1048527f62659777e9bb302a3e1ef00630","impliedFormat":1},{"version":"b85d57f7dfd39ab2b001ecc3312dfa05259192683a81880749cbca3b28772e42","impliedFormat":1},{"version":"7199dc8fd25c403c9c37acaf7958f75c2b06baaa04c2c8f6e2e28e445fd57d40","impliedFormat":1},{"version":"43725d63f81e18c630acecc5e502bbd5d2a747fff10011e844736544aa4457c0","impliedFormat":1},{"version":"535dfa7bb97e97d8ac5fff37bae9c09fe6a758b52ffd06d50f4dcfd4f273b3c1","impliedFormat":1},{"version":"a478585c9957e2fa7a12f4719861fcce56768e82b68211e293916206ee8d3a61","impliedFormat":1},{"version":"f69b9b72755f8e9731a3e910367f75e9b8572d30e80b5a993e431f36dfdae24f","impliedFormat":1},{"version":"059d51bf1161687e7f6374af419ae67ecfbdb81eebb3493108ddf0c4ece902e4","impliedFormat":1},{"version":"70271cdcd48eda39af5870abcb3471eee639f1c30c3522f54ac64a66abd6bb0e","impliedFormat":1},{"version":"34ca43f6999082790b1cccf8b749346d67dad44cbd2a394f7a68590cc9265481","impliedFormat":1},{"version":"0992833cc5115272e0af47c8caa9c452e2efadcfbdd54c13ec081d735bb0ada6","impliedFormat":1},{"version":"c519bbc76e9214a46c8d38a9875cbead73ea681e403b34b3ce7b86a38e3f7d9a","signature":"658d7ae3d7654cb926a4d20defc7b8ff80e4f07c48b72f8daf118ca1dbb19cf6","impliedFormat":99},{"version":"c53d58d8708c3e1d3f57e97b88c1971b51b548ddd6b20705f47e10e6ed12577a","signature":"8b66835eba52683e3c5f48eccb9d5a31778b4e95b41ac635b25d8fb0282cd166","impliedFormat":99},{"version":"f18d2c0f9a8516dd46993857b0e1a01a59f2a3c206b9dda34f8b6591bc930058","signature":"19b51e1c1c63e7051bae00394f80bfacc468950d983f2678a5d4e80909d19008","impliedFormat":99},{"version":"5eb770b7f7e542a2b5a2a377edefb1543744e3f4f5e8d24a1e13faa77686e211","signature":"6854e76635bde21cb52eaa988c2e20fbc3c877ad0c6036f79b5350b5906bf704","impliedFormat":99},{"version":"531861e32c6a099ad7a7a6820f3c26f09f55411abf3654c214e472eee50e3e45","signature":"a08bbe0aff62a8de841806581a30a67a391e950e90ded683b69974af0bbcbc4e","impliedFormat":99},{"version":"588cd6fd9f975d60b94607a28418d42db5e28d3cdce35a57076193fb3899bdd8","signature":"fa602d50be70549daa1500419fa23fe977f2c2e2b48a18ec1e16eb6880e0bf89","impliedFormat":99},{"version":"c61ad5da610be01b680164f5958745dcf8d75e4d15626a76adb6e9f741134ddf","signature":"d96e9b1b0b145aca5fcd23a5314c0de5366c67005e41a55402852a0989c44d85","impliedFormat":99},{"version":"70a9379af39f9e72b3b3268341aeebc5bb0d86ec16435dc3ad8077756233a0ca","signature":"9d41e3c58467f4067a508da67aea427f8cd13bb11456c2b68172211362646d80","impliedFormat":99},{"version":"aa23e65ddd492fd8f4e5c2d453065fc04aedfaaaeee1f2b9fa33b3905ed1aa5c","signature":"0f6589f61f915be1f2dbcb00c5293898d1faa94ad76f4b9c4401f1550bf62399","impliedFormat":99},{"version":"b5e7c5963f7c8955304ed5c2994f98ea0542817e74f083137bc3f043b5f10d62","signature":"12d98fc500d48c23d0524d56fd27992b9e4146da11716af88035ee996337b3b5","impliedFormat":99},{"version":"4f6aab233e7967d99d83a1b1f8b7c043ce7e9329adf914fa54db6e5e79af22ee","signature":"d471d2b608b690601abc2cbd9b87724a31893b14d574bad531d631d26c092e75","impliedFormat":99},{"version":"8fc9a176cb4e74ea95ae50ce99a669cccc94236f9fe8643fd7d33e73093dded5","signature":"0ca6c6d5cb1a05a085eb74a6d24ccf864c848bc5f559624860e66bf1d9ebc563","impliedFormat":99},{"version":"4a69e761fd74985ae4c6ecc32d5627880bf0b95f432f1225ecf840e930ef7fd7","signature":"22b692698d687f87da7975dabb0b9399804a261e07eab0d434b420947487782b","impliedFormat":99},{"version":"7dacd8aedbed2b2156ee2d2f50fa073e3f95da695829d583e1236d285de044ca","signature":"2842fc0b7f7ca9bd25a4608646c9ea2fcc46599625d6bbba4fc5386580982d0c","impliedFormat":99},{"version":"e07ee5cf3732a287d310da2194d1d02cfa0bd0ee48c46e156ad6e8ea6d3b38ee","signature":"37ef0e518e13b08cb91b2ae0dc450dcbd6144274e8c9ff3a2bfd1ed661a7688a","impliedFormat":99},{"version":"9a590cb8a7ab265767d67a6f0355f0027b4452e7625c53a5b36130a48974ab7e","signature":"a456b7c515115590cdba93d3f827e7c8626f37b2b8d7a0d6814131cd34f7a7da","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[[122,137]],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[95,1],[93,2],[80,3],[83,4],[81,5],[82,6],[84,6],[85,7],[86,8],[87,8],[88,9],[90,10],[92,11],[91,9],[96,6],[97,12],[98,9],[100,13],[99,14],[102,15],[101,6],[121,16],[64,9],[65,17],[73,18],[74,9],[75,17],[67,9],[72,19],[79,20],[66,9],[76,21],[94,22],[69,23],[71,24],[77,9],[68,9],[70,9],[78,9],[103,25],[104,6],[105,14],[89,26],[106,17],[108,27],[107,17],[109,9],[110,9],[111,28],[114,29],[115,30],[116,31],[113,32],[117,9],[120,33],[118,34],[119,9],[189,35],[190,35],[191,36],[143,37],[192,38],[193,39],[194,40],[138,9],[141,41],[139,9],[140,9],[195,42],[196,43],[197,44],[198,45],[199,46],[200,47],[201,47],[202,48],[203,49],[204,50],[205,51],[144,9],[142,9],[206,52],[207,53],[208,54],[242,55],[209,56],[210,9],[211,57],[212,58],[213,59],[214,60],[215,61],[216,62],[217,63],[218,64],[219,65],[220,65],[221,66],[222,9],[223,67],[224,68],[226,69],[225,70],[227,71],[228,72],[229,73],[230,74],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,81],[238,82],[239,83],[145,9],[146,9],[147,9],[186,84],[187,9],[188,9],[240,85],[241,86],[148,9],[112,9],[61,9],[62,9],[12,9],[10,9],[11,9],[16,9],[15,9],[2,9],[17,9],[18,9],[19,9],[20,9],[21,9],[22,9],[23,9],[24,9],[3,9],[25,9],[26,9],[4,9],[27,9],[31,9],[28,9],[29,9],[30,9],[32,9],[33,9],[34,9],[5,9],[35,9],[36,9],[37,9],[38,9],[6,9],[42,9],[39,9],[40,9],[41,9],[43,9],[7,9],[44,9],[49,9],[50,9],[45,9],[46,9],[47,9],[48,9],[8,9],[54,9],[51,9],[52,9],[53,9],[55,9],[9,9],[56,9],[63,9],[57,9],[58,9],[60,9],[59,9],[1,9],[14,9],[13,9],[164,87],[174,88],[163,87],[184,89],[155,90],[154,91],[183,92],[177,93],[182,94],[157,95],[171,96],[156,97],[180,98],[152,99],[151,92],[181,100],[153,101],[158,102],[159,9],[162,102],[149,9],[185,103],[175,104],[166,105],[167,106],[169,107],[165,108],[168,109],[178,92],[160,110],[161,111],[170,112],[150,113],[173,104],[172,102],[176,9],[179,114],[123,115],[124,115],[131,115],[132,115],[133,115],[134,115],[135,115],[136,115],[137,115],[125,116],[126,115],[127,115],[128,115],[129,115],[130,115],[122,115],[243,117],[244,9]],"latestChangedDtsFile":"./dist/utils/index.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts index a8cf5d1..07262ab 100644 --- a/packages/cli/vitest.config.ts +++ b/packages/cli/vitest.config.ts @@ -2,11 +2,11 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { + // https://oclif.io/docs/testing/#capturing-stdout-and-stderr-with-vitest + disableConsoleIntercept: true, environment: 'node', - include: ['test/**/*.test.ts'], globals: true, - setupFiles: ['./test/setup.ts'], - // https://oclif.io/docs/testing/#capturing-stdout-and-stderr-with-vitest - disableConsoleIntercept: true + include: ['test/**/*.test.ts'], + setupFiles: ['./test/setup.ts'] } -}) +}); diff --git a/packages/schemas/.gitignore b/packages/schemas/.gitignore new file mode 100644 index 0000000..c925c21 --- /dev/null +++ b/packages/schemas/.gitignore @@ -0,0 +1,2 @@ +/dist +/node_modules diff --git a/packages/schemas/json-schema/link-config.json b/packages/schemas/json-schema/link-config.json new file mode 100644 index 0000000..5cfb033 --- /dev/null +++ b/packages/schemas/json-schema/link-config.json @@ -0,0 +1,42 @@ +{ + "definitions": {}, + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "cloud" + }, + "instance_id": { + "type": "string" + }, + "org_id": { + "type": "string" + }, + "project_id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["type"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "self-hosted" + }, + "api_url": { + "type": "string" + }, + "api_key": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["type"] + } + ] +} diff --git a/packages/schemas/package.json b/packages/schemas/package.json new file mode 100644 index 0000000..e88e3b7 --- /dev/null +++ b/packages/schemas/package.json @@ -0,0 +1,28 @@ +{ + "name": "@powersync/cli-schemas", + "description": "PowerSync CLI schema definitions and JSON Schema generation", + "version": "0.0.0", + "author": "POWERSYNC", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist", + "json-schema" + ], + "scripts": { + "build": "shx rm -rf dist && tsc -b && tsx scripts/create-schemas.ts" + }, + "dependencies": { + "ts-codec": "^1.3.0" + }, + "devDependencies": { + "@types/node": "^22", + "shx": "^0.3.3", + "tsx": "^4", + "typescript": "^5" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/packages/schemas/scripts/create-schemas.ts b/packages/schemas/scripts/create-schemas.ts new file mode 100644 index 0000000..7203154 --- /dev/null +++ b/packages/schemas/scripts/create-schemas.ts @@ -0,0 +1,13 @@ +import { mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import * as t from 'ts-codec'; +import { LinkConfig } from '../src/LinkConfig.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const schemaDir = join(__dirname, '..', 'json-schema'); + +mkdirSync(schemaDir, { recursive: true }); + +const linkConfigSchema = t.generateJSONSchema(LinkConfig); +writeFileSync(join(schemaDir, 'link-config.json'), JSON.stringify(linkConfigSchema, null, 2)); diff --git a/packages/schemas/src/LinkConfig.ts b/packages/schemas/src/LinkConfig.ts new file mode 100644 index 0000000..8116bca --- /dev/null +++ b/packages/schemas/src/LinkConfig.ts @@ -0,0 +1,34 @@ +import * as t from 'ts-codec'; + +export const CloudLinkConfig = t.object({ + type: t.literal('cloud'), + instance_id: t.string.optional(), + org_id: t.string.optional(), + project_id: t.string.optional() +}); + +export const RequiredCloudLinkConfig = t.object({ + type: t.literal('cloud'), + instance_id: t.string, + org_id: t.string, + project_id: t.string +}); + +export type RequiredCloudLinkConfig = t.Encoded; + +export const SelfHostedLinkConfig = t.object({ + type: t.literal('self-hosted'), + api_url: t.string.optional(), + api_key: t.string.optional() +}); + +export const RequiredSelfHostedLinkConfig = t.object({ + type: t.literal('self-hosted'), + api_url: t.string, + api_key: t.string +}); + +export type RequiredSelfHostedLinkConfig = t.Encoded; + +export const LinkConfig = CloudLinkConfig.or(SelfHostedLinkConfig); +export type LinkConfig = t.Encoded; diff --git a/packages/schemas/src/index.ts b/packages/schemas/src/index.ts new file mode 100644 index 0000000..9a9934a --- /dev/null +++ b/packages/schemas/src/index.ts @@ -0,0 +1,2 @@ +export { CloudLinkConfig, LinkConfig, SelfHostedLinkConfig } from './LinkConfig.js'; +export type { LinkConfig as LinkConfigType } from './LinkConfig.js'; diff --git a/packages/schemas/tsconfig.json b/packages/schemas/tsconfig.json new file mode 100644 index 0000000..11f9f9d --- /dev/null +++ b/packages/schemas/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "declaration": true, + "module": "Node16", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "target": "es2022", + "moduleResolution": "node16", + "composite": true + }, + "include": ["./src/**/*"] +} diff --git a/packages/schemas/tsconfig.tsbuildinfo b/packages/schemas/tsconfig.tsbuildinfo new file mode 100644 index 0000000..b1cefac --- /dev/null +++ b/packages/schemas/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/definitions.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/definitions.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/generator.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/combinators.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/primitives.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/recursive.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/objects.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/arrays.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/root.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/index.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/utils.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/index.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/combinators.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/primitives.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/recursive.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/arrays.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/codec.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/maps.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/utils.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/index.d.ts","./src/linkconfig.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[91,137,138,140,157,158],[91,139,140,157,158],[140,157,158],[91,140,145,157,158,175],[91,140,141,146,151,157,158,160,172,183],[91,140,141,142,151,157,158,160],[91,140,157,158],[86,87,88,91,140,157,158],[91,140,143,157,158,184],[91,140,144,145,152,157,158,161],[91,140,145,157,158,172,180],[91,140,146,148,151,157,158,160],[91,139,140,147,157,158],[91,140,148,149,157,158],[91,140,150,151,157,158],[91,139,140,151,157,158],[91,140,151,152,153,157,158,172,183],[91,140,151,152,153,157,158,167,172,175],[91,133,140,148,151,154,157,158,160,172,183],[91,140,151,152,154,155,157,158,160,172,180,183],[91,140,154,156,157,158,172,180,183],[89,90,91,92,93,94,95,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189],[91,140,151,157,158],[91,140,157,158,159,183],[91,140,148,151,157,158,160,172],[91,140,157,158,161],[91,140,157,158,162],[91,139,140,157,158,163],[91,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189],[91,140,157,158,165],[91,140,157,158,166],[91,140,151,157,158,167,168],[91,140,157,158,167,169,184,186],[91,140,152,157,158],[91,140,151,157,158,172,173,175],[91,140,157,158,174,175],[91,140,157,158,172,173],[91,140,157,158,175],[91,140,157,158,176],[91,137,140,157,158,172,177],[91,140,151,157,158,178,179],[91,140,157,158,178,179],[91,140,145,157,158,160,172,180],[91,140,157,158,181],[91,140,157,158,160,182],[91,140,154,157,158,166,183],[91,140,145,157,158,184],[91,140,157,158,172,185],[91,140,157,158,159,186],[91,140,157,158,187],[91,133,140,157,158],[91,133,140,151,153,157,158,163,172,175,183,185,186,188],[91,140,157,158,172,189],[64,75,76,77,78,79,80,81,82,91,140,157,158],[64,91,140,157,158],[64,65,91,140,157,158],[65,66,73,74,91,140,157,158],[64,75,91,140,157,158],[67,68,69,70,71,72,91,140,157,158],[91,105,109,140,157,158,183],[91,105,140,157,158,172,183],[91,100,140,157,158],[91,102,105,140,157,158,180,183],[91,140,157,158,160,180],[91,140,157,158,190],[91,100,140,157,158,190],[91,102,105,140,157,158,160,183],[91,97,98,101,104,140,151,157,158,172,183],[91,105,112,140,157,158],[91,97,103,140,157,158],[91,105,126,127,140,157,158],[91,101,105,140,157,158,175,183,190],[91,126,140,157,158,190],[91,99,100,140,157,158,190],[91,105,140,157,158],[91,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,132,140,157,158],[91,105,120,140,157,158],[91,105,112,113,140,157,158],[91,103,105,113,114,140,157,158],[91,104,140,157,158],[91,97,100,105,140,157,158],[91,105,109,113,114,140,157,158],[91,109,140,157,158],[91,103,105,108,140,157,158,183],[91,97,102,105,112,140,157,158],[91,140,157,158,172],[91,100,105,126,140,157,158,188,190],[84,91,140,157,158],[83,91,140,157,158],[91,140,152,157,158,190]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"5675eb00d305c8dbefa6190fbc5407cd169d48f9049ac610506a5d09a8d6724a","impliedFormat":1},{"version":"95e8f479cf41319bd14150ac2ce291217a8002ecc39d16f1f7a3e408d86ee455","impliedFormat":1},{"version":"d2cd28c5a1f5a7853888cfc9645aef2e5c003f1322f7a66b5aff8d7f5e835f59","impliedFormat":1},{"version":"0fb7e2fd9a55a699b721005f9b971bb102b8bfe6aba92b0431d974b542fdabd7","impliedFormat":1},{"version":"8db3b7b47410ccabea0234d975dffea72f5ed4586305dc54b22a164721804cc5","impliedFormat":1},{"version":"3c33b043fbba511e7af9b21cf6ffdfd77a5b33114cf13bcd93871545bdbcc5cb","impliedFormat":1},{"version":"fffd95262f9eaa6988088f5b3fefed8af0719d60e913e63f6fbe724eba3f118d","impliedFormat":1},{"version":"3c683aee5744dedcb460b2e1c47804f4010ac8fba73f3093f88ccbb013a3c678","impliedFormat":1},{"version":"51ebb8f5a78bf7b58c0479fd51a3d39c1f91075a6a31620c3e510e6295ef43f1","impliedFormat":1},{"version":"a34327c4c9e71742f9248374e9506fb555d724121ddbd57e45e14cc9ee99e857","impliedFormat":1},{"version":"28febab4f39ed27ad0bac2705f35d83a434c74a3c49328f02f7d2a813ac937ab","impliedFormat":1},{"version":"dfe421b0e52e642279c9ebb5473acf33c091d5714ac09b75592067ee641deff2","impliedFormat":1},{"version":"1e737e690ee03096c261b2bb66ebd88c9b9406d41669b6f0257a044554c02369","impliedFormat":1},{"version":"7e7315b099cdfb23431d39759f6d7942201758ac98fc1c85f464453065d9ab62","impliedFormat":1},{"version":"cf95c55d326a751f162723f17a88a499399dc288729ce8b8568baaff249425ba","impliedFormat":1},{"version":"4cde2fc9f63efcd3c7a22f47f7e57dcbc69a2ca3656bda166493105d8ec218b9","impliedFormat":1},{"version":"c033fbb15d3cbab3e5f1e5faea532498dd48ace23de65c66c47c93296add9484","impliedFormat":1},{"version":"cdb9157390c893812916732a2f237741bd08d7503a5d9d1589d8a8d5161f3a16","impliedFormat":1},{"version":"7bb3f2b3ec9ce1edde70b97af16f0cc2d55ef8c31b2f2d5fde7f2834dcaa7a9e","impliedFormat":1},{"version":"a22b4fc7c03f685be422cc8ed799a2a9b7218d28a9f20dfe27f45396c7e58036","impliedFormat":1},{"version":"59830dd3f9eff0e8b68a2892394777f358e4c86f9e318081a7539e5e1b16c764","signature":"c35f10cca59ad465ae3464c5babd50cac1ec62d0ae9d5c0924a8b8ec7057d45b","impliedFormat":99},{"version":"332b6550d09e92cb5cd03499a3c46bda9afacf417c7d9b6db4a247a20ea776d0","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[84,85],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[137,1],[138,1],[139,2],[91,3],[140,4],[141,5],[142,6],[86,7],[89,8],[87,7],[88,7],[143,9],[144,10],[145,11],[146,12],[147,13],[148,14],[149,14],[150,15],[151,16],[152,17],[153,18],[92,7],[90,7],[154,19],[155,20],[156,21],[190,22],[157,23],[158,7],[159,24],[160,25],[161,26],[162,27],[163,28],[164,29],[165,30],[166,31],[167,32],[168,32],[169,33],[170,7],[171,34],[172,35],[174,36],[173,37],[175,38],[176,39],[177,40],[178,41],[179,42],[180,43],[181,44],[182,45],[183,46],[184,47],[185,48],[186,49],[187,50],[93,7],[94,7],[95,7],[134,51],[135,7],[136,7],[188,52],[189,53],[96,7],[64,7],[83,54],[65,55],[66,56],[75,57],[71,58],[67,58],[73,59],[70,58],[68,58],[69,58],[72,56],[74,56],[79,55],[80,55],[76,55],[81,55],[77,55],[78,55],[82,55],[61,7],[62,7],[12,7],[10,7],[11,7],[16,7],[15,7],[2,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[24,7],[3,7],[25,7],[26,7],[4,7],[27,7],[31,7],[28,7],[29,7],[30,7],[32,7],[33,7],[34,7],[5,7],[35,7],[36,7],[37,7],[38,7],[6,7],[42,7],[39,7],[40,7],[41,7],[43,7],[7,7],[44,7],[49,7],[50,7],[45,7],[46,7],[47,7],[48,7],[8,7],[54,7],[51,7],[52,7],[53,7],[55,7],[9,7],[56,7],[63,7],[57,7],[58,7],[60,7],[59,7],[1,7],[14,7],[13,7],[112,60],[122,61],[111,60],[132,62],[103,63],[102,64],[131,65],[125,66],[130,67],[105,68],[119,69],[104,70],[128,71],[100,72],[99,65],[129,73],[101,74],[106,75],[107,7],[110,75],[97,7],[133,76],[123,77],[114,78],[115,79],[117,80],[113,81],[116,82],[126,65],[108,83],[109,84],[118,85],[98,86],[121,77],[120,75],[124,7],[127,87],[85,88],[84,89],[191,90],[192,7]],"latestChangedDtsFile":"./dist/LinkConfig.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09cc468..a612a60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,13 @@ importers: version: 5.4.55 '@powersync/management-types': specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types - version: file:../service/powersync-hosted/public-packages/types(yaml@2.8.2) + version: file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2) + ts-codec: + specifier: ^1.3.0 + version: 1.3.0 + yaml: + specifier: ^2 + version: 2.8.2 devDependencies: '@eslint/compat': specifier: ^1 @@ -40,8 +46,8 @@ importers: specifier: ^4 version: 4.1.16(@oclif/core@4.8.0) '@types/node': - specifier: ^22 - version: 22.19.7 + specifier: ^18 + version: 18.19.130 eslint: specifier: ^9 version: 9.39.2 @@ -53,19 +59,38 @@ importers: version: 10.1.8(eslint@9.39.2) oclif: specifier: ^4 - version: 4.22.73(@types/node@22.19.7) + version: 4.22.73(@types/node@18.19.130) shx: specifier: ^0.3.3 version: 0.3.4 ts-node: specifier: ^10 - version: 10.9.2(@types/node@22.19.7)(typescript@5.9.3) + version: 10.9.2(@types/node@18.19.130)(typescript@5.9.3) typescript: specifier: ^5 version: 5.9.3 vitest: specifier: ^4.0.0 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + + packages/schemas: + dependencies: + ts-codec: + specifier: ^1.3.0 + version: 1.3.0 + devDependencies: + '@types/node': + specifier: ^22 + version: 22.19.7 + shx: + specifier: ^0.3.3 + version: 0.3.4 + tsx: + specifier: ^4 + version: 4.21.0 + typescript: + specifier: ^5 + version: 5.9.3 packages: @@ -1371,6 +1396,9 @@ packages: '@types/node@15.14.9': resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} @@ -3681,6 +3709,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3736,6 +3769,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -4902,40 +4938,40 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@22.19.7)': + '@inquirer/checkbox@4.3.2(@types/node@18.19.130)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@18.19.130) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@inquirer/confirm@3.2.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/confirm@5.1.21(@types/node@22.19.7)': + '@inquirer/confirm@5.1.21(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/core@10.3.2(@types/node@22.19.7)': + '@inquirer/core@10.3.2(@types/node@18.19.130)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@18.19.130) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@inquirer/core@9.2.1': dependencies: @@ -4952,28 +4988,28 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 - '@inquirer/editor@4.2.23(@types/node@22.19.7)': + '@inquirer/editor@4.2.23(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/external-editor': 1.0.3(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/external-editor': 1.0.3(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/expand@4.0.23(@types/node@22.19.7)': + '@inquirer/expand@4.0.23(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/external-editor@1.0.3(@types/node@22.19.7)': + '@inquirer/external-editor@1.0.3(@types/node@18.19.130)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@inquirer/figures@1.0.15': {} @@ -4982,59 +5018,59 @@ snapshots: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/input@4.3.1(@types/node@22.19.7)': + '@inquirer/input@4.3.1(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/number@3.0.23(@types/node@22.19.7)': + '@inquirer/number@3.0.23(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/password@4.0.23(@types/node@22.19.7)': + '@inquirer/password@4.0.23(@types/node@18.19.130)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 - - '@inquirer/prompts@7.10.1(@types/node@22.19.7)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.7) - '@inquirer/confirm': 5.1.21(@types/node@22.19.7) - '@inquirer/editor': 4.2.23(@types/node@22.19.7) - '@inquirer/expand': 4.0.23(@types/node@22.19.7) - '@inquirer/input': 4.3.1(@types/node@22.19.7) - '@inquirer/number': 3.0.23(@types/node@22.19.7) - '@inquirer/password': 4.0.23(@types/node@22.19.7) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.7) - '@inquirer/search': 3.2.2(@types/node@22.19.7) - '@inquirer/select': 4.4.2(@types/node@22.19.7) + '@types/node': 18.19.130 + + '@inquirer/prompts@7.10.1(@types/node@18.19.130)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@18.19.130) + '@inquirer/confirm': 5.1.21(@types/node@18.19.130) + '@inquirer/editor': 4.2.23(@types/node@18.19.130) + '@inquirer/expand': 4.0.23(@types/node@18.19.130) + '@inquirer/input': 4.3.1(@types/node@18.19.130) + '@inquirer/number': 3.0.23(@types/node@18.19.130) + '@inquirer/password': 4.0.23(@types/node@18.19.130) + '@inquirer/rawlist': 4.1.11(@types/node@18.19.130) + '@inquirer/search': 3.2.2(@types/node@18.19.130) + '@inquirer/select': 4.4.2(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/rawlist@4.1.11(@types/node@22.19.7)': + '@inquirer/rawlist@4.1.11(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@inquirer/search@3.2.2(@types/node@22.19.7)': + '@inquirer/search@3.2.2(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@18.19.130) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@inquirer/select@2.5.0': dependencies: @@ -5044,15 +5080,15 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/select@4.4.2(@types/node@22.19.7)': + '@inquirer/select@4.4.2(@types/node@18.19.130)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/core': 10.3.2(@types/node@18.19.130) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@18.19.130) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@inquirer/type@1.5.5': dependencies: @@ -5062,16 +5098,16 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.10(@types/node@22.19.7)': + '@inquirer/type@3.0.10(@types/node@18.19.130)': optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 - '@journeyapps-labs/micro-codecs@1.0.1(yaml@2.8.2)': + '@journeyapps-labs/micro-codecs@1.0.1(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/node': 24.10.10 bson: 6.10.4 ts-codec: 1.3.0 - vitest: 3.2.4(@types/node@24.10.10)(yaml@2.8.2) + vitest: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@edge-runtime/vm' - '@types/debug' @@ -5139,9 +5175,9 @@ snapshots: dependencies: '@oclif/core': 4.8.0 - '@oclif/plugin-not-found@3.2.74(@types/node@22.19.7)': + '@oclif/plugin-not-found@3.2.74(@types/node@18.19.130)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@22.19.7) + '@inquirer/prompts': 7.10.1(@types/node@18.19.130) '@oclif/core': 4.8.0 ansis: 3.17.0 fast-levenshtein: 3.0.0 @@ -5301,9 +5337,9 @@ snapshots: winston: 3.19.0 zod: 3.25.76 - '@powersync/management-types@file:../service/powersync-hosted/public-packages/types(yaml@2.8.2)': + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2)': dependencies: - '@journeyapps-labs/micro-codecs': 1.0.1(yaml@2.8.2) + '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0)(yaml@2.8.2) '@powersync/service-module-mssql': 0.1.2 '@powersync/service-types': 0.13.3 bson: 6.10.4 @@ -5928,12 +5964,16 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@types/node@13.13.52': {} '@types/node@15.14.9': {} + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + '@types/node@22.19.7': dependencies: undici-types: 6.21.0 @@ -5946,7 +5986,7 @@ snapshots: '@types/readable-stream@4.0.23': dependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 '@types/triple-beam@1.3.5': {} @@ -6127,21 +6167,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -7821,7 +7861,7 @@ snapshots: obug@2.1.1: {} - oclif@4.22.73(@types/node@22.19.7): + oclif@4.22.73(@types/node@18.19.130): dependencies: '@aws-sdk/client-cloudfront': 3.980.0 '@aws-sdk/client-s3': 3.980.0 @@ -7830,7 +7870,7 @@ snapshots: '@inquirer/select': 2.5.0 '@oclif/core': 4.8.0 '@oclif/plugin-help': 6.2.37 - '@oclif/plugin-not-found': 3.2.74(@types/node@22.19.7) + '@oclif/plugin-not-found': 3.2.74(@types/node@18.19.130) '@oclif/plugin-warn-if-update-available': 3.1.55 ansis: 3.17.0 async-retry: 1.3.3 @@ -7996,7 +8036,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.7 + '@types/node': 18.19.130 long: 5.3.2 punycode@2.3.1: {} @@ -8365,7 +8405,7 @@ snapshots: '@azure/identity': 4.13.0 '@azure/keyvault-keys': 4.10.0 '@js-joda/core': 5.7.0 - '@types/node': 22.19.7 + '@types/node': 18.19.130 bl: 6.1.6 iconv-lite: 0.7.2 js-md4: 0.3.2 @@ -8414,14 +8454,14 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 - ts-node@10.9.2(@types/node@22.19.7)(typescript@5.9.3): + ts-node@10.9.2(@types/node@18.19.130)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.7 + '@types/node': 18.19.130 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -8441,6 +8481,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.1 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -8510,6 +8557,8 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} + undici-types@6.21.0: {} undici-types@7.16.0: {} @@ -8575,13 +8624,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@24.10.10)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.10.10)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -8596,7 +8645,7 @@ snapshots: - tsx - yaml - vite@7.3.1(@types/node@22.19.7)(yaml@2.8.2): + vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -8605,11 +8654,12 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 18.19.130 fsevents: 2.3.3 + tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2): + vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -8620,13 +8670,14 @@ snapshots: optionalDependencies: '@types/node': 24.10.10 fsevents: 2.3.3 + tsx: 4.21.0 yaml: 2.8.2 - vitest@3.2.4(@types/node@24.10.10)(yaml@2.8.2): + vitest@3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8644,8 +8695,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.10.10)(yaml@2.8.2) + vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.10.10 @@ -8663,10 +8714,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.10)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -8683,11 +8734,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@22.19.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 22.19.7 + '@types/node': 18.19.130 transitivePeerDependencies: - jiti - less From f8021cab3fdc5ebee39c66ef3e13254189dd698a Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Tue, 3 Feb 2026 17:33:16 +0200 Subject: [PATCH 004/141] wip: linking --- .../cli/src/command-types/InstanceCommand.ts | 35 ++++ packages/cli/src/commands/init.ts | 11 +- packages/cli/src/commands/link/cloud.ts | 37 ++--- packages/cli/src/commands/link/index.ts | 2 - packages/cli/src/commands/link/self-hosted.ts | 34 ++-- packages/cli/src/utils/flags.ts | 12 -- packages/cli/src/utils/loadLinkDoc.ts | 15 ++ packages/cli/test/commands/init.test.ts | 5 +- packages/cli/test/commands/link.test.ts | 155 ++++++++++++++++++ packages/cli/tsconfig.tsbuildinfo | 1 - 10 files changed, 240 insertions(+), 67 deletions(-) create mode 100644 packages/cli/src/command-types/InstanceCommand.ts delete mode 100644 packages/cli/src/utils/flags.ts create mode 100644 packages/cli/src/utils/loadLinkDoc.ts create mode 100644 packages/cli/test/commands/link.test.ts delete mode 100644 packages/cli/tsconfig.tsbuildinfo diff --git a/packages/cli/src/command-types/InstanceCommand.ts b/packages/cli/src/command-types/InstanceCommand.ts new file mode 100644 index 0000000..5c976ad --- /dev/null +++ b/packages/cli/src/command-types/InstanceCommand.ts @@ -0,0 +1,35 @@ +import { Command, Flags } from '@oclif/core'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; + +/** Base command for operations that target a PowerSync project directory (e.g. link, init). */ +export abstract class InstanceCommand extends Command { + static flags = { + directory: Flags.string({ + default: 'powersync', + description: 'Directory containing PowerSync config (default: powersync).' + }) + }; + + /** + * Resolves the project directory and ensures it exists. + * Calls this.error and exits if the directory is missing. + * @returns The resolved absolute path to the project directory. + */ + ensureProjectDirExists(directory: string): string { + const projectDir = this.resolveProjectDir(directory); + + if (!existsSync(projectDir)) { + this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { + exit: 1 + }); + } + + return projectDir; + } + + /** Resolves the project directory path from the --directory flag (relative to cwd). */ + resolveProjectDir(directory: string): string { + return join(process.cwd(), directory); + } +} diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 6c7a8e5..c072f92 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -1,20 +1,20 @@ -import { Command, Flags } from '@oclif/core'; +import { Flags } from '@oclif/core'; import { cpSync, existsSync, mkdirSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { commonFlags } from '../utils/flags.js'; +import { InstanceCommand } from '../command-types/InstanceCommand.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); /** Absolute path to templates (package root when running from dist/commands/ or src/commands/). */ const TEMPLATES_DIR = join(__dirname, '..', '..', 'templates'); -export default class Init extends Command { +export default class Init extends InstanceCommand { static description = 'Creates a new PowerSync project in the current directory. Supports --type=cloud or self-hosted.'; static flags = { - ...commonFlags, + ...InstanceCommand.flags, type: Flags.string({ default: 'cloud', description: 'Type of PowerSync instance to scaffold.', @@ -27,8 +27,7 @@ export default class Init extends Command { const { flags } = await this.parse(Init); const { directory, type } = flags; - const cwd = process.cwd(); - const targetDir = join(cwd, directory); + const targetDir = this.resolveProjectDir(directory); if (existsSync(targetDir)) { this.error( diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index 5d74e7e..74ec645 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -1,19 +1,20 @@ -import { Command, Flags } from '@oclif/core'; -import { existsSync, writeFileSync } from 'node:fs'; +import { Flags } from '@oclif/core'; +import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -import { stringify as stringifyYaml } from 'yaml'; -import { commonFlags } from '../../utils/flags.js'; +import { InstanceCommand } from '../../command-types/InstanceCommand.js'; +import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; const LINK_FILENAME = 'link.yaml'; -export default class LinkCloud extends Command { +export default class LinkCloud extends InstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; - static enableStrictArgs = true; - static flags = { - ...commonFlags, + ...InstanceCommand.flags, + /** + * TODO, we could default these to the values used after login + */ 'instance-id': Flags.string({ description: 'PowerSync Cloud instance ID.', required: true @@ -32,21 +33,15 @@ export default class LinkCloud extends Command { const { flags } = await this.parse(LinkCloud); const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; - const projectDir = join(process.cwd(), directory); - if (!existsSync(projectDir)) { - this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { - exit: 1 - }); - } + const projectDir = this.ensureProjectDirExists(directory); const linkPath = join(projectDir, LINK_FILENAME); - const config = { - type: 'cloud' as const, - instance_id: instanceId, - org_id: orgId, - project_id: projectId - }; - writeFileSync(linkPath, stringifyYaml(config), 'utf8'); + const doc = loadLinkDocument(linkPath); + doc.set('type', 'cloud'); + doc.set('instance_id', instanceId); + doc.set('org_id', orgId); + doc.set('project_id', projectId); + writeFileSync(linkPath, doc.toString(), 'utf8'); this.log(`Updated ${directory}/${LINK_FILENAME} with Cloud instance link.`); } } diff --git a/packages/cli/src/commands/link/index.ts b/packages/cli/src/commands/link/index.ts index 4f4c45d..69a47e7 100644 --- a/packages/cli/src/commands/link/index.ts +++ b/packages/cli/src/commands/link/index.ts @@ -4,8 +4,6 @@ export default class Link extends Command { static description = "Associates a PowerSync instance with this directory's config. Use a subcommand for cloud or self-hosted."; static summary = 'Link configuration to a PowerSync instance.'; - static enableStrictArgs = true; - async run(): Promise { await this.parse(Link); this.log('Use a subcommand: link cloud | link self-hosted'); diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index 4d0c02e..ff15b82 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -1,26 +1,24 @@ -import { Command, Flags } from '@oclif/core'; -import { existsSync, writeFileSync } from 'node:fs'; +import { Flags } from '@oclif/core'; +import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -import { stringify as stringifyYaml } from 'yaml'; -import { commonFlags } from '../../utils/flags.js'; +import { InstanceCommand } from '../../command-types/InstanceCommand.js'; +import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; const LINK_FILENAME = 'link.yaml'; -export default class LinkSelfHosted extends Command { +export default class LinkSelfHosted extends InstanceCommand { static description = 'Link this directory to a self-hosted PowerSync instance.'; static summary = 'Link to self-hosted PowerSync (API URL and token).'; - static enableStrictArgs = true; - static flags = { - ...commonFlags, + ...InstanceCommand.flags, url: Flags.string({ description: 'Self-hosted PowerSync API base URL (e.g. https://powersync.example.com).', required: true }), 'api-key': Flags.string({ description: 'API key / token for the self-hosted instance.', - required: true + default: '!env POWERSYNC_API_KEY' }) }; @@ -28,20 +26,14 @@ export default class LinkSelfHosted extends Command { const { flags } = await this.parse(LinkSelfHosted); const { directory, url, 'api-key': apiKey } = flags; - const projectDir = join(process.cwd(), directory); - if (!existsSync(projectDir)) { - this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { - exit: 1 - }); - } + const projectDir = this.ensureProjectDirExists(directory); const linkPath = join(projectDir, LINK_FILENAME); - const config = { - type: 'self-hosted' as const, - api_url: url, - api_key: apiKey - }; - writeFileSync(linkPath, stringifyYaml(config), 'utf8'); + const doc = loadLinkDocument(linkPath); + doc.set('type', 'self-hosted'); + doc.set('api_url', url); + doc.set('api_key', apiKey); + writeFileSync(linkPath, doc.toString(), 'utf8'); this.log(`Updated ${directory}/${LINK_FILENAME} with self-hosted link.`); } } diff --git a/packages/cli/src/utils/flags.ts b/packages/cli/src/utils/flags.ts deleted file mode 100644 index b83a14c..0000000 --- a/packages/cli/src/utils/flags.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Flags } from '@oclif/core'; - -/** Directory containing PowerSync config (default: powersync). Used by init and link. */ -export const directoryFlag = Flags.string({ - default: 'powersync', - description: 'Directory containing PowerSync config (default: powersync).' -}); - -/** Shared flags for commands that target a PowerSync project directory. */ -export const commonFlags = { - directory: directoryFlag -}; diff --git a/packages/cli/src/utils/loadLinkDoc.ts b/packages/cli/src/utils/loadLinkDoc.ts new file mode 100644 index 0000000..83d826b --- /dev/null +++ b/packages/cli/src/utils/loadLinkDoc.ts @@ -0,0 +1,15 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { Document, parseDocument } from 'yaml'; + +/** + * Loads link.yaml as a YAML Document so it can be updated in place (preserving comments). + * If the file does not exist, returns a new empty Document. + */ +export function loadLinkDocument(linkPath: string): Document { + const content = existsSync(linkPath) ? readFileSync(linkPath, 'utf8') : ''; + const doc = content ? parseDocument(content) : new Document({}); + if (doc.contents === null) { + doc.contents = doc.createNode({}) as Document['contents']; + } + return doc; +} diff --git a/packages/cli/test/commands/init.test.ts b/packages/cli/test/commands/init.test.ts index 45ef8c8..969e061 100644 --- a/packages/cli/test/commands/init.test.ts +++ b/packages/cli/test/commands/init.test.ts @@ -71,10 +71,7 @@ describe('init', () => { }); it('creates self-hosted project with --type=self-hosted', async () => { - const { stdout } = await runCommand( - `init --type=self-hosted --directory=${CUSTOM_DIR}`, - { root } - ); + const { stdout } = await runCommand(`init --type=self-hosted --directory=${CUSTOM_DIR}`, { root }); expect(stdout).toContain(`Created PowerSync self-hosted project`); const projectDir = join(tmpDir, CUSTOM_DIR); const serviceYamlPath = join(projectDir, 'service.yaml'); diff --git a/packages/cli/test/commands/link.test.ts b/packages/cli/test/commands/link.test.ts new file mode 100644 index 0000000..9a0442e --- /dev/null +++ b/packages/cli/test/commands/link.test.ts @@ -0,0 +1,155 @@ +import { runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { parse as parseYaml } from 'yaml'; + +import { root } from '../helpers/root.js'; + +const LINK_FILENAME = 'link.yaml'; +const PROJECT_DIR = 'powersync'; + +describe('link', () => { + describe('cloud', () => { + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'link-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('link cloud --instance-id=inst --org-id=org --project-id=proj', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('creates link.yaml with cloud config when directory exists', async () => { + mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); + const { stdout } = await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { + root + }); + expect(stdout).toContain(`Updated ${PROJECT_DIR}/${LINK_FILENAME} with Cloud instance link.`); + const linkPath = join(tmpDir, PROJECT_DIR, LINK_FILENAME); + expect(existsSync(linkPath)).toBe(true); + const linkYaml = parseYaml(readFileSync(linkPath, 'utf8')); + expect(linkYaml.type).toBe('cloud'); + expect(linkYaml.instance_id).toBe('inst-1'); + expect(linkYaml.org_id).toBe('org-1'); + expect(linkYaml.project_id).toBe('proj-1'); + }); + + it('updates existing link.yaml and preserves comments', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + const linkPath = join(projectDir, LINK_FILENAME); + const withComments = `# Managed by PowerSync CLI +# Run powersync link --help for info +type: cloud +`; + writeFileSync(linkPath, withComments, 'utf8'); + await runCommand('link cloud --instance-id=new-inst --org-id=new-org --project-id=new-proj', { root }); + const content = readFileSync(linkPath, 'utf8'); + expect(content).toContain('# Managed by PowerSync CLI'); + expect(content).toContain('# Run powersync link --help for info'); + const linkYaml = parseYaml(content); + expect(linkYaml.type).toBe('cloud'); + expect(linkYaml.instance_id).toBe('new-inst'); + expect(linkYaml.org_id).toBe('new-org'); + expect(linkYaml.project_id).toBe('new-proj'); + }); + + it('respects --directory flag', async () => { + const customDir = 'my-powersync'; + mkdirSync(join(tmpDir, customDir), { recursive: true }); + const { stdout } = await runCommand( + `link cloud --directory=${customDir} --instance-id=i --org-id=o --project-id=p`, + { root } + ); + expect(stdout).toContain(`Updated ${customDir}/${LINK_FILENAME}`); + const linkYaml = parseYaml(readFileSync(join(tmpDir, customDir, LINK_FILENAME), 'utf8')); + expect(linkYaml.type).toBe('cloud'); + expect(linkYaml.instance_id).toBe('i'); + }); + }); + + describe('self-hosted', () => { + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'link-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('link self-hosted --url=https://ps.example.com --api-key=secret', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('creates link.yaml with self-hosted config when directory exists', async () => { + mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); + const { stdout } = await runCommand('link self-hosted --url=https://sync.example.com --api-key=my-token', { + root + }); + expect(stdout).toContain(`Updated ${PROJECT_DIR}/${LINK_FILENAME} with self-hosted link.`); + const linkPath = join(tmpDir, PROJECT_DIR, LINK_FILENAME); + expect(existsSync(linkPath)).toBe(true); + const linkYaml = parseYaml(readFileSync(linkPath, 'utf8')); + expect(linkYaml.type).toBe('self-hosted'); + expect(linkYaml.api_url).toBe('https://sync.example.com'); + expect(linkYaml.api_key).toBe('my-token'); + }); + + it('updates existing link.yaml and preserves comments', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + const linkPath = join(projectDir, LINK_FILENAME); + const withComments = `# Self-hosted config +type: self-hosted +`; + writeFileSync(linkPath, withComments, 'utf8'); + await runCommand('link self-hosted --url=https://new.example.com --api-key=new-key', { root }); + const content = readFileSync(linkPath, 'utf8'); + expect(content).toContain('# Self-hosted config'); + const linkYaml = parseYaml(content); + expect(linkYaml.type).toBe('self-hosted'); + expect(linkYaml.api_url).toBe('https://new.example.com'); + expect(linkYaml.api_key).toBe('new-key'); + }); + + it('respects --directory flag', async () => { + const customDir = 'my-powersync'; + mkdirSync(join(tmpDir, customDir), { recursive: true }); + const { stdout } = await runCommand( + `link self-hosted --directory=${customDir} --url=https://example.com --api-key=k`, + { + root + } + ); + expect(stdout).toContain(`Updated ${customDir}/${LINK_FILENAME}`); + const linkYaml = parseYaml(readFileSync(join(tmpDir, customDir, LINK_FILENAME), 'utf8')); + expect(linkYaml.type).toBe('self-hosted'); + expect(linkYaml.api_url).toBe('https://example.com'); + }); + }); +}); diff --git a/packages/cli/tsconfig.tsbuildinfo b/packages/cli/tsconfig.tsbuildinfo deleted file mode 100644 index 88dcde8..0000000 --- a/packages/cli/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/alphabet.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/pjson.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/topic.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/hooks.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/s3-manifest.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/ts-config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/config.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/plugin.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/ts-path.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/config/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/error.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/cli.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/errors/module-load.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/exit.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/errors.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/handle.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/warn.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/errors/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/interfaces/parser.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/args.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/execute.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flags.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/flush.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/formatter.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/command.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/util.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/help/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/logger.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/main.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/module-loader.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/help.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/validate.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/parser/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/performance.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/settings.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/util/ids.d.ts","../../node_modules/.pnpm/cli-spinners@2.9.2/node_modules/cli-spinners/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/types.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/base.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/simple.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/action/spinner.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/colorize-json.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/theme.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/write.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/ux/index.d.ts","../../node_modules/.pnpm/@oclif+core@4.8.0/node_modules/@oclif/core/lib/index.d.ts","./src/index.ts","./src/commands/deploy.ts","./src/commands/destroy.ts","./src/commands/init.ts","./src/commands/link.ts","./src/commands/login.ts","./src/commands/migrate.ts","./src/commands/stop.ts","./src/commands/validate.ts","./src/commands/fetch/config.ts","./src/commands/fetch/index.ts","./src/commands/fetch/instances.ts","./src/commands/fetch/status.ts","./src/commands/generate/index.ts","./src/commands/generate/schema.ts","./src/commands/generate/token.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[94,143,192,209,210,235],[71,73,74,83,92,94,143,192,209,210],[68,71,73,79,93,143,192,209,210],[80,81,82,143,192,209,210],[69,70,71,76,93,143,192,209,210],[79,143,192,209,210],[74,143,192,209,210],[79,85,143,192,209,210],[143,192,209,210],[79,85,89,143,192,209,210],[79,84,85,86,87,88,90,91,143,192,209,210],[79,143,192,209,210,235],[79,93,99,143,192,209,210],[79,93,143,192,209,210],[79,93,99,100,101,143,192,209,210],[72,79,83,90,92,93,95,96,97,98,102,103,104,105,108,109,110,111,120,143,192,209,210],[94,143,192,209,210],[68,69,70,71,72,93,143,192,209,210],[71,73,93,94,143,192,209,210],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,94,143,192,209,210],[93,143,192,209,210],[64,93,143,192,209,210],[67,68,143,192,209,210],[66,69,70,93,143,192,209,210],[66,73,143,192,209,210],[92,94,143,192,209,210],[94,106,107,143,192,209,210],[73,143,192,209,210],[113,143,192,209,210],[114,143,192,209,210],[113,114,143,192,209,210],[112,143,192,209,210],[84,88,91,115,116,117,118,119,143,192,209,210],[68,143,192,209,210],[143,189,190,192,209,210],[143,191,192,209,210],[192,209,210],[143,192,197,209,210,227],[143,192,193,198,203,209,210,212,224,235],[143,192,193,194,203,209,210,212],[138,139,140,143,192,209,210],[143,192,195,209,210,236],[143,192,196,197,204,209,210,213],[143,192,197,209,210,224,232],[143,192,198,200,203,209,210,212],[143,191,192,199,209,210],[143,192,200,201,209,210],[143,192,202,203,209,210],[143,191,192,203,209,210],[143,192,203,204,205,209,210,224,235],[143,192,203,204,205,209,210,219,224,227],[143,185,192,200,203,206,209,210,212,224,235],[143,192,203,204,206,207,209,210,212,224,232,235],[143,192,206,208,209,210,224,232,235],[141,142,143,144,145,146,147,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241],[143,192,203,209,210],[143,192,209,210,211,235],[143,192,200,203,209,210,212,224],[143,192,209,210,213],[143,192,209,210,214],[143,191,192,209,210,215],[143,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241],[143,192,209,210,217],[143,192,209,210,218],[143,192,203,209,210,219,220],[143,192,209,210,219,221,236,238],[143,192,204,209,210],[143,192,203,209,210,224,225,227],[143,192,209,210,226,227],[143,192,209,210,224,225],[143,192,209,210,227],[143,192,209,210,228],[143,189,192,209,210,224,229],[143,192,203,209,210,230,231],[143,192,209,210,230,231],[143,192,197,209,210,212,224,232],[143,192,209,210,233],[143,192,209,210,212,234],[143,192,206,209,210,218,235],[143,192,197,209,210,236],[143,192,209,210,224,237],[143,192,209,210,211,238],[143,192,209,210,239],[143,185,192,209,210],[143,185,192,203,205,209,210,215,224,227,235,237,238,240],[143,192,209,210,224,241],[143,157,161,192,209,210,235],[143,157,192,209,210,224,235],[143,152,192,209,210],[143,154,157,192,209,210,232,235],[143,192,209,210,212,232],[143,192,209,210,242],[143,152,192,209,210,242],[143,154,157,192,209,210,212,235],[143,149,150,153,156,192,203,209,210,224,235],[143,157,164,192,209,210],[143,149,155,192,209,210],[143,157,178,179,192,209,210],[143,153,157,192,209,210,227,235,242],[143,178,192,209,210,242],[143,151,152,192,209,210,242],[143,157,192,209,210],[143,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,192,209,210],[143,157,172,192,209,210],[143,157,164,165,192,209,210],[143,155,157,165,166,192,209,210],[143,156,192,209,210],[143,149,152,157,192,209,210],[143,157,161,165,166,192,209,210],[143,161,192,209,210],[143,155,157,160,192,209,210,235],[143,149,154,157,164,192,209,210],[143,192,209,210,224],[143,152,157,178,192,209,210,240,242],[121,143,192,209,210],[121,143,192,204,209,210,214,235],[143,192,204,209,210,242]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"032e362f68a69c4f6af9678b4f5fdcf5b6c348e6aa279a7b2c89099bb7887a0a","impliedFormat":1},{"version":"99fd2587995ea6001ac20d6ecebe748e163d62e820f369452919c265f140b3c9","impliedFormat":1},{"version":"0b730f11a4d506c4cefe2c4b0d407a789ecbe9992972e3cef3a16dc7752a9041","impliedFormat":1},{"version":"e1d8a12b5bdcc2111555f44f2af6131b509256fb4b0275b5d500ddc6b5f15057","impliedFormat":1},{"version":"e2f5f8a675634ad58a5c0b6dae43445a136207cf1c25be81b72c6cc9511a74d3","impliedFormat":1},{"version":"935f95054bf1cf971a72a4e0049586eaaa1030677fb9eedc199eb3da4ba8de0c","impliedFormat":1},{"version":"749a06b2b17de875b677443af38813af4ad08ce36fabc42dd1239e9814ccfb7a","impliedFormat":1},{"version":"948e7ab0a0498621ffff968d08f99a856ccfe650a40c88e77434d6fda848a867","impliedFormat":1},{"version":"76ba4acb99015f0af9f9015b097e65ede39c9b236415fbb5c497abf3f16cc4ff","impliedFormat":1},{"version":"97f38e731416236723389b761be37fe9fd1982c3daa8ddcb1cd4ad640460ff34","impliedFormat":1},{"version":"72aae4ad580cc65be46b00b5f036eadd5f28b9a6a33b5371b0316b1a00be72dd","impliedFormat":1},{"version":"e80cff0c41a5a798496621a10b173f9bd8934d309a74dae7f2c36841be07ed6d","impliedFormat":1},{"version":"b8858f8750c32bc24aa90df80af95b1aca764a2728e395b8b2aefeffbb0d4324","impliedFormat":1},{"version":"51b85172183e3bf32ae04b95da932713fed0eb1e9b0ac14658b27315d3cca7de","impliedFormat":1},{"version":"1d9706c7bf2cc171e52f67cc048e229622b59efe1922c82541bc61ea2cf8537e","impliedFormat":1},{"version":"938c160678c0c4bf4b1e28394f51ca546029c5f10928147fe7cd7203c2a2ceb4","impliedFormat":1},{"version":"24546d4a958a3262affbc00e6712d9595f72af75205eb1eaf4fa995fa036df71","impliedFormat":1},{"version":"f44bd3fa97e83bc62e5651a5d82b88bc875be385c4f7db698be4970827eb0134","impliedFormat":1},{"version":"1dfbc80539faad1965995a79f12c8d38119f7a1c49c831aea1c18540bb206ac6","impliedFormat":1},{"version":"3db5b76431251162950a870670c33d22d7e7fcb02f0f5818d96f16d941335a20","impliedFormat":1},{"version":"68772eaccdf08b5e44504747a91c311e2cd3b0b1b263035890a571439e144d4e","impliedFormat":1},{"version":"335f00f0ca1ec75c81e41503907753b4ea2f50f9ace17595afa7e583a5951489","impliedFormat":1},{"version":"eefb5931fa32da9b384a318c9c98314841326040cd8a5a9f4ef0acbd3ec3b924","impliedFormat":1},{"version":"1c7760d4af43ced46bce744555d7014ee47f3381b57cacc933ded7f0a8701aac","impliedFormat":1},{"version":"37ff6180311269649d3d76d4b222be7523d5476ffc34a99d6d401d4bbb7534d5","impliedFormat":1},{"version":"c3d08e2d4c972ebe21ca5d40e33feed01044769d358eaa13cf89b692134c4d32","impliedFormat":1},{"version":"4677854ad855b1a373d287e0f892dde2e5d60bee80fe67f05add92c630ed0bc0","impliedFormat":1},{"version":"d9f75829a0984c08c1633d04a954c7c4b5adb7e16c13b6cf207fbd9100838ca9","impliedFormat":1},{"version":"35413e3168706b2a4bed7538b355bc4ec3d5eff10f25b588485b30a22c56db1c","impliedFormat":1},{"version":"ae1d64e4ad308ad8a7010a5f7c67fd1466dcc5e0f6cb876a8e450716ae0c5c2e","impliedFormat":1},{"version":"dc38bb715e32aa87e3f74feacd63e6c9b364e0acbae8eaf1a0503037ba5d5553","impliedFormat":1},{"version":"efa0400a30b6a995b39f59d4e517d2bd624970b21153aadb611cf3f113e98295","impliedFormat":1},{"version":"d7e355137d4a8db67553be5b52bf98cf1ffdac39bb8668ecf19756981cc6876b","impliedFormat":1},{"version":"569f27bc2a2f9a416bd3ccebe8b6852e306f11a5c69d8fb4ac00a68a28a414d6","impliedFormat":1},{"version":"b6ef0db675b5145700813a721047bfcefe3927147daa0fc0bd92c0762e70b9f7","impliedFormat":1},{"version":"d009048209b7d3dd1d2dd2f8fe485b1bc1648d9750cf3a96ca1f142d8016c2b3","impliedFormat":1},{"version":"0e47b2faa8c1f0f93bd4deb6119e8f02f1a7c1f2394f88d4fc74b70e270d1eb4","impliedFormat":1},{"version":"ed4d24c29aacac45546aae136d210d935d918051c9bdf63945949c00ff7112e2","impliedFormat":1},{"version":"2ec372633f1e45c8047c7d97f079fccfc4c52de86e04eb6f4f37fafce0730671","impliedFormat":1},{"version":"a1d78fb84a18518e5dc6e5b8fc60e670be6ac36584099afbb483f7ad59e9decc","impliedFormat":1},{"version":"a0aa647e153798624c2c32ca663611eb62ddd131596989648c357fd31a80a292","impliedFormat":1},{"version":"ea366ad80040319ca2ac495f4823fa271d330286525d57a043b6feed08ce7917","impliedFormat":1},{"version":"98bb229db2d81eaec4ba5ef6e7bbb77f24c424e63217bed49a951e9c6b518507","impliedFormat":1},{"version":"8bed77d37a236f90a1bcfce2591f172d009f55da48b45a7469ae0a80b9302404","impliedFormat":1},{"version":"c79ab4ce4944757c8e5f578b6a49e4d21c2736dc7f78d5cb395e3fa01495f8f2","impliedFormat":1},{"version":"469865ae2f24c9ee11bb589d5e28e2d9682ebd7ca9e06bd3643291b16e34f47d","impliedFormat":1},{"version":"dc9282104c64b6aec45b8e0952b5c1777f03f63761049dd60fbcbc35e2306848","impliedFormat":1},{"version":"f64b0687abbd6646ffc0763c102f6c1048527f62659777e9bb302a3e1ef00630","impliedFormat":1},{"version":"b85d57f7dfd39ab2b001ecc3312dfa05259192683a81880749cbca3b28772e42","impliedFormat":1},{"version":"7199dc8fd25c403c9c37acaf7958f75c2b06baaa04c2c8f6e2e28e445fd57d40","impliedFormat":1},{"version":"43725d63f81e18c630acecc5e502bbd5d2a747fff10011e844736544aa4457c0","impliedFormat":1},{"version":"535dfa7bb97e97d8ac5fff37bae9c09fe6a758b52ffd06d50f4dcfd4f273b3c1","impliedFormat":1},{"version":"a478585c9957e2fa7a12f4719861fcce56768e82b68211e293916206ee8d3a61","impliedFormat":1},{"version":"f69b9b72755f8e9731a3e910367f75e9b8572d30e80b5a993e431f36dfdae24f","impliedFormat":1},{"version":"059d51bf1161687e7f6374af419ae67ecfbdb81eebb3493108ddf0c4ece902e4","impliedFormat":1},{"version":"70271cdcd48eda39af5870abcb3471eee639f1c30c3522f54ac64a66abd6bb0e","impliedFormat":1},{"version":"34ca43f6999082790b1cccf8b749346d67dad44cbd2a394f7a68590cc9265481","impliedFormat":1},{"version":"0992833cc5115272e0af47c8caa9c452e2efadcfbdd54c13ec081d735bb0ada6","impliedFormat":1},{"version":"c519bbc76e9214a46c8d38a9875cbead73ea681e403b34b3ce7b86a38e3f7d9a","signature":"658d7ae3d7654cb926a4d20defc7b8ff80e4f07c48b72f8daf118ca1dbb19cf6","impliedFormat":99},{"version":"c53d58d8708c3e1d3f57e97b88c1971b51b548ddd6b20705f47e10e6ed12577a","signature":"8b66835eba52683e3c5f48eccb9d5a31778b4e95b41ac635b25d8fb0282cd166","impliedFormat":99},{"version":"f18d2c0f9a8516dd46993857b0e1a01a59f2a3c206b9dda34f8b6591bc930058","signature":"19b51e1c1c63e7051bae00394f80bfacc468950d983f2678a5d4e80909d19008","impliedFormat":99},{"version":"5eb770b7f7e542a2b5a2a377edefb1543744e3f4f5e8d24a1e13faa77686e211","signature":"6854e76635bde21cb52eaa988c2e20fbc3c877ad0c6036f79b5350b5906bf704","impliedFormat":99},{"version":"531861e32c6a099ad7a7a6820f3c26f09f55411abf3654c214e472eee50e3e45","signature":"a08bbe0aff62a8de841806581a30a67a391e950e90ded683b69974af0bbcbc4e","impliedFormat":99},{"version":"588cd6fd9f975d60b94607a28418d42db5e28d3cdce35a57076193fb3899bdd8","signature":"fa602d50be70549daa1500419fa23fe977f2c2e2b48a18ec1e16eb6880e0bf89","impliedFormat":99},{"version":"c61ad5da610be01b680164f5958745dcf8d75e4d15626a76adb6e9f741134ddf","signature":"d96e9b1b0b145aca5fcd23a5314c0de5366c67005e41a55402852a0989c44d85","impliedFormat":99},{"version":"70a9379af39f9e72b3b3268341aeebc5bb0d86ec16435dc3ad8077756233a0ca","signature":"9d41e3c58467f4067a508da67aea427f8cd13bb11456c2b68172211362646d80","impliedFormat":99},{"version":"aa23e65ddd492fd8f4e5c2d453065fc04aedfaaaeee1f2b9fa33b3905ed1aa5c","signature":"0f6589f61f915be1f2dbcb00c5293898d1faa94ad76f4b9c4401f1550bf62399","impliedFormat":99},{"version":"b5e7c5963f7c8955304ed5c2994f98ea0542817e74f083137bc3f043b5f10d62","signature":"12d98fc500d48c23d0524d56fd27992b9e4146da11716af88035ee996337b3b5","impliedFormat":99},{"version":"4f6aab233e7967d99d83a1b1f8b7c043ce7e9329adf914fa54db6e5e79af22ee","signature":"d471d2b608b690601abc2cbd9b87724a31893b14d574bad531d631d26c092e75","impliedFormat":99},{"version":"8fc9a176cb4e74ea95ae50ce99a669cccc94236f9fe8643fd7d33e73093dded5","signature":"0ca6c6d5cb1a05a085eb74a6d24ccf864c848bc5f559624860e66bf1d9ebc563","impliedFormat":99},{"version":"4a69e761fd74985ae4c6ecc32d5627880bf0b95f432f1225ecf840e930ef7fd7","signature":"22b692698d687f87da7975dabb0b9399804a261e07eab0d434b420947487782b","impliedFormat":99},{"version":"7dacd8aedbed2b2156ee2d2f50fa073e3f95da695829d583e1236d285de044ca","signature":"2842fc0b7f7ca9bd25a4608646c9ea2fcc46599625d6bbba4fc5386580982d0c","impliedFormat":99},{"version":"e07ee5cf3732a287d310da2194d1d02cfa0bd0ee48c46e156ad6e8ea6d3b38ee","signature":"37ef0e518e13b08cb91b2ae0dc450dcbd6144274e8c9ff3a2bfd1ed661a7688a","impliedFormat":99},{"version":"9a590cb8a7ab265767d67a6f0355f0027b4452e7625c53a5b36130a48974ab7e","signature":"a456b7c515115590cdba93d3f827e7c8626f37b2b8d7a0d6814131cd34f7a7da","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[[122,137]],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[95,1],[93,2],[80,3],[83,4],[81,5],[82,6],[84,6],[85,7],[86,8],[87,8],[88,9],[90,10],[92,11],[91,9],[96,6],[97,12],[98,9],[100,13],[99,14],[102,15],[101,6],[121,16],[64,9],[65,17],[73,18],[74,9],[75,17],[67,9],[72,19],[79,20],[66,9],[76,21],[94,22],[69,23],[71,24],[77,9],[68,9],[70,9],[78,9],[103,25],[104,6],[105,14],[89,26],[106,17],[108,27],[107,17],[109,9],[110,9],[111,28],[114,29],[115,30],[116,31],[113,32],[117,9],[120,33],[118,34],[119,9],[189,35],[190,35],[191,36],[143,37],[192,38],[193,39],[194,40],[138,9],[141,41],[139,9],[140,9],[195,42],[196,43],[197,44],[198,45],[199,46],[200,47],[201,47],[202,48],[203,49],[204,50],[205,51],[144,9],[142,9],[206,52],[207,53],[208,54],[242,55],[209,56],[210,9],[211,57],[212,58],[213,59],[214,60],[215,61],[216,62],[217,63],[218,64],[219,65],[220,65],[221,66],[222,9],[223,67],[224,68],[226,69],[225,70],[227,71],[228,72],[229,73],[230,74],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,81],[238,82],[239,83],[145,9],[146,9],[147,9],[186,84],[187,9],[188,9],[240,85],[241,86],[148,9],[112,9],[61,9],[62,9],[12,9],[10,9],[11,9],[16,9],[15,9],[2,9],[17,9],[18,9],[19,9],[20,9],[21,9],[22,9],[23,9],[24,9],[3,9],[25,9],[26,9],[4,9],[27,9],[31,9],[28,9],[29,9],[30,9],[32,9],[33,9],[34,9],[5,9],[35,9],[36,9],[37,9],[38,9],[6,9],[42,9],[39,9],[40,9],[41,9],[43,9],[7,9],[44,9],[49,9],[50,9],[45,9],[46,9],[47,9],[48,9],[8,9],[54,9],[51,9],[52,9],[53,9],[55,9],[9,9],[56,9],[63,9],[57,9],[58,9],[60,9],[59,9],[1,9],[14,9],[13,9],[164,87],[174,88],[163,87],[184,89],[155,90],[154,91],[183,92],[177,93],[182,94],[157,95],[171,96],[156,97],[180,98],[152,99],[151,92],[181,100],[153,101],[158,102],[159,9],[162,102],[149,9],[185,103],[175,104],[166,105],[167,106],[169,107],[165,108],[168,109],[178,92],[160,110],[161,111],[170,112],[150,113],[173,104],[172,102],[176,9],[179,114],[123,115],[124,115],[131,115],[132,115],[133,115],[134,115],[135,115],[136,115],[137,115],[125,116],[126,115],[127,115],[128,115],[129,115],[130,115],[122,115],[243,117],[244,9]],"latestChangedDtsFile":"./dist/utils/index.d.ts","version":"5.9.3"} \ No newline at end of file From 16352ad6ec4149f4ce50132d58ae4f963aa53428 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Tue, 3 Feb 2026 18:13:44 +0200 Subject: [PATCH 005/141] unify config types --- .../src/command-types/CloudInstanceCommand.ts | 19 +++++++ .../SelfHostedInstanceCommand.ts | 19 +++++++ packages/cli/src/commands/link/cloud.ts | 8 +-- packages/cli/src/commands/link/self-hosted.ts | 8 +-- packages/cli/src/commands/migrate.ts | 10 ++-- packages/cli/src/commands/stop.ts | 8 +-- packages/cli/src/utils/ensureServiceType.ts | 44 +++++++++++++++ .../templates/cloud/powersync/service.yaml | 5 +- .../self-hosted/base/powersync/service.yaml | 14 +++-- packages/cli/test/commands/link.test.ts | 53 ++++++++++++++++++- packages/schemas/.gitignore | 1 + packages/schemas/json-schema/link-config.json | 42 --------------- packages/schemas/package.json | 4 +- packages/schemas/scripts/create-schemas.ts | 5 ++ packages/schemas/src/CLIConfig.ts | 17 ++++++ packages/schemas/src/index.ts | 1 + packages/schemas/tsconfig.tsbuildinfo | 1 - pnpm-lock.yaml | 16 ++++-- 18 files changed, 201 insertions(+), 74 deletions(-) create mode 100644 packages/cli/src/command-types/CloudInstanceCommand.ts create mode 100644 packages/cli/src/command-types/SelfHostedInstanceCommand.ts create mode 100644 packages/cli/src/utils/ensureServiceType.ts delete mode 100644 packages/schemas/json-schema/link-config.json create mode 100644 packages/schemas/src/CLIConfig.ts delete mode 100644 packages/schemas/tsconfig.tsbuildinfo diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts new file mode 100644 index 0000000..c6ad184 --- /dev/null +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -0,0 +1,19 @@ +import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; +import { InstanceCommand } from './InstanceCommand.js'; + +/** Base command for operations that require a Cloud-type PowerSync project (service.yaml _type: cloud). */ +export abstract class CloudInstanceCommand extends InstanceCommand { + static flags = { + ...InstanceCommand.flags + }; + + /** + * Ensures the project directory exists and service.yaml has _type: cloud. + * @returns The resolved absolute path to the project directory. + */ + ensureConfigType(directory: string): string { + const projectDir = this.ensureProjectDirExists(directory); + ensureServiceTypeMatches(this, projectDir, 'cloud', directory); + return projectDir; + } +} diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts new file mode 100644 index 0000000..c6139dd --- /dev/null +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -0,0 +1,19 @@ +import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; +import { InstanceCommand } from './InstanceCommand.js'; + +/** Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). */ +export abstract class SelfHostedInstanceCommand extends InstanceCommand { + static flags = { + ...InstanceCommand.flags + }; + + /** + * Ensures the project directory exists and service.yaml has _type: self-hosted. + * @returns The resolved absolute path to the project directory. + */ + ensureConfigType(directory: string): string { + const projectDir = this.ensureProjectDirExists(directory); + ensureServiceTypeMatches(this, projectDir, 'self-hosted', directory); + return projectDir; + } +} diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index 74ec645..e304bb9 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -2,16 +2,16 @@ import { Flags } from '@oclif/core'; import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -import { InstanceCommand } from '../../command-types/InstanceCommand.js'; +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; const LINK_FILENAME = 'link.yaml'; -export default class LinkCloud extends InstanceCommand { +export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; static flags = { - ...InstanceCommand.flags, + ...CloudInstanceCommand.flags, /** * TODO, we could default these to the values used after login */ @@ -33,7 +33,7 @@ export default class LinkCloud extends InstanceCommand { const { flags } = await this.parse(LinkCloud); const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; - const projectDir = this.ensureProjectDirExists(directory); + const projectDir = this.ensureConfigType(directory); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index ff15b82..e91c9db 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -2,16 +2,16 @@ import { Flags } from '@oclif/core'; import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -import { InstanceCommand } from '../../command-types/InstanceCommand.js'; +import { SelfHostedInstanceCommand } from '../../command-types/SelfHostedInstanceCommand.js'; import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; const LINK_FILENAME = 'link.yaml'; -export default class LinkSelfHosted extends InstanceCommand { +export default class LinkSelfHosted extends SelfHostedInstanceCommand { static description = 'Link this directory to a self-hosted PowerSync instance.'; static summary = 'Link to self-hosted PowerSync (API URL and token).'; static flags = { - ...InstanceCommand.flags, + ...SelfHostedInstanceCommand.flags, url: Flags.string({ description: 'Self-hosted PowerSync API base URL (e.g. https://powersync.example.com).', required: true @@ -26,7 +26,7 @@ export default class LinkSelfHosted extends InstanceCommand { const { flags } = await this.parse(LinkSelfHosted); const { directory, url, 'api-key': apiKey } = flags; - const projectDir = this.ensureProjectDirExists(directory); + const projectDir = this.ensureConfigType(directory); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/commands/migrate.ts b/packages/cli/src/commands/migrate.ts index 9ca08d7..b6559fd 100644 --- a/packages/cli/src/commands/migrate.ts +++ b/packages/cli/src/commands/migrate.ts @@ -1,10 +1,10 @@ -import {Command} from '@oclif/core' +import { SelfHostedInstanceCommand } from '../command-types/SelfHostedInstanceCommand.js'; -export default class Migrate extends Command { - static description = 'Migrates a self-hosted instance configuration to PowerSync Cloud format. Self-hosted only.' - static summary = 'Migrate a self-hosted config to a cloud config.' +export default class Migrate extends SelfHostedInstanceCommand { + static description = 'Migrates a self-hosted instance configuration to PowerSync Cloud format. Self-hosted only.'; + static summary = 'Migrate a self-hosted config to a cloud config.'; async run(): Promise { - this.log('migrate: not yet implemented') + this.log('migrate: not yet implemented'); } } diff --git a/packages/cli/src/commands/stop.ts b/packages/cli/src/commands/stop.ts index cbb08b5..b9dfcaf 100644 --- a/packages/cli/src/commands/stop.ts +++ b/packages/cli/src/commands/stop.ts @@ -1,10 +1,10 @@ -import {Command} from '@oclif/core' +import { Command } from '@oclif/core'; export default class Stop extends Command { - static description = 'Stops the linked PowerSync Cloud instance. Cloud only.' - static summary = 'Stop a PowerSync instance.' + static description = 'Stops the linked PowerSync Cloud instance. Cloud only.'; + static summary = 'Stop a PowerSync instance.'; async run(): Promise { - this.log('stop: not yet implemented') + this.log('stop: not yet implemented'); } } diff --git a/packages/cli/src/utils/ensureServiceType.ts b/packages/cli/src/utils/ensureServiceType.ts new file mode 100644 index 0000000..540ddc2 --- /dev/null +++ b/packages/cli/src/utils/ensureServiceType.ts @@ -0,0 +1,44 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { parse as parseYaml } from 'yaml'; + +const SERVICE_FILENAME = 'service.yaml'; + +export type ServiceType = 'cloud' | 'self-hosted'; + +/** + * Ensures service.yaml exists in the project dir and its _type matches the expected link type. + * Calls command.error and exits if the file is missing, or _type is missing or mismatched. + */ +export function ensureServiceTypeMatches( + command: { error: (message: string, options: { exit: number }) => never }, + projectDir: string, + expectedType: ServiceType, + directoryLabel: string +): void { + const servicePath = join(projectDir, SERVICE_FILENAME); + + if (!existsSync(servicePath)) { + command.error( + `No ${SERVICE_FILENAME} found in "${directoryLabel}". Run \`powersync init\` first to create the project.`, + { exit: 1 } + ); + } + + const content = readFileSync(servicePath, 'utf8'); + const service = parseYaml(content) as { _type?: string }; + + if (service._type === undefined || service._type === null) { + command.error( + `${SERVICE_FILENAME} in "${directoryLabel}" is missing \`_type\`. Add \`_type: ${expectedType}\` to match this link command.`, + { exit: 1 } + ); + } + + if (service._type !== expectedType) { + command.error( + `${SERVICE_FILENAME} in "${directoryLabel}" has \`_type: ${service._type}\` but you are running \`link ${expectedType}\`. The _type must match. Use \`powersync init --type=${expectedType}\` to create a project of the correct type, or change _type in ${SERVICE_FILENAME}.`, + { exit: 1 } + ); + } +} diff --git a/packages/cli/templates/cloud/powersync/service.yaml b/packages/cli/templates/cloud/powersync/service.yaml index 7b61df7..a282fcc 100644 --- a/packages/cli/templates/cloud/powersync/service.yaml +++ b/packages/cli/templates/cloud/powersync/service.yaml @@ -1,5 +1,6 @@ # TODO update this with published schema -# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/json-schema/powersync-config.json +# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/new-cli/packages/schemas/json-schema/cli-config.json +# yaml-language-server: $schema=https://unpkg.com/@powersync/cli-schemas@latest/json-schema/cli-config.json # # PowerSync Cloud config – example template with all schema options documented. # Uncomment one block per type (one connection type + optional client_auth). We recommend secrets as: secret: !env ENV_NAME (see ../../.vscode/settings.json). @@ -9,6 +10,8 @@ # TOP LEVEL # ----------------------------------------------------------------------------- +_type: cloud + # region (required): deployment region, e.g. us # Note: This cannot be changed after the initial deployment region: us diff --git a/packages/cli/templates/self-hosted/base/powersync/service.yaml b/packages/cli/templates/self-hosted/base/powersync/service.yaml index 5a7c136..d89cb1b 100644 --- a/packages/cli/templates/self-hosted/base/powersync/service.yaml +++ b/packages/cli/templates/self-hosted/base/powersync/service.yaml @@ -1,15 +1,19 @@ -# yaml-language-server: $schema=https://unpkg.com/@powersync/service-schema@latest/json-schema/powersync-config.json +# TODO update this with published schema +# yaml-language-server: $schema=/Users/stevenontong/Documents/platform_code/powersync/new-cli/packages/schemas/json-schema/cli-config.json +# yaml-language-server: $schema=https://unpkg.com/@powersync/cli-schemas@latest/json-schema/cli-config.json # # PowerSync self-hosted config – example template with all schema options documented. # Uncomment one block per type where applicable. We recommend secrets via !env ENV_NAME. # Docs: https://docs.powersync.com/self-hosting -# + +_type: self-hosted + # ----------------------------------------------------------------------------- # TELEMETRY – configuration for service telemetry and monitoring # ----------------------------------------------------------------------------- # See https://docs.powersync.com/self-hosting/telemetry telemetry: -# When true, disables sharing of anonymized telemetry data + # When true, disables sharing of anonymized telemetry data disable_telemetry_sharing: false # Port on which Prometheus metrics will be exposed. When set, metrics will be available on this port for scraping. @@ -129,7 +133,7 @@ port: !env PS_PORT # ----------------------------------------------------------------------------- # One of path or content is supported. path is used in this example. sync_rules: -# Path to the sync rules YAML file. + # Path to the sync rules YAML file. path: sync_rules.yaml # Inline sync rules content as a string (use this or path, not both). # content: string @@ -184,7 +188,7 @@ sync_rules: # API – API service configuration and parameters # ----------------------------------------------------------------------------- api: -# API access tokens for administrative operations. + # API access tokens for administrative operations. tokens: - use_a_better_token_in_production # Performance and safety parameters for the API service. diff --git a/packages/cli/test/commands/link.test.ts b/packages/cli/test/commands/link.test.ts index 9a0442e..aa3ba05 100644 --- a/packages/cli/test/commands/link.test.ts +++ b/packages/cli/test/commands/link.test.ts @@ -9,6 +9,11 @@ import { root } from '../helpers/root.js'; const LINK_FILENAME = 'link.yaml'; const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\n`, 'utf8'); +} describe('link', () => { describe('cloud', () => { @@ -34,8 +39,28 @@ describe('link', () => { expect(result.error?.oclif?.exit).toBe(1); }); - it('creates link.yaml with cloud config when directory exists', async () => { + it('errors when service.yaml is missing', async () => { mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); + const result = await runCommand('link cloud --instance-id=inst --org-id=o --project-id=p', { root }); + expect(result.error?.message).toMatch( + new RegExp(`No ${SERVICE_FILENAME} found in "${PROJECT_DIR}". Run \`powersync init\` first`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when service.yaml _type does not match (self-hosted)', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); + const result = await runCommand('link cloud --instance-id=inst --org-id=o --project-id=p', { root }); + expect(result.error?.message).toMatch(/has `_type: self-hosted` but you are running `link cloud`/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('creates link.yaml with cloud config when directory exists and service _type is cloud', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); const { stdout } = await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { root }); @@ -52,6 +77,7 @@ describe('link', () => { it('updates existing link.yaml and preserves comments', async () => { const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); const linkPath = join(projectDir, LINK_FILENAME); const withComments = `# Managed by PowerSync CLI # Run powersync link --help for info @@ -72,6 +98,7 @@ type: cloud it('respects --directory flag', async () => { const customDir = 'my-powersync'; mkdirSync(join(tmpDir, customDir), { recursive: true }); + writeServiceYaml(join(tmpDir, customDir), 'cloud'); const { stdout } = await runCommand( `link cloud --directory=${customDir} --instance-id=i --org-id=o --project-id=p`, { root } @@ -106,8 +133,28 @@ type: cloud expect(result.error?.oclif?.exit).toBe(1); }); - it('creates link.yaml with self-hosted config when directory exists', async () => { + it('errors when service.yaml is missing', async () => { mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); + const result = await runCommand('link self-hosted --url=https://x.com --api-key=k', { root }); + expect(result.error?.message).toMatch( + new RegExp(`No ${SERVICE_FILENAME} found in "${PROJECT_DIR}". Run \`powersync init\` first`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when service.yaml _type does not match (cloud)', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runCommand('link self-hosted --url=https://x.com --api-key=k', { root }); + expect(result.error?.message).toMatch(/has `_type: cloud` but you are running `link self-hosted`/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('creates link.yaml with self-hosted config when directory exists and service _type is self-hosted', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); const { stdout } = await runCommand('link self-hosted --url=https://sync.example.com --api-key=my-token', { root }); @@ -123,6 +170,7 @@ type: cloud it('updates existing link.yaml and preserves comments', async () => { const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); const linkPath = join(projectDir, LINK_FILENAME); const withComments = `# Self-hosted config type: self-hosted @@ -140,6 +188,7 @@ type: self-hosted it('respects --directory flag', async () => { const customDir = 'my-powersync'; mkdirSync(join(tmpDir, customDir), { recursive: true }); + writeServiceYaml(join(tmpDir, customDir), 'self-hosted'); const { stdout } = await runCommand( `link self-hosted --directory=${customDir} --url=https://example.com --api-key=k`, { diff --git a/packages/schemas/.gitignore b/packages/schemas/.gitignore index c925c21..5c824fc 100644 --- a/packages/schemas/.gitignore +++ b/packages/schemas/.gitignore @@ -1,2 +1,3 @@ /dist /node_modules +json-schema \ No newline at end of file diff --git a/packages/schemas/json-schema/link-config.json b/packages/schemas/json-schema/link-config.json deleted file mode 100644 index 5cfb033..0000000 --- a/packages/schemas/json-schema/link-config.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "definitions": {}, - "anyOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "cloud" - }, - "instance_id": { - "type": "string" - }, - "org_id": { - "type": "string" - }, - "project_id": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["type"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "self-hosted" - }, - "api_url": { - "type": "string" - }, - "api_key": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["type"] - } - ] -} diff --git a/packages/schemas/package.json b/packages/schemas/package.json index e88e3b7..350fc33 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -14,7 +14,9 @@ "build": "shx rm -rf dist && tsc -b && tsx scripts/create-schemas.ts" }, "dependencies": { - "ts-codec": "^1.3.0" + "ts-codec": "^1.3.0", + "@powersync/service-types": "^0.13.3", + "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types" }, "devDependencies": { "@types/node": "^22", diff --git a/packages/schemas/scripts/create-schemas.ts b/packages/schemas/scripts/create-schemas.ts index 7203154..e4bb192 100644 --- a/packages/schemas/scripts/create-schemas.ts +++ b/packages/schemas/scripts/create-schemas.ts @@ -1,7 +1,9 @@ +import { configFile } from '@powersync/service-types'; import { mkdirSync, writeFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import * as t from 'ts-codec'; +import { CLIConfig } from '../src/CLIConfig.js'; import { LinkConfig } from '../src/LinkConfig.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -11,3 +13,6 @@ mkdirSync(schemaDir, { recursive: true }); const linkConfigSchema = t.generateJSONSchema(LinkConfig); writeFileSync(join(schemaDir, 'link-config.json'), JSON.stringify(linkConfigSchema, null, 2)); + +const cliConfigSchema = t.generateJSONSchema(CLIConfig, { parsers: [configFile.portParser] }); +writeFileSync(join(schemaDir, 'cli-config.json'), JSON.stringify(cliConfigSchema, null, 2)); diff --git a/packages/schemas/src/CLIConfig.ts b/packages/schemas/src/CLIConfig.ts new file mode 100644 index 0000000..33e068a --- /dev/null +++ b/packages/schemas/src/CLIConfig.ts @@ -0,0 +1,17 @@ +import { BasePowerSyncHostedConfig } from '@powersync/management-types'; +import { configFile } from '@powersync/service-types'; +import * as t from 'ts-codec'; + +export const CLICloudConfig = t + .object({ + _type: t.literal('cloud') + }) + .and(BasePowerSyncHostedConfig); + +export const CLISelfHostedConfig = t + .object({ + _type: t.literal('self-hosted') + }) + .and(configFile.powerSyncConfig); + +export const CLIConfig = t.union(CLICloudConfig, CLISelfHostedConfig); diff --git a/packages/schemas/src/index.ts b/packages/schemas/src/index.ts index 9a9934a..e0f45fd 100644 --- a/packages/schemas/src/index.ts +++ b/packages/schemas/src/index.ts @@ -1,2 +1,3 @@ +export { CLICloudConfig, CLIConfig, CLISelfHostedConfig } from './CLIConfig.js'; export { CloudLinkConfig, LinkConfig, SelfHostedLinkConfig } from './LinkConfig.js'; export type { LinkConfig as LinkConfigType } from './LinkConfig.js'; diff --git a/packages/schemas/tsconfig.tsbuildinfo b/packages/schemas/tsconfig.tsbuildinfo deleted file mode 100644 index b1cefac..0000000 --- a/packages/schemas/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/definitions.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/definitions.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/generator.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/combinators.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/primitives.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/recursive.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/objects.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/arrays.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/root.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/parsers/index.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/utils.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/json-schema/index.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/combinators.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/primitives.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/recursive.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/arrays.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/codec.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/types/maps.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/utils.d.ts","../../node_modules/.pnpm/ts-codec@1.3.0/node_modules/ts-codec/dist/@types/index.d.ts","./src/linkconfig.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.7/node_modules/@types/node/index.d.ts","../../../../../../node_modules/@types/fs-extra/index.d.ts","../../../../../../node_modules/@types/slice-ansi/index.d.ts"],"fileIdsList":[[91,137,138,140,157,158],[91,139,140,157,158],[140,157,158],[91,140,145,157,158,175],[91,140,141,146,151,157,158,160,172,183],[91,140,141,142,151,157,158,160],[91,140,157,158],[86,87,88,91,140,157,158],[91,140,143,157,158,184],[91,140,144,145,152,157,158,161],[91,140,145,157,158,172,180],[91,140,146,148,151,157,158,160],[91,139,140,147,157,158],[91,140,148,149,157,158],[91,140,150,151,157,158],[91,139,140,151,157,158],[91,140,151,152,153,157,158,172,183],[91,140,151,152,153,157,158,167,172,175],[91,133,140,148,151,154,157,158,160,172,183],[91,140,151,152,154,155,157,158,160,172,180,183],[91,140,154,156,157,158,172,180,183],[89,90,91,92,93,94,95,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189],[91,140,151,157,158],[91,140,157,158,159,183],[91,140,148,151,157,158,160,172],[91,140,157,158,161],[91,140,157,158,162],[91,139,140,157,158,163],[91,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189],[91,140,157,158,165],[91,140,157,158,166],[91,140,151,157,158,167,168],[91,140,157,158,167,169,184,186],[91,140,152,157,158],[91,140,151,157,158,172,173,175],[91,140,157,158,174,175],[91,140,157,158,172,173],[91,140,157,158,175],[91,140,157,158,176],[91,137,140,157,158,172,177],[91,140,151,157,158,178,179],[91,140,157,158,178,179],[91,140,145,157,158,160,172,180],[91,140,157,158,181],[91,140,157,158,160,182],[91,140,154,157,158,166,183],[91,140,145,157,158,184],[91,140,157,158,172,185],[91,140,157,158,159,186],[91,140,157,158,187],[91,133,140,157,158],[91,133,140,151,153,157,158,163,172,175,183,185,186,188],[91,140,157,158,172,189],[64,75,76,77,78,79,80,81,82,91,140,157,158],[64,91,140,157,158],[64,65,91,140,157,158],[65,66,73,74,91,140,157,158],[64,75,91,140,157,158],[67,68,69,70,71,72,91,140,157,158],[91,105,109,140,157,158,183],[91,105,140,157,158,172,183],[91,100,140,157,158],[91,102,105,140,157,158,180,183],[91,140,157,158,160,180],[91,140,157,158,190],[91,100,140,157,158,190],[91,102,105,140,157,158,160,183],[91,97,98,101,104,140,151,157,158,172,183],[91,105,112,140,157,158],[91,97,103,140,157,158],[91,105,126,127,140,157,158],[91,101,105,140,157,158,175,183,190],[91,126,140,157,158,190],[91,99,100,140,157,158,190],[91,105,140,157,158],[91,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,132,140,157,158],[91,105,120,140,157,158],[91,105,112,113,140,157,158],[91,103,105,113,114,140,157,158],[91,104,140,157,158],[91,97,100,105,140,157,158],[91,105,109,113,114,140,157,158],[91,109,140,157,158],[91,103,105,108,140,157,158,183],[91,97,102,105,112,140,157,158],[91,140,157,158,172],[91,100,105,126,140,157,158,188,190],[84,91,140,157,158],[83,91,140,157,158],[91,140,152,157,158,190]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"5675eb00d305c8dbefa6190fbc5407cd169d48f9049ac610506a5d09a8d6724a","impliedFormat":1},{"version":"95e8f479cf41319bd14150ac2ce291217a8002ecc39d16f1f7a3e408d86ee455","impliedFormat":1},{"version":"d2cd28c5a1f5a7853888cfc9645aef2e5c003f1322f7a66b5aff8d7f5e835f59","impliedFormat":1},{"version":"0fb7e2fd9a55a699b721005f9b971bb102b8bfe6aba92b0431d974b542fdabd7","impliedFormat":1},{"version":"8db3b7b47410ccabea0234d975dffea72f5ed4586305dc54b22a164721804cc5","impliedFormat":1},{"version":"3c33b043fbba511e7af9b21cf6ffdfd77a5b33114cf13bcd93871545bdbcc5cb","impliedFormat":1},{"version":"fffd95262f9eaa6988088f5b3fefed8af0719d60e913e63f6fbe724eba3f118d","impliedFormat":1},{"version":"3c683aee5744dedcb460b2e1c47804f4010ac8fba73f3093f88ccbb013a3c678","impliedFormat":1},{"version":"51ebb8f5a78bf7b58c0479fd51a3d39c1f91075a6a31620c3e510e6295ef43f1","impliedFormat":1},{"version":"a34327c4c9e71742f9248374e9506fb555d724121ddbd57e45e14cc9ee99e857","impliedFormat":1},{"version":"28febab4f39ed27ad0bac2705f35d83a434c74a3c49328f02f7d2a813ac937ab","impliedFormat":1},{"version":"dfe421b0e52e642279c9ebb5473acf33c091d5714ac09b75592067ee641deff2","impliedFormat":1},{"version":"1e737e690ee03096c261b2bb66ebd88c9b9406d41669b6f0257a044554c02369","impliedFormat":1},{"version":"7e7315b099cdfb23431d39759f6d7942201758ac98fc1c85f464453065d9ab62","impliedFormat":1},{"version":"cf95c55d326a751f162723f17a88a499399dc288729ce8b8568baaff249425ba","impliedFormat":1},{"version":"4cde2fc9f63efcd3c7a22f47f7e57dcbc69a2ca3656bda166493105d8ec218b9","impliedFormat":1},{"version":"c033fbb15d3cbab3e5f1e5faea532498dd48ace23de65c66c47c93296add9484","impliedFormat":1},{"version":"cdb9157390c893812916732a2f237741bd08d7503a5d9d1589d8a8d5161f3a16","impliedFormat":1},{"version":"7bb3f2b3ec9ce1edde70b97af16f0cc2d55ef8c31b2f2d5fde7f2834dcaa7a9e","impliedFormat":1},{"version":"a22b4fc7c03f685be422cc8ed799a2a9b7218d28a9f20dfe27f45396c7e58036","impliedFormat":1},{"version":"59830dd3f9eff0e8b68a2892394777f358e4c86f9e318081a7539e5e1b16c764","signature":"c35f10cca59ad465ae3464c5babd50cac1ec62d0ae9d5c0924a8b8ec7057d45b","impliedFormat":99},{"version":"332b6550d09e92cb5cd03499a3c46bda9afacf417c7d9b6db4a247a20ea776d0","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a13b9bb3e49bc162bb03870f3409474c58bb04a5e60618c305c7842f8a7b251c","impliedFormat":1},{"version":"857f9cda624606f2bfb1cb758d47499edfbee66b2cf46804f54620bd430ea26f","impliedFormat":1}],"root":[84,85],"options":{"composite":true,"declaration":true,"module":100,"outDir":"./dist","rootDir":"./src","strict":true,"target":9},"referencedMap":[[137,1],[138,1],[139,2],[91,3],[140,4],[141,5],[142,6],[86,7],[89,8],[87,7],[88,7],[143,9],[144,10],[145,11],[146,12],[147,13],[148,14],[149,14],[150,15],[151,16],[152,17],[153,18],[92,7],[90,7],[154,19],[155,20],[156,21],[190,22],[157,23],[158,7],[159,24],[160,25],[161,26],[162,27],[163,28],[164,29],[165,30],[166,31],[167,32],[168,32],[169,33],[170,7],[171,34],[172,35],[174,36],[173,37],[175,38],[176,39],[177,40],[178,41],[179,42],[180,43],[181,44],[182,45],[183,46],[184,47],[185,48],[186,49],[187,50],[93,7],[94,7],[95,7],[134,51],[135,7],[136,7],[188,52],[189,53],[96,7],[64,7],[83,54],[65,55],[66,56],[75,57],[71,58],[67,58],[73,59],[70,58],[68,58],[69,58],[72,56],[74,56],[79,55],[80,55],[76,55],[81,55],[77,55],[78,55],[82,55],[61,7],[62,7],[12,7],[10,7],[11,7],[16,7],[15,7],[2,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[24,7],[3,7],[25,7],[26,7],[4,7],[27,7],[31,7],[28,7],[29,7],[30,7],[32,7],[33,7],[34,7],[5,7],[35,7],[36,7],[37,7],[38,7],[6,7],[42,7],[39,7],[40,7],[41,7],[43,7],[7,7],[44,7],[49,7],[50,7],[45,7],[46,7],[47,7],[48,7],[8,7],[54,7],[51,7],[52,7],[53,7],[55,7],[9,7],[56,7],[63,7],[57,7],[58,7],[60,7],[59,7],[1,7],[14,7],[13,7],[112,60],[122,61],[111,60],[132,62],[103,63],[102,64],[131,65],[125,66],[130,67],[105,68],[119,69],[104,70],[128,71],[100,72],[99,65],[129,73],[101,74],[106,75],[107,7],[110,75],[97,7],[133,76],[123,77],[114,78],[115,79],[117,80],[113,81],[116,82],[126,65],[108,83],[109,84],[118,85],[98,86],[121,77],[120,75],[124,7],[127,87],[85,88],[84,89],[191,90],[192,7]],"latestChangedDtsFile":"./dist/LinkConfig.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a612a60..36a1d59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,12 @@ importers: packages/schemas: dependencies: + '@powersync/management-types': + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types + version: file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2) + '@powersync/service-types': + specifier: ^0.13.3 + version: 0.13.3 ts-codec: specifier: ^1.3.0 version: 1.3.0 @@ -6167,7 +6173,7 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 @@ -6175,7 +6181,7 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 @@ -8677,7 +8683,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8695,7 +8701,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) vite-node: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: @@ -8717,7 +8723,7 @@ snapshots: vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 From 63eebde09cc1d991f23acfdbc97c42d198ed5c3b Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Wed, 4 Feb 2026 11:03:56 +0200 Subject: [PATCH 006/141] Command structures and implement deploy command --- package.json | 7 + packages/cli/package.json | 6 +- packages/cli/src/clients/CloudClient.ts | 23 + packages/cli/src/clients/SelfHostedClient.ts | 21 + .../src/command-types/CloudInstanceCommand.ts | 69 ++- .../cli/src/command-types/InstanceCommand.ts | 30 +- .../cli/src/command-types/PowerSyncCommand.ts | 11 + .../SelfHostedInstanceCommand.ts | 43 +- packages/cli/src/commands/deploy.ts | 47 +- packages/cli/src/commands/init.ts | 5 +- packages/cli/src/commands/link/cloud.ts | 9 +- packages/cli/src/commands/link/self-hosted.ts | 8 +- packages/cli/src/utils/ensureServiceType.ts | 33 +- packages/cli/src/utils/env.ts | 9 + .../{loadLinkDoc.ts => project-config.ts} | 17 + packages/cli/src/utils/yaml.ts | 56 +++ .../self-hosted/base/powersync/service.yaml | 10 +- packages/cli/test/commands/deploy.test.ts | 103 +++++ packages/cli/test/commands/link.test.ts | 22 +- packages/cli/tsconfig.json | 2 + packages/schemas/src/index.ts | 5 +- pnpm-lock.yaml | 425 +++++++++++++++++- 22 files changed, 867 insertions(+), 94 deletions(-) create mode 100644 packages/cli/src/clients/CloudClient.ts create mode 100644 packages/cli/src/clients/SelfHostedClient.ts create mode 100644 packages/cli/src/command-types/PowerSyncCommand.ts create mode 100644 packages/cli/src/utils/env.ts rename packages/cli/src/utils/{loadLinkDoc.ts => project-config.ts} (59%) create mode 100644 packages/cli/src/utils/yaml.ts create mode 100644 packages/cli/test/commands/deploy.test.ts diff --git a/package.json b/package.json index e679c83..1d2cf69 100644 --- a/package.json +++ b/package.json @@ -14,5 +14,12 @@ "engines": { "node": ">=24" }, + "pnpm": { + "overrides": { + "@powersync/service-client": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz", + "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz", + "@powersync/management-client": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz" + } + }, "packageManager": "pnpm@10.0.0" } diff --git a/packages/cli/package.json b/packages/cli/package.json index b1a205e..6172781 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -11,7 +11,11 @@ "@oclif/core": "^4", "@oclif/plugin-help": "^6", "@oclif/plugin-plugins": "^5", - "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types", + "@powersync/service-client": "0.0.1", + "@powersync/management-types": "0.0.1", + "@powersync/cli-schemas": "workspace:*", + "@powersync/management-client": "0.0.1", + "@journeyapps-labs/common-sdk": "1.0.2", "ts-codec": "^1.3.0", "yaml": "^2" }, diff --git a/packages/cli/src/clients/CloudClient.ts b/packages/cli/src/clients/CloudClient.ts new file mode 100644 index 0000000..69a9c9f --- /dev/null +++ b/packages/cli/src/clients/CloudClient.ts @@ -0,0 +1,23 @@ +import * as sdk from '@journeyapps-labs/common-sdk'; +import { PowerSyncManagementClient } from '@powersync/management-client'; +import { env } from '../utils/env.js'; + +/** + * Creates a PowerSync Management Client for the Cloud. + * Uses the credentials from the login command. + */ +export function createCloudClient() { + const getToken = () => { + // TODO: get from secure store + return 'TODO'; + }; + + return new PowerSyncManagementClient({ + endpoint: env._PS_MANAGEMENT_SERVICE_URL, + client: sdk.createNodeNetworkClient({ + headers: () => ({ + Authorization: `Bearer ${getToken()}` + }) + }) + }); +} diff --git a/packages/cli/src/clients/SelfHostedClient.ts b/packages/cli/src/clients/SelfHostedClient.ts new file mode 100644 index 0000000..9d5dfab --- /dev/null +++ b/packages/cli/src/clients/SelfHostedClient.ts @@ -0,0 +1,21 @@ +import * as sdk from '@journeyapps-labs/common-sdk'; +import { InstanceClient } from '@powersync/service-client'; + +export type SelfHostedClientConfig = { + apiUrl: string; + apiKey: string; +}; + +/** + * Creates a PowerSync Instance Client for a self-hosted instance. + */ +export function createSelfHostedClient(config: SelfHostedClientConfig) { + return new InstanceClient({ + endpoint: config.apiUrl, + client: sdk.createNodeNetworkClient({ + headers: () => ({ + Authorization: `Bearer ${config.apiKey}` + }) + }) + }); +} diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index c6ad184..35404c0 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -1,5 +1,23 @@ +import { CLICloudConfig, RequiredCloudLinkConfig } from '@powersync/cli-schemas'; +import { PowerSyncManagementClient } from '@powersync/management-client'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { createCloudClient } from '../clients/CloudClient.js'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; -import { InstanceCommand } from './InstanceCommand.js'; +import { + LINK_FILENAME, + loadLinkDocument, + loadServiceDocument, + SERVICE_FILENAME, + SYNC_FILENAME +} from '../utils/project-config.js'; +import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; + +export type CloudProject = { + projectDirectory: string; + linked: RequiredCloudLinkConfig; + syncRulesContent?: string; +}; /** Base command for operations that require a Cloud-type PowerSync project (service.yaml _type: cloud). */ export abstract class CloudInstanceCommand extends InstanceCommand { @@ -8,12 +26,49 @@ export abstract class CloudInstanceCommand extends InstanceCommand { }; /** - * Ensures the project directory exists and service.yaml has _type: cloud. - * @returns The resolved absolute path to the project directory. + * @returns A PowerSync Management Client for the Cloud. */ - ensureConfigType(directory: string): string { - const projectDir = this.ensureProjectDirExists(directory); - ensureServiceTypeMatches(this, projectDir, 'cloud', directory); - return projectDir; + getClient(): PowerSyncManagementClient { + return createCloudClient(); + } + + loadProject(flags: { directory: string }, options?: EnsureConfigOptions): CloudProject { + const projectDir = this.ensureProjectDirExists(flags); + + // Check if the service.yaml file is present and has _type: cloud + ensureServiceTypeMatches(this, projectDir, 'cloud', flags.directory, options?.configFileRequired ?? false); + + const linkPath = join(projectDir, LINK_FILENAME); + if (options?.linkingIsRequired && !existsSync(linkPath)) { + this.error( + `Linking is required before using this command. Run:\n powersync link cloud --instance-id= --org-id= --project-id=\nSee \`powersync link cloud --help\` for details.`, + { exit: 1 } + ); + } + + const doc = loadLinkDocument(linkPath); + let linked: RequiredCloudLinkConfig; + try { + linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); + } catch (error) { + this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); + } + + const syncRulesPath = join(projectDir, SYNC_FILENAME); + let syncRulesContent: string | undefined; + if (existsSync(syncRulesPath)) { + syncRulesContent = readFileSync(syncRulesPath, 'utf8'); + } + return { + projectDirectory: projectDir, + linked, + syncRulesContent + }; + } + + parseConfig(projectDirectory: string) { + const servicePath = join(projectDirectory, SERVICE_FILENAME); + const doc = loadServiceDocument(servicePath); + return CLICloudConfig.decode(doc.contents?.toJSON()); } } diff --git a/packages/cli/src/command-types/InstanceCommand.ts b/packages/cli/src/command-types/InstanceCommand.ts index 5c976ad..0e58474 100644 --- a/packages/cli/src/command-types/InstanceCommand.ts +++ b/packages/cli/src/command-types/InstanceCommand.ts @@ -1,10 +1,24 @@ -import { Command, Flags } from '@oclif/core'; +import { Flags } from '@oclif/core'; import { existsSync } from 'node:fs'; -import { join } from 'node:path'; +import { PowerSyncCommand } from './PowerSyncCommand.js'; + +export type EnsureConfigOptions = { + /** + * If the service.yaml file is required to be present in the project directory. + */ + configFileRequired: boolean; + + /** + * If true, when link.yaml is missing show a "Linking is required" message with example command. + * If false or omitted, missing or invalid link.yaml results in a parse error. + */ + linkingIsRequired?: boolean; +}; /** Base command for operations that target a PowerSync project directory (e.g. link, init). */ -export abstract class InstanceCommand extends Command { +export abstract class InstanceCommand extends PowerSyncCommand { static flags = { + ...PowerSyncCommand.flags, directory: Flags.string({ default: 'powersync', description: 'Directory containing PowerSync config (default: powersync).' @@ -16,8 +30,9 @@ export abstract class InstanceCommand extends Command { * Calls this.error and exits if the directory is missing. * @returns The resolved absolute path to the project directory. */ - ensureProjectDirExists(directory: string): string { - const projectDir = this.resolveProjectDir(directory); + ensureProjectDirExists(flags: { directory: string }): string { + const { directory } = flags; + const projectDir = this.resolveProjectDir(flags); if (!existsSync(projectDir)) { this.error(`Directory "${directory}" not found. Run \`powersync init\` first to create the project.`, { @@ -27,9 +42,4 @@ export abstract class InstanceCommand extends Command { return projectDir; } - - /** Resolves the project directory path from the --directory flag (relative to cwd). */ - resolveProjectDir(directory: string): string { - return join(process.cwd(), directory); - } } diff --git a/packages/cli/src/command-types/PowerSyncCommand.ts b/packages/cli/src/command-types/PowerSyncCommand.ts new file mode 100644 index 0000000..6714f14 --- /dev/null +++ b/packages/cli/src/command-types/PowerSyncCommand.ts @@ -0,0 +1,11 @@ +import { Command } from '@oclif/core'; +import { join } from 'node:path'; + +/** Base command for operations that target a PowerSync project directory (e.g. link, init). */ +export abstract class PowerSyncCommand extends Command { + /** Resolves the project directory path from the --directory flag (relative to cwd). */ + resolveProjectDir(flags: { directory: string }): string { + const { directory } = flags; + return join(process.cwd(), directory); + } +} diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts index c6139dd..3170d16 100644 --- a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -1,5 +1,13 @@ +import { CLISelfHostedConfig, RequiredSelfHostedLinkConfig } from '@powersync/cli-schemas'; +import { join } from 'node:path'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; -import { InstanceCommand } from './InstanceCommand.js'; +import { LINK_FILENAME, loadLinkDocument, loadServiceDocument, SERVICE_FILENAME } from '../utils/project-config.js'; +import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; + +export type SelfHostedProject = { + projectDirectory: string; + linked: RequiredSelfHostedLinkConfig; +}; /** Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). */ export abstract class SelfHostedInstanceCommand extends InstanceCommand { @@ -7,13 +15,30 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { ...InstanceCommand.flags }; - /** - * Ensures the project directory exists and service.yaml has _type: self-hosted. - * @returns The resolved absolute path to the project directory. - */ - ensureConfigType(directory: string): string { - const projectDir = this.ensureProjectDirExists(directory); - ensureServiceTypeMatches(this, projectDir, 'self-hosted', directory); - return projectDir; + loadProject(flags: { directory: string }, options?: EnsureConfigOptions): SelfHostedProject { + const projectDir = this.ensureProjectDirExists(flags); + + // Check if the service.yaml file is present and has _type: cloud + ensureServiceTypeMatches(this, projectDir, 'cloud', flags.directory, options?.configFileRequired ?? false); + + const linkPath = join(projectDir, LINK_FILENAME); + const doc = loadLinkDocument(linkPath); + let linked: RequiredSelfHostedLinkConfig; + try { + linked = RequiredSelfHostedLinkConfig.decode(doc.contents?.toJSON()); + } catch (error) { + this.error(`Failed to parse ${LINK_FILENAME} as SelfHostedLinkConfig: ${error}`, { exit: 1 }); + } + + return { + projectDirectory: projectDir, + linked + }; + } + + parseConfig(projectDirectory: string) { + const servicePath = join(projectDirectory, SERVICE_FILENAME); + const doc = loadServiceDocument(servicePath); + return CLISelfHostedConfig.decode(doc.contents?.toJSON()); } } diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 04aeab1..b96f3a6 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -1,10 +1,47 @@ -import {Command} from '@oclif/core' +import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; -export default class Deploy extends Command { - static description = 'Deploys changes to the PowerSync management service. Cloud only.' - static summary = 'Deploy sync rules and configuration changes.' +export default class Deploy extends CloudInstanceCommand { + static description = 'Deploys changes to the PowerSync management service. Cloud only.'; + static summary = 'Deploy sync rules and configuration changes.'; + + static flags = { + ...CloudInstanceCommand.flags + }; async run(): Promise { - this.log('deploy: not yet implemented') + const { flags } = await this.parse(Deploy); + + const { projectDirectory, linked, syncRulesContent } = this.loadProject(flags, { + configFileRequired: true, + linkingIsRequired: true + }); + const config = this.parseConfig(projectDirectory); + const client = this.getClient(); + + this.log( + `Deploying changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}` + ); + + try { + const existingConfig = await client.getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + + await client.deployInstance({ + // Spread the existing config like name, and program version contraints. + // Should we allow specifying these in the config file? + ...existingConfig, + app_id: linked.project_id, + config, + sync_rules: syncRulesContent + }); + } catch (error) { + this.error( + `Failed to deploy changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + } } } diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index c072f92..2357ec5 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -4,13 +4,14 @@ import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { InstanceCommand } from '../command-types/InstanceCommand.js'; +import { PowerSyncCommand } from '../command-types/PowerSyncCommand.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); /** Absolute path to templates (package root when running from dist/commands/ or src/commands/). */ const TEMPLATES_DIR = join(__dirname, '..', '..', 'templates'); -export default class Init extends InstanceCommand { +export default class Init extends PowerSyncCommand { static description = 'Creates a new PowerSync project in the current directory. Supports --type=cloud or self-hosted.'; static flags = { @@ -27,7 +28,7 @@ export default class Init extends InstanceCommand { const { flags } = await this.parse(Init); const { directory, type } = flags; - const targetDir = this.resolveProjectDir(directory); + const targetDir = this.resolveProjectDir(flags); if (existsSync(targetDir)) { this.error( diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index e304bb9..f3c79db 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -3,9 +3,8 @@ import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; -import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; - -const LINK_FILENAME = 'link.yaml'; +import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; +import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; @@ -33,7 +32,9 @@ export default class LinkCloud extends CloudInstanceCommand { const { flags } = await this.parse(LinkCloud); const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; - const projectDir = this.ensureConfigType(directory); + // We don't require having the cloud condig in service.yaml for all commands + const projectDir = this.ensureProjectDirExists({ directory }); + ensureServiceTypeMatches(this, projectDir, 'cloud', directory, false); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index e91c9db..e0891a9 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -3,9 +3,8 @@ import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { SelfHostedInstanceCommand } from '../../command-types/SelfHostedInstanceCommand.js'; -import { loadLinkDocument } from '../../utils/loadLinkDoc.js'; - -const LINK_FILENAME = 'link.yaml'; +import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; +import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; export default class LinkSelfHosted extends SelfHostedInstanceCommand { static description = 'Link this directory to a self-hosted PowerSync instance.'; @@ -26,7 +25,8 @@ export default class LinkSelfHosted extends SelfHostedInstanceCommand { const { flags } = await this.parse(LinkSelfHosted); const { directory, url, 'api-key': apiKey } = flags; - const projectDir = this.ensureConfigType(directory); + const projectDir = this.ensureProjectDirExists(flags); + ensureServiceTypeMatches(this, projectDir, 'self-hosted', directory, false); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/utils/ensureServiceType.ts b/packages/cli/src/utils/ensureServiceType.ts index 540ddc2..769140d 100644 --- a/packages/cli/src/utils/ensureServiceType.ts +++ b/packages/cli/src/utils/ensureServiceType.ts @@ -1,43 +1,48 @@ -import { existsSync, readFileSync } from 'node:fs'; +import { existsSync } from 'node:fs'; import { join } from 'node:path'; -import { parse as parseYaml } from 'yaml'; +import { loadServiceDocument } from './project-config.js'; const SERVICE_FILENAME = 'service.yaml'; export type ServiceType = 'cloud' | 'self-hosted'; /** - * Ensures service.yaml exists in the project dir and its _type matches the expected link type. + * Ensures, if it exists, that service.yaml in the project dir has _type matching the expected service type. * Calls command.error and exits if the file is missing, or _type is missing or mismatched. + * Used by link, deploy, and other commands that require a specific project type (cloud or self-hosted). */ export function ensureServiceTypeMatches( command: { error: (message: string, options: { exit: number }) => never }, projectDir: string, expectedType: ServiceType, - directoryLabel: string + directoryLabel: string, + configRequired: boolean ): void { const servicePath = join(projectDir, SERVICE_FILENAME); if (!existsSync(servicePath)) { - command.error( - `No ${SERVICE_FILENAME} found in "${directoryLabel}". Run \`powersync init\` first to create the project.`, - { exit: 1 } - ); + if (configRequired) { + command.error( + `${SERVICE_FILENAME} in "${directoryLabel}" is missing. Add \`_type: ${expectedType}\` for this command.`, + { exit: 1 } + ); + } + return; } - const content = readFileSync(servicePath, 'utf8'); - const service = parseYaml(content) as { _type?: string }; + const service = loadServiceDocument(servicePath); + const serviceJson = service.contents?.toJSON(); - if (service._type === undefined || service._type === null) { + if (serviceJson?._type === undefined || serviceJson?._type === null) { command.error( - `${SERVICE_FILENAME} in "${directoryLabel}" is missing \`_type\`. Add \`_type: ${expectedType}\` to match this link command.`, + `${SERVICE_FILENAME} in "${directoryLabel}" is missing \`_type\`. Add \`_type: ${expectedType}\` for this command.`, { exit: 1 } ); } - if (service._type !== expectedType) { + if (serviceJson?._type !== expectedType) { command.error( - `${SERVICE_FILENAME} in "${directoryLabel}" has \`_type: ${service._type}\` but you are running \`link ${expectedType}\`. The _type must match. Use \`powersync init --type=${expectedType}\` to create a project of the correct type, or change _type in ${SERVICE_FILENAME}.`, + `${SERVICE_FILENAME} in "${directoryLabel}" has \`_type: ${serviceJson?._type}\` but this command requires \`_type: ${expectedType}\`. Use \`powersync init --type=${expectedType}\` to create a project of the correct type, or change _type in ${SERVICE_FILENAME}.`, { exit: 1 } ); } diff --git a/packages/cli/src/utils/env.ts b/packages/cli/src/utils/env.ts new file mode 100644 index 0000000..c7284f4 --- /dev/null +++ b/packages/cli/src/utils/env.ts @@ -0,0 +1,9 @@ +const DEFAULT_PS_MANAGEMENT_SERVICE_URL = 'https://api.powersync.com'; + +export type ENV = { + _PS_MANAGEMENT_SERVICE_URL: string; +}; + +export const env: ENV = { + _PS_MANAGEMENT_SERVICE_URL: process.env._PS_MANAGEMENT_SERVICE_URL || DEFAULT_PS_MANAGEMENT_SERVICE_URL +}; diff --git a/packages/cli/src/utils/loadLinkDoc.ts b/packages/cli/src/utils/project-config.ts similarity index 59% rename from packages/cli/src/utils/loadLinkDoc.ts rename to packages/cli/src/utils/project-config.ts index 83d826b..624449f 100644 --- a/packages/cli/src/utils/loadLinkDoc.ts +++ b/packages/cli/src/utils/project-config.ts @@ -1,5 +1,15 @@ import { existsSync, readFileSync } from 'node:fs'; import { Document, parseDocument } from 'yaml'; +import { parseYamlFile } from './yaml.js'; + +/** + * The filename of the link configuration file. + */ +export const LINK_FILENAME = 'link.yaml'; + +export const SERVICE_FILENAME = 'service.yaml'; + +export const SYNC_FILENAME = 'sync.yaml'; /** * Loads link.yaml as a YAML Document so it can be updated in place (preserving comments). @@ -13,3 +23,10 @@ export function loadLinkDocument(linkPath: string): Document { } return doc; } + +/** + * Parses the service.yaml file as a YAML Document. + */ +export function loadServiceDocument(servicePath: string): Document { + return parseYamlFile(servicePath); +} diff --git a/packages/cli/src/utils/yaml.ts b/packages/cli/src/utils/yaml.ts new file mode 100644 index 0000000..e381aa5 --- /dev/null +++ b/packages/cli/src/utils/yaml.ts @@ -0,0 +1,56 @@ +import { readFileSync } from 'node:fs'; +import * as yaml from 'yaml'; + +/** + * Custom YAML tag which performs string environment variable substitution + * Allows for type casting string environment variables to boolean or number + * by using the syntax !env PS_MONGO_PORT::number or !env PS_USE_SUPABASE::boolean + */ +export const YamlEnvTag: yaml.ScalarTag = { + tag: '!env', + resolve(envName: string, onError: (error: string) => void) { + // allow type casting if the envName contains a type suffix + // e.g. PS_MONGO_PORT::number or PS_USE_SUPABASE::boolean + const [name, type = 'string'] = envName.split('::'); + + let value = process.env[name]; + + if (typeof value == 'undefined') { + onError( + `Attempted to substitute environment variable "${envName}" which is undefined. Set this variable on the environment.` + ); + return envName; + } + + switch (type) { + case 'string': + return value; + case 'number': + const numberValue = Number(value); + if (Number.isNaN(numberValue)) { + onError(`Environment variable "${envName}" is not a valid number. Got: "${value}".`); + return envName; + } + return numberValue; + case 'boolean': + if (value?.toLowerCase() == 'true') { + return true; + } else if (value?.toLowerCase() == 'false') { + return false; + } else { + onError(`Environment variable "${envName}" is not a boolean. Expected "true" or "false", got "${value}".`); + return envName; + } + default: + onError(`Environment variable "${envName}" has an invalid type suffix "${type}".`); + return envName; + } + } +}; + +export function parseYamlFile(filePath: string): yaml.Document { + const content = readFileSync(filePath, 'utf8'); + return yaml.parseDocument(content, { + customTags: [YamlEnvTag] + }); +} diff --git a/packages/cli/templates/self-hosted/base/powersync/service.yaml b/packages/cli/templates/self-hosted/base/powersync/service.yaml index d89cb1b..1a387a5 100644 --- a/packages/cli/templates/self-hosted/base/powersync/service.yaml +++ b/packages/cli/templates/self-hosted/base/powersync/service.yaml @@ -86,9 +86,9 @@ telemetry: # ----------------------------------------------------------------------------- # STORAGE – configuration for the storage backend (sync bucket storage) # ----------------------------------------------------------------------------- -storage: - type: mongodb - uri: !env PS_MONGO_URI +# storage: +# type: mongodb +# uri: !env PS_MONGO_URI # database: string # username: string # password: !env PS_MONGO_PASSWORD @@ -126,7 +126,7 @@ storage: # ----------------------------------------------------------------------------- # PORT – the port on which the service will listen for connections (number or string) # ----------------------------------------------------------------------------- -port: !env PS_PORT +# port: !env PS_PORT # ----------------------------------------------------------------------------- # SYNC RULES – configuration for synchronization rules that define data access patterns @@ -134,7 +134,7 @@ port: !env PS_PORT # One of path or content is supported. path is used in this example. sync_rules: # Path to the sync rules YAML file. - path: sync_rules.yaml + path: sync.yaml # Inline sync rules content as a string (use this or path, not both). # content: string # Whether to exit the process if there is an error parsing sync rules. diff --git a/packages/cli/test/commands/deploy.test.ts b/packages/cli/test/commands/deploy.test.ts new file mode 100644 index 0000000..41a2468 --- /dev/null +++ b/packages/cli/test/commands/deploy.test.ts @@ -0,0 +1,103 @@ +import { runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import { root } from '../helpers/root.js'; + +const LINK_FILENAME = 'link.yaml'; +const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\nregion: us\n`, 'utf8'); +} + +function writeLinkYaml(projectDir: string, opts: { instance_id: string; org_id: string; project_id: string }) { + const content = `type: cloud\ninstance_id: ${opts.instance_id}\norg_id: ${opts.org_id}\nproject_id: ${opts.project_id}\n`; + writeFileSync(join(projectDir, LINK_FILENAME), content, 'utf8'); +} + +describe('deploy', () => { + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'deploy-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('deploy', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when service.yaml _type is self-hosted', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); + writeLinkYaml(projectDir, { instance_id: 'i', org_id: 'o', project_id: 'p' }); + const result = await runCommand('deploy', { root }); + expect(result.error?.message).toMatch(/has `_type: self-hosted` but this command requires `_type: cloud`/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml does not exist', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runCommand('deploy', { root }); + expect(result.error?.message).toContain('Linking is required before using this command.'); + expect(result.error?.message).toContain('powersync link cloud --instance-id= --org-id= --project-id='); + expect(result.error?.message).toContain('powersync link cloud --help'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml is missing required fields', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + writeFileSync(join(projectDir, LINK_FILENAME), 'type: cloud\n', 'utf8'); + const result = await runCommand('deploy', { root }); + expect(result.error?.message).toMatch(/Failed to parse link\.yaml as CloudLinkConfig/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('respects --directory flag when project is in custom dir', async () => { + const customDir = 'my-powersync'; + const projectDir = join(tmpDir, customDir); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand(`link cloud --directory=${customDir} --instance-id=i --org-id=o --project-id=p`, { root }); + const result = await runCommand(`deploy --directory=${customDir}`, { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/instance i.*project p.*org o/); + }); + + describe('with valid cloud project', () => { + beforeEach(async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { root }); + }); + + it('attempts deploy and errors with exit 1 when client fails', async () => { + const result = await runCommand('deploy', { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch( + /Failed to deploy changes to instance inst-1 in project proj-1 in org org-1/ + ); + }); + }); +}); diff --git a/packages/cli/test/commands/link.test.ts b/packages/cli/test/commands/link.test.ts index aa3ba05..68a689c 100644 --- a/packages/cli/test/commands/link.test.ts +++ b/packages/cli/test/commands/link.test.ts @@ -39,21 +39,12 @@ describe('link', () => { expect(result.error?.oclif?.exit).toBe(1); }); - it('errors when service.yaml is missing', async () => { - mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); - const result = await runCommand('link cloud --instance-id=inst --org-id=o --project-id=p', { root }); - expect(result.error?.message).toMatch( - new RegExp(`No ${SERVICE_FILENAME} found in "${PROJECT_DIR}". Run \`powersync init\` first`) - ); - expect(result.error?.oclif?.exit).toBe(1); - }); - it('errors when service.yaml _type does not match (self-hosted)', async () => { const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); writeServiceYaml(projectDir, 'self-hosted'); const result = await runCommand('link cloud --instance-id=inst --org-id=o --project-id=p', { root }); - expect(result.error?.message).toMatch(/has `_type: self-hosted` but you are running `link cloud`/); + expect(result.error?.message).toMatch(/has `_type: self-hosted` but this command requires `_type: cloud`/); expect(result.error?.oclif?.exit).toBe(1); }); @@ -133,21 +124,12 @@ type: cloud expect(result.error?.oclif?.exit).toBe(1); }); - it('errors when service.yaml is missing', async () => { - mkdirSync(join(tmpDir, PROJECT_DIR), { recursive: true }); - const result = await runCommand('link self-hosted --url=https://x.com --api-key=k', { root }); - expect(result.error?.message).toMatch( - new RegExp(`No ${SERVICE_FILENAME} found in "${PROJECT_DIR}". Run \`powersync init\` first`) - ); - expect(result.error?.oclif?.exit).toBe(1); - }); - it('errors when service.yaml _type does not match (cloud)', async () => { const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); writeServiceYaml(projectDir, 'cloud'); const result = await runCommand('link self-hosted --url=https://x.com --api-key=k', { root }); - expect(result.error?.message).toMatch(/has `_type: cloud` but you are running `link self-hosted`/); + expect(result.error?.message).toMatch(/has `_type: cloud` but this command requires `_type: self-hosted`/); expect(result.error?.oclif?.exit).toBe(1); }); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 198ecdc..defcf63 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -9,7 +9,9 @@ "moduleResolution": "node16", "composite": true }, + "skipLibCheck": true, "include": ["./src/**/*"], + "references": [{ "path": "../schemas" }], "ts-node": { "esm": true } diff --git a/packages/schemas/src/index.ts b/packages/schemas/src/index.ts index e0f45fd..d20460c 100644 --- a/packages/schemas/src/index.ts +++ b/packages/schemas/src/index.ts @@ -1,3 +1,2 @@ -export { CLICloudConfig, CLIConfig, CLISelfHostedConfig } from './CLIConfig.js'; -export { CloudLinkConfig, LinkConfig, SelfHostedLinkConfig } from './LinkConfig.js'; -export type { LinkConfig as LinkConfigType } from './LinkConfig.js'; +export * from './CLIConfig.js'; +export * from './LinkConfig.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36a1d59..8dfb504 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@powersync/service-client': file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz + '@powersync/management-types': file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz + '@powersync/management-client': file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz + importers: .: @@ -17,6 +22,9 @@ importers: packages/cli: dependencies: + '@journeyapps-labs/common-sdk': + specifier: 1.0.2 + version: 1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) '@oclif/core': specifier: ^4 version: 4.8.0 @@ -26,9 +34,18 @@ importers: '@oclif/plugin-plugins': specifier: ^5 version: 5.4.55 + '@powersync/cli-schemas': + specifier: workspace:* + version: link:../schemas + '@powersync/management-client': + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz + version: file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) '@powersync/management-types': - specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types - version: file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2) + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz + version: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)(yaml@2.8.2) + '@powersync/service-client': + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz + version: file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) ts-codec: specifier: ^1.3.0 version: 1.3.0 @@ -76,8 +93,8 @@ importers: packages/schemas: dependencies: '@powersync/management-types': - specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types - version: file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2) + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz + version: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0) '@powersync/service-types': specifier: ^0.13.3 version: 0.13.3 @@ -100,6 +117,12 @@ importers: packages: + '@apidevtools/json-schema-ref-parser@14.2.1': + resolution: {integrity: sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==} + engines: {node: '>= 20'} + peerDependencies: + '@types/json-schema': ^7.0.15 + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -776,9 +799,21 @@ packages: '@types/node': optional: true + '@journeyapps-labs/common-sdk@1.0.2': + resolution: {integrity: sha512-bPFrrSGdVnaVFe6ymc/desjZk02gQ8f0EKggrU1/BQIeFJvGeQ804iOJsIYmUVU1fv4qNmJD0mD0GUjxu93Z8g==} + '@journeyapps-labs/micro-codecs@1.0.1': resolution: {integrity: sha512-Iy2sElOvk6C9NpzLHi0M2CYmVHVSRYK0y+BP/wRzaJ45z/3OUuXdwp9TqCEfVlqDIdDafoia7ES6X7oBWEBODw==} + '@journeyapps-labs/micro-errors@1.0.1': + resolution: {integrity: sha512-L7a6AC0mX+AWw1q7RfFYNRrfxWrMlXMnNnFPysHBuZFrtLh4bT/4cnGwXANlm5OBNQC2urhTmtpdOXZVlxC7yw==} + + '@journeyapps-labs/micro-schema@1.0.1': + resolution: {integrity: sha512-laimOhtrByxRb52yi880nVkPAHfqPZ4AzefmG161fto7IPoyhnSEwdWkou4byWS8II1d4R62Jhz01+wBTMHzdQ==} + + '@journeyapps-labs/micro-streaming@1.0.1': + resolution: {integrity: sha512-woWFNtPwKZwTz5NQ4RUecGOPXXO/W/KLkx8YOx9mvZ7XY3Lx1bDRpI1i6ZSBPeix+IBbl+bs394R0qlFliI1cg==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -930,8 +965,17 @@ packages: '@powersync/lib-services-framework@0.7.14': resolution: {integrity: sha512-beQyt75NMkiRiZOqcLGuKnCnPzwe59hCO9GjUn8Ox70PQoXncIw/9W7A9OiECQkRnWKuzX5LVarUrMnm6GCh0A==} - '@powersync/management-types@file:../service/powersync-hosted/public-packages/types': - resolution: {directory: ../service/powersync-hosted/public-packages/types, type: directory} + '@powersync/management-client@file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz': + resolution: {integrity: sha512-ZGZPdgIBtclAfALiPDOMUlZB/toRptK/Tpa+sEfnOMiauz59ipVncqyBVTtWJAF0AmKXlz7BW0lBeFuvIgceIg==, tarball: file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz} + version: 0.0.1 + + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz': + resolution: {integrity: sha512-payOWRLyDwfKQoS3w60Wl5EYAbtmbjk5wJBYsWCZXCGASSKOvD5nV4+1azcKDZYKhPNGjjrGWzuw7/ASkUs0Ow==, tarball: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz} + version: 0.0.1 + + '@powersync/service-client@file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz': + resolution: {integrity: sha512-N9Wfx3Xjm2dZXcZQFi7B5jKck1ZPs3MX+K7Dk3e+zRtN9oGclgukYRXGJEnqLB8DUpUiMT4H3lW804IQYwB+Tg==, tarball: file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz} + version: 1.18.2 '@powersync/service-core@1.18.2': resolution: {integrity: sha512-5ffw+V2KybJI0zDeLYSoOrhZNZRBldJfCysZ8Ht0kYwYwvRcdWH558K5YHqFYxao3yszTmOMLJuseUs4Aq5k7w==} @@ -1375,18 +1419,33 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/http-cache-semantics@4.2.0': resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1414,9 +1473,21 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/readable-stream@4.0.23': resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -1661,6 +1732,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1754,6 +1829,12 @@ packages: peerDependencies: ajv: 4.11.8 - 8 + better-ajv-errors@2.0.3: + resolution: {integrity: sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==} + engines: {node: '>= 18.20.6'} + peerDependencies: + ajv: 4.11.8 - 8 + bl@6.1.6: resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} @@ -2582,6 +2663,9 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -3813,6 +3897,10 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -4044,8 +4132,16 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + snapshots: + '@apidevtools/json-schema-ref-parser@14.2.1(@types/json-schema@7.0.15)': + dependencies: + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -5108,6 +5204,62 @@ snapshots: optionalDependencies: '@types/node': 18.19.130 + '@journeyapps-labs/common-sdk@1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': + dependencies: + '@journeyapps-labs/micro-errors': 1.0.1 + '@journeyapps-labs/micro-streaming': 1.0.1(@types/json-schema@7.0.15)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + '@types/node': 24.10.10 + agentkeepalive: 4.6.0 + bson: 6.10.4 + lodash: 4.17.23 + uuid: 13.0.0 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@types/json-schema' + - '@vitest/browser' + - '@vitest/ui' + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@journeyapps-labs/micro-codecs@1.0.1(tsx@4.21.0)': + dependencies: + '@types/node': 24.10.10 + bson: 6.10.4 + ts-codec: 1.3.0 + vitest: 3.2.4(@types/node@24.10.10)(tsx@4.21.0) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@vitest/browser' + - '@vitest/ui' + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@journeyapps-labs/micro-codecs@1.0.1(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/node': 24.10.10 @@ -5134,6 +5286,68 @@ snapshots: - tsx - yaml + '@journeyapps-labs/micro-errors@1.0.1': {} + + '@journeyapps-labs/micro-schema@1.0.1(@types/json-schema@7.0.15)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)': + dependencies: + '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15) + '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0)(yaml@2.8.2) + '@journeyapps-labs/micro-errors': 1.0.1 + ajv: 8.17.1 + better-ajv-errors: 2.0.3(ajv@8.17.1) + ts-codec: 1.3.0 + vitest: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + zod: 4.3.6 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@types/json-schema' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@journeyapps-labs/micro-streaming@1.0.1(@types/json-schema@7.0.15)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)': + dependencies: + '@journeyapps-labs/micro-errors': 1.0.1 + '@journeyapps-labs/micro-schema': 1.0.1(@types/json-schema@7.0.15)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + '@types/express': 5.0.6 + bson: 6.10.4 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@types/json-schema' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -5343,7 +5557,65 @@ snapshots: winston: 3.19.0 zod: 3.25.76 - '@powersync/management-types@file:../service/powersync-hosted/public-packages/types(tsx@4.21.0)(yaml@2.8.2)': + '@powersync/management-client@file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': + dependencies: + '@journeyapps-labs/common-sdk': 1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) + '@powersync/management-types': file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@types/json-schema' + - '@vitest/browser' + - '@vitest/ui' + - babel-plugin-macros + - bufferutil + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - utf-8-validate + - yaml + + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)': + dependencies: + '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0) + '@powersync/service-module-mssql': 0.1.2 + '@powersync/service-types': 0.13.3 + bson: 6.10.4 + ts-codec: 1.3.0 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@vitest/browser' + - '@vitest/ui' + - babel-plugin-macros + - bufferutil + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - utf-8-validate + - yaml + + '@powersync/management-types@file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0)(yaml@2.8.2) '@powersync/service-module-mssql': 0.1.2 @@ -5373,6 +5645,32 @@ snapshots: - utf-8-validate - yaml + '@powersync/service-client@file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': + dependencies: + '@journeyapps-labs/common-sdk': 1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) + '@powersync/service-types': 0.13.3 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/debug' + - '@types/json-schema' + - '@vitest/browser' + - '@vitest/ui' + - babel-plugin-macros + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@powersync/service-core@1.18.2': dependencies: '@js-sdsl/ordered-set': 4.4.2 @@ -5953,17 +6251,41 @@ snapshots: tslib: 2.8.1 optional: true + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.19.7 + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.19.7 + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.8': {} + '@types/express-serve-static-core@5.1.1': + dependencies: + '@types/node': 22.19.7 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 + '@types/http-cache-semantics@4.2.0': {} + '@types/http-errors@2.0.5': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -5990,9 +6312,22 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + '@types/readable-stream@4.0.23': dependencies: - '@types/node': 18.19.130 + '@types/node': 22.19.7 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.19.7 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.19.7 '@types/triple-beam@1.3.5': {} @@ -6181,6 +6516,14 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 @@ -6253,6 +6596,10 @@ snapshots: agent-base@7.1.4: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6368,6 +6715,15 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + better-ajv-errors@2.0.3(ajv@8.17.1): + dependencies: + '@babel/code-frame': 7.29.0 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.17.1 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + bl@6.1.6: dependencies: '@types/readable-stream': 4.0.23 @@ -7386,6 +7742,10 @@ snapshots: transitivePeerDependencies: - supports-color + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -8042,7 +8402,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.19.130 + '@types/node': 22.19.7 long: 5.3.2 punycode@2.3.1: {} @@ -8411,7 +8771,7 @@ snapshots: '@azure/identity': 4.13.0 '@azure/keyvault-keys': 4.10.0 '@js-joda/core': 5.7.0 - '@types/node': 18.19.130 + '@types/node': 22.19.7 bl: 6.1.6 iconv-lite: 0.7.2 js-md4: 0.3.2 @@ -8617,6 +8977,8 @@ snapshots: uuid@11.1.0: {} + uuid@13.0.0: {} + uuid@8.3.2: {} v8-compile-cache-lib@3.0.1: {} @@ -8679,6 +9041,47 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + vitest@3.2.4(@types/node@24.10.10)(tsx@4.21.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3(supports-color@8.1.1) + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.10 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 @@ -8873,3 +9276,5 @@ snapshots: yoctocolors-cjs@2.1.3: {} zod@3.25.76: {} + + zod@4.3.6: {} From ec8d323824c915061d91835f50e79d8cdd9084ec Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Wed, 4 Feb 2026 11:12:43 +0200 Subject: [PATCH 007/141] Add destroy and stop command implementation --- packages/cli/README.md | 2 +- packages/cli/src/commands/destroy.ts | 45 +++++++- packages/cli/src/commands/stop.ts | 44 +++++++- packages/cli/test/commands/destroy.test.ts | 116 +++++++++++++++++++++ packages/cli/test/commands/stop.test.ts | 116 +++++++++++++++++++++ 5 files changed, 313 insertions(+), 10 deletions(-) create mode 100644 packages/cli/test/commands/destroy.test.ts create mode 100644 packages/cli/test/commands/stop.test.ts diff --git a/packages/cli/README.md b/packages/cli/README.md index eac3402..405acd7 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -593,7 +593,7 @@ USAGE DESCRIPTION Stop a PowerSync instance. - Stops the linked PowerSync Cloud instance. Cloud only. + Stops the linked PowerSync Cloud instance. Cloud only. The instance can be started again by running `powersync deploy`. ``` _See code: [src/commands/stop.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/stop.ts)_ diff --git a/packages/cli/src/commands/destroy.ts b/packages/cli/src/commands/destroy.ts index c626d39..578af4d 100644 --- a/packages/cli/src/commands/destroy.ts +++ b/packages/cli/src/commands/destroy.ts @@ -1,10 +1,45 @@ -import {Command} from '@oclif/core' +import { Flags } from '@oclif/core'; -export default class Destroy extends Command { - static description = 'Destroys the linked PowerSync Cloud instance. Cloud only.' - static summary = 'Destroy a PowerSync instance.' +import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; + +export default class Destroy extends CloudInstanceCommand { + static description = 'Destroys the linked PowerSync Cloud instance. Cloud only.'; + static summary = 'Destroy a PowerSync instance.'; + + static flags = { + ...CloudInstanceCommand.flags, + confirm: Flags.string({ + description: 'Set to "yes" to confirm destruction of the instance.', + options: ['yes'] + }) + }; async run(): Promise { - this.log('destroy: not yet implemented') + const { flags } = await this.parse(Destroy); + + if (flags.confirm !== 'yes') { + this.error('Destruction requires confirmation. Run with --confirm=yes to confirm.', { exit: 1 }); + } + + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + const client = this.getClient(); + + this.log(`Destroying instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}`); + + try { + await client.destroyInstance({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + } catch (error) { + this.error( + `Failed to destroy instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + } } } diff --git a/packages/cli/src/commands/stop.ts b/packages/cli/src/commands/stop.ts index b9dfcaf..8d45585 100644 --- a/packages/cli/src/commands/stop.ts +++ b/packages/cli/src/commands/stop.ts @@ -1,10 +1,46 @@ -import { Command } from '@oclif/core'; +import { Flags } from '@oclif/core'; -export default class Stop extends Command { - static description = 'Stops the linked PowerSync Cloud instance. Cloud only.'; +import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; + +export default class Stop extends CloudInstanceCommand { + static description = + 'Stops the linked PowerSync Cloud instance. Cloud only. The instance can be started again by running `powersync deploy`.'; static summary = 'Stop a PowerSync instance.'; + static flags = { + ...CloudInstanceCommand.flags, + confirm: Flags.string({ + description: 'Set to "yes" to confirm stopping the instance.', + options: ['yes'] + }) + }; + async run(): Promise { - this.log('stop: not yet implemented'); + const { flags } = await this.parse(Stop); + + if (flags.confirm !== 'yes') { + this.error('Stopping requires confirmation. Run with --confirm=yes to confirm.', { exit: 1 }); + } + + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + const client = this.getClient(); + + this.log(`Stopping instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}`); + + try { + await client.deactivateInstance({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + } catch (error) { + this.error( + `Failed to stop instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + } } } diff --git a/packages/cli/test/commands/destroy.test.ts b/packages/cli/test/commands/destroy.test.ts new file mode 100644 index 0000000..34fcf43 --- /dev/null +++ b/packages/cli/test/commands/destroy.test.ts @@ -0,0 +1,116 @@ +import { runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import { root } from '../helpers/root.js'; + +const LINK_FILENAME = 'link.yaml'; +const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\nregion: us\n`, 'utf8'); +} + +function writeLinkYaml(projectDir: string, opts: { instance_id: string; org_id: string; project_id: string }) { + const content = `type: cloud\ninstance_id: ${opts.instance_id}\norg_id: ${opts.org_id}\nproject_id: ${opts.project_id}\n`; + writeFileSync(join(projectDir, LINK_FILENAME), content, 'utf8'); +} + +describe('destroy', () => { + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'destroy-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when --confirm is not yes', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand('link cloud --instance-id=i --org-id=o --project-id=p', { root }); + const result = await runCommand('destroy', { root }); + expect(result.error?.message).toContain('Destruction requires confirmation.'); + expect(result.error?.message).toContain('--confirm=yes'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('destroy --confirm=yes', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when service.yaml _type is self-hosted', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); + writeLinkYaml(projectDir, { instance_id: 'i', org_id: 'o', project_id: 'p' }); + const result = await runCommand('destroy --confirm=yes', { root }); + expect(result.error?.message).toMatch(/has `_type: self-hosted` but this command requires `_type: cloud`/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml does not exist', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runCommand('destroy --confirm=yes', { root }); + expect(result.error?.message).toContain('Linking is required before using this command.'); + expect(result.error?.message).toContain('powersync link cloud --instance-id= --org-id= --project-id='); + expect(result.error?.message).toContain('powersync link cloud --help'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml is missing required fields', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + writeFileSync(join(projectDir, LINK_FILENAME), 'type: cloud\n', 'utf8'); + const result = await runCommand('destroy --confirm=yes', { root }); + expect(result.error?.message).toMatch(/Failed to parse link\.yaml as CloudLinkConfig/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('respects --directory flag when project is in custom dir', async () => { + const customDir = 'my-powersync'; + const projectDir = join(tmpDir, customDir); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand(`link cloud --directory=${customDir} --instance-id=i --org-id=o --project-id=p`, { + root + }); + const result = await runCommand(`destroy --directory=${customDir} --confirm=yes`, { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/instance i.*project p.*org o/); + }); + + describe('with valid cloud project', () => { + beforeEach(async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { + root + }); + }); + + it('attempts destroy and errors with exit 1 when client fails', async () => { + const result = await runCommand('destroy --confirm=yes', { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/Failed to destroy instance inst-1 in project proj-1 in org org-1/); + }); + }); +}); diff --git a/packages/cli/test/commands/stop.test.ts b/packages/cli/test/commands/stop.test.ts new file mode 100644 index 0000000..f5ab9ce --- /dev/null +++ b/packages/cli/test/commands/stop.test.ts @@ -0,0 +1,116 @@ +import { runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import { root } from '../helpers/root.js'; + +const LINK_FILENAME = 'link.yaml'; +const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\nregion: us\n`, 'utf8'); +} + +function writeLinkYaml(projectDir: string, opts: { instance_id: string; org_id: string; project_id: string }) { + const content = `type: cloud\ninstance_id: ${opts.instance_id}\norg_id: ${opts.org_id}\nproject_id: ${opts.project_id}\n`; + writeFileSync(join(projectDir, LINK_FILENAME), content, 'utf8'); +} + +describe('stop', () => { + let tmpDir: string; + let origCwd: string; + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'stop-test-')); + process.chdir(tmpDir); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when --confirm is not yes', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand('link cloud --instance-id=i --org-id=o --project-id=p', { root }); + const result = await runCommand('stop', { root }); + expect(result.error?.message).toContain('Stopping requires confirmation.'); + expect(result.error?.message).toContain('--confirm=yes'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('stop --confirm=yes', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when service.yaml _type is self-hosted', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'self-hosted'); + writeLinkYaml(projectDir, { instance_id: 'i', org_id: 'o', project_id: 'p' }); + const result = await runCommand('stop --confirm=yes', { root }); + expect(result.error?.message).toMatch(/has `_type: self-hosted` but this command requires `_type: cloud`/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml does not exist', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runCommand('stop --confirm=yes', { root }); + expect(result.error?.message).toContain('Linking is required before using this command.'); + expect(result.error?.message).toContain('powersync link cloud --instance-id= --org-id= --project-id='); + expect(result.error?.message).toContain('powersync link cloud --help'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml is missing required fields', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + writeFileSync(join(projectDir, LINK_FILENAME), 'type: cloud\n', 'utf8'); + const result = await runCommand('stop --confirm=yes', { root }); + expect(result.error?.message).toMatch(/Failed to parse link\.yaml as CloudLinkConfig/); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('respects --directory flag when project is in custom dir', async () => { + const customDir = 'my-powersync'; + const projectDir = join(tmpDir, customDir); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand(`link cloud --directory=${customDir} --instance-id=i --org-id=o --project-id=p`, { + root + }); + const result = await runCommand(`stop --directory=${customDir} --confirm=yes`, { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/instance i.*project p.*org o/); + }); + + describe('with valid cloud project', () => { + beforeEach(async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { + root + }); + }); + + it('attempts stop and errors with exit 1 when client fails', async () => { + const result = await runCommand('stop --confirm=yes', { root }); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/Failed to stop instance inst-1 in project proj-1 in org org-1/); + }); + }); +}); From 77cc382a137c3b5d1fb8014482b5bacf148c9260 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Wed, 4 Feb 2026 15:54:59 +0200 Subject: [PATCH 008/141] fetch and pull cloud config commands --- packages/cli/src/api/fetch-cloud-config.ts | 24 +++ packages/cli/src/api/write-cloud-link.ts | 24 +++ packages/cli/src/clients/CloudClient.ts | 6 +- .../src/command-types/CloudInstanceCommand.ts | 8 +- .../SelfHostedInstanceCommand.ts | 9 +- packages/cli/src/commands/deploy.ts | 18 +- packages/cli/src/commands/fetch/config.ts | 45 ++++- packages/cli/src/commands/fetch/index.ts | 10 +- packages/cli/src/commands/link/cloud.ts | 24 ++- packages/cli/src/commands/link/self-hosted.ts | 8 +- packages/cli/src/commands/pull/config.ts | 176 ++++++++++++++++++ packages/cli/src/commands/pull/index.ts | 11 ++ packages/cli/src/utils/ensureServiceType.ts | 17 +- packages/cli/src/utils/project-config.ts | 6 + packages/cli/test/commands/deploy.test.ts | 30 ++- .../cli/test/commands/fetch/config.test.ts | 133 +++++++++++++ .../cli/test/commands/pull/config.test.ts | 140 ++++++++++++++ packages/cli/test/setup.ts | 6 +- .../cli/test/utils/cloud-client-factory.ts | 22 +++ packages/cli/vitest.config.ts | 7 +- packages/schemas/src/CLIConfig.ts | 7 + 21 files changed, 680 insertions(+), 51 deletions(-) create mode 100644 packages/cli/src/api/fetch-cloud-config.ts create mode 100644 packages/cli/src/api/write-cloud-link.ts create mode 100644 packages/cli/src/commands/pull/config.ts create mode 100644 packages/cli/src/commands/pull/index.ts create mode 100644 packages/cli/test/commands/fetch/config.test.ts create mode 100644 packages/cli/test/commands/pull/config.test.ts create mode 100644 packages/cli/test/utils/cloud-client-factory.ts diff --git a/packages/cli/src/api/fetch-cloud-config.ts b/packages/cli/src/api/fetch-cloud-config.ts new file mode 100644 index 0000000..c7c5461 --- /dev/null +++ b/packages/cli/src/api/fetch-cloud-config.ts @@ -0,0 +1,24 @@ +import { CLICloudConfig, CLICloudConfigDecoded, RequiredCloudLinkConfig } from '@powersync/cli-schemas'; +import { PowerSyncManagementClient } from '@powersync/management-client'; + +export type FetchedCloudConfig = { + config: CLICloudConfigDecoded; + syncRules?: string; +}; + +/** + * Fetches instance config from PowerSync Cloud and decodes it. + */ +export async function fetchCloudConfig( + client: PowerSyncManagementClient, + linked: RequiredCloudLinkConfig +): Promise { + const instanceConfig = await client.getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + const configFromCloud = instanceConfig.config ?? {}; + const config = CLICloudConfig.decode(configFromCloud as any); + return { config, syncRules: instanceConfig.sync_rules }; +} diff --git a/packages/cli/src/api/write-cloud-link.ts b/packages/cli/src/api/write-cloud-link.ts new file mode 100644 index 0000000..bd66fe9 --- /dev/null +++ b/packages/cli/src/api/write-cloud-link.ts @@ -0,0 +1,24 @@ +import { writeFileSync } from 'node:fs'; +import { join } from 'node:path'; + +import { LINK_FILENAME, loadLinkDocument } from '../utils/project-config.js'; + +export type WriteCloudLinkOptions = { + instanceId: string; + orgId: string; + projectId: string; +}; + +/** + * Writes or updates link.yaml with Cloud instance link (type: cloud, instance_id, org_id, project_id). + */ +export function writeCloudLink(projectDir: string, options: WriteCloudLinkOptions): void { + const { instanceId, orgId, projectId } = options; + const linkPath = join(projectDir, LINK_FILENAME); + const doc = loadLinkDocument(linkPath); + doc.set('type', 'cloud'); + doc.set('instance_id', instanceId); + doc.set('org_id', orgId); + doc.set('project_id', projectId); + writeFileSync(linkPath, doc.toString(), 'utf8'); +} diff --git a/packages/cli/src/clients/CloudClient.ts b/packages/cli/src/clients/CloudClient.ts index 69a9c9f..e1ceb90 100644 --- a/packages/cli/src/clients/CloudClient.ts +++ b/packages/cli/src/clients/CloudClient.ts @@ -6,18 +6,18 @@ import { env } from '../utils/env.js'; * Creates a PowerSync Management Client for the Cloud. * Uses the credentials from the login command. */ -export function createCloudClient() { +export function createCloudClient(): PowerSyncManagementClient { const getToken = () => { // TODO: get from secure store return 'TODO'; }; return new PowerSyncManagementClient({ - endpoint: env._PS_MANAGEMENT_SERVICE_URL, client: sdk.createNodeNetworkClient({ headers: () => ({ Authorization: `Bearer ${getToken()}` }) - }) + }), + endpoint: env._PS_MANAGEMENT_SERVICE_URL }); } diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index 35404c0..679dcb6 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -36,7 +36,13 @@ export abstract class CloudInstanceCommand extends InstanceCommand { const projectDir = this.ensureProjectDirExists(flags); // Check if the service.yaml file is present and has _type: cloud - ensureServiceTypeMatches(this, projectDir, 'cloud', flags.directory, options?.configFileRequired ?? false); + ensureServiceTypeMatches({ + command: this, + configRequired: options?.configFileRequired ?? false, + directoryLabel: flags.directory, + expectedType: 'cloud', + projectDir + }); const linkPath = join(projectDir, LINK_FILENAME); if (options?.linkingIsRequired && !existsSync(linkPath)) { diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts index 3170d16..d4f1e9a 100644 --- a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -18,8 +18,13 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { loadProject(flags: { directory: string }, options?: EnsureConfigOptions): SelfHostedProject { const projectDir = this.ensureProjectDirExists(flags); - // Check if the service.yaml file is present and has _type: cloud - ensureServiceTypeMatches(this, projectDir, 'cloud', flags.directory, options?.configFileRequired ?? false); + ensureServiceTypeMatches({ + command: this, + configRequired: options?.configFileRequired ?? false, + directoryLabel: flags.directory, + expectedType: 'self-hosted', + projectDir + }); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index b96f3a6..39a7886 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -15,6 +15,7 @@ export default class Deploy extends CloudInstanceCommand { configFileRequired: true, linkingIsRequired: true }); + const config = this.parseConfig(projectDirectory); const client = this.getClient(); @@ -23,11 +24,18 @@ export default class Deploy extends CloudInstanceCommand { ); try { - const existingConfig = await client.getInstanceConfig({ - app_id: linked.project_id, - org_id: linked.org_id, - id: linked.instance_id - }); + const existingConfig = await client + .getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }) + .catch((error) => { + this.error( + `Failed to get existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + }); await client.deployInstance({ // Spread the existing config like name, and program version contraints. diff --git a/packages/cli/src/commands/fetch/config.ts b/packages/cli/src/commands/fetch/config.ts index c108851..84f71ec 100644 --- a/packages/cli/src/commands/fetch/config.ts +++ b/packages/cli/src/commands/fetch/config.ts @@ -1,11 +1,44 @@ -import {Command} from '@oclif/core' +import { Flags } from '@oclif/core'; +import { Document } from 'yaml'; -export default class FetchConfig extends Command { - static description = - 'Pulls the current instance config from PowerSync Cloud and writes to local powersync folder. Cloud only.' - static summary = 'Update local configuration with cloud state.' +import { fetchCloudConfig } from '../../api/fetch-cloud-config.js'; +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; + +export default class FetchConfig extends CloudInstanceCommand { + static description = 'Fetches instance config from PowerSync Cloud. Requires a linked project. Cloud only.'; + static summary = 'Fetch config from cloud (output as yaml or json).'; + + static flags = { + ...CloudInstanceCommand.flags, + output: Flags.string({ + default: 'yaml', + description: 'Output format: yaml or json.', + options: ['json', 'yaml'] + }) + }; async run(): Promise { - this.log('fetch config: not yet implemented') + const { flags } = await this.parse(FetchConfig); + + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + + const client = this.getClient(); + + const fetched = await fetchCloudConfig(client, linked).catch((error) => { + this.error( + `Failed to fetch config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + }); + + if (flags.output === 'yaml') { + this.log(new Document(fetched).toString()); + return; + } + + this.log(JSON.stringify(fetched, null, 2)); } } diff --git a/packages/cli/src/commands/fetch/index.ts b/packages/cli/src/commands/fetch/index.ts index 722ea0d..9d219d9 100644 --- a/packages/cli/src/commands/fetch/index.ts +++ b/packages/cli/src/commands/fetch/index.ts @@ -1,11 +1,11 @@ -import {Command} from '@oclif/core' +import { Command } from '@oclif/core'; export default class Fetch extends Command { - static description = 'Commands to list instances, pull config, or get diagnostics status.' - static summary = 'Fetch data from PowerSync (instances, config, status).' + static description = 'Commands to list instances, fetch config, or get diagnostics status.'; + static summary = 'Fetch data from PowerSync (instances, config, status).'; async run(): Promise { - await this.parse(Fetch) - this.log('Use a subcommand: fetch instances | fetch config | fetch status') + await this.parse(Fetch); + this.log('Use a subcommand: fetch instances | fetch config | fetch status'); } } diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index f3c79db..3dd13f9 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -1,10 +1,9 @@ import { Flags } from '@oclif/core'; -import { writeFileSync } from 'node:fs'; -import { join } from 'node:path'; +import { writeCloudLink } from '../../api/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; -import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; +import { LINK_FILENAME } from '../../utils/project-config.js'; export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; @@ -12,7 +11,7 @@ export default class LinkCloud extends CloudInstanceCommand { static flags = { ...CloudInstanceCommand.flags, /** - * TODO, we could default these to the values used after login + * TODO, we could default some of these to the values used after login */ 'instance-id': Flags.string({ description: 'PowerSync Cloud instance ID.', @@ -32,17 +31,16 @@ export default class LinkCloud extends CloudInstanceCommand { const { flags } = await this.parse(LinkCloud); const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; - // We don't require having the cloud condig in service.yaml for all commands const projectDir = this.ensureProjectDirExists({ directory }); - ensureServiceTypeMatches(this, projectDir, 'cloud', directory, false); + ensureServiceTypeMatches({ + command: this, + configRequired: false, + directoryLabel: directory, + expectedType: 'cloud', + projectDir + }); - const linkPath = join(projectDir, LINK_FILENAME); - const doc = loadLinkDocument(linkPath); - doc.set('type', 'cloud'); - doc.set('instance_id', instanceId); - doc.set('org_id', orgId); - doc.set('project_id', projectId); - writeFileSync(linkPath, doc.toString(), 'utf8'); + writeCloudLink(projectDir, { instanceId, orgId, projectId }); this.log(`Updated ${directory}/${LINK_FILENAME} with Cloud instance link.`); } } diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index e0891a9..1c1514f 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -26,7 +26,13 @@ export default class LinkSelfHosted extends SelfHostedInstanceCommand { const { directory, url, 'api-key': apiKey } = flags; const projectDir = this.ensureProjectDirExists(flags); - ensureServiceTypeMatches(this, projectDir, 'self-hosted', directory, false); + ensureServiceTypeMatches({ + command: this, + configRequired: false, + directoryLabel: directory, + expectedType: 'self-hosted', + projectDir + }); const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); diff --git a/packages/cli/src/commands/pull/config.ts b/packages/cli/src/commands/pull/config.ts new file mode 100644 index 0000000..a6f9d04 --- /dev/null +++ b/packages/cli/src/commands/pull/config.ts @@ -0,0 +1,176 @@ +import { Flags } from '@oclif/core'; +import { CLICloudConfig } from '@powersync/cli-schemas'; +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import * as t from 'ts-codec'; +import { Document } from 'yaml'; + +import { fetchCloudConfig } from '../../api/fetch-cloud-config.js'; +import { writeCloudLink } from '../../api/write-cloud-link.js'; +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; +import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; +import { + LINK_FILENAME, + SERVICE_FETCHED_FILENAME, + SERVICE_FILENAME, + SYNC_FETCHED_FILENAME, + SYNC_FILENAME +} from '../../utils/project-config.js'; + +type JSONSchemaObject = { + description?: string; + properties?: Record; + items?: JSONSchemaObject; +}; + +function getDescriptionFromSchema(schema: JSONSchemaObject | undefined, path: string[]): string | undefined { + if (!schema || path.length === 0) return schema?.description; + const [head, ...rest] = path; + const next = schema.properties?.[head]; + return rest.length === 0 ? next?.description : getDescriptionFromSchema(next, rest); +} + +function setCommentsOnMap( + map: { items: Array<{ key: unknown; value: unknown }> }, + schema: JSONSchemaObject | undefined, + path: string[] +): void { + if (!schema?.properties) return; + for (const pair of map.items) { + const keyStr = + typeof pair.key === 'object' && pair.key !== null && 'value' in pair.key + ? String((pair.key as { value: unknown }).value) + : String(pair.key); + const keyPath = [...path, keyStr]; + const desc = getDescriptionFromSchema(schema, keyPath); + const value = pair.value as { commentBefore?: string | null; items?: unknown[] }; + if (value && typeof value === 'object' && desc) { + value.commentBefore = desc; + } + if (value && typeof value === 'object' && Array.isArray((value as { items?: unknown[] }).items)) { + const subSchema = schema.properties?.[keyStr]; + const innerMap = value as { items: Array<{ key: unknown; value: unknown }> }; + setCommentsOnMap(innerMap, subSchema, keyPath); + } + } +} + +const PULL_CONFIG_HEADER = `# PowerSync Cloud config (fetched from cloud) +# yaml-language-server: $schema=https://unpkg.com/@powersync/cli-schemas@latest/json-schema/cli-config.json +# +`; + +function getSchema(): JSONSchemaObject { + try { + return (t.generateJSONSchema(CLICloudConfig) as JSONSchemaObject) ?? {}; + } catch { + return {}; + } +} + +function formatServiceYamlWithComments(config: t.Decoded): string { + const schema = getSchema(); + const doc = new Document(config); + const contents = doc.contents as { items?: Array<{ key: unknown; value: unknown }> } | null; + if (contents && typeof contents === 'object' && Array.isArray(contents.items) && contents.items.length > 0) { + setCommentsOnMap({ items: contents.items }, Object.keys(schema).length > 0 ? schema : undefined, []); + } + return PULL_CONFIG_HEADER + doc.toString(); +} + +export default class PullConfig extends CloudInstanceCommand { + static description = + 'Pulls instance config from PowerSync Cloud and writes to local files. If not already linked, use --instance-id, --org-id, --project-id to link first. Cloud only.'; + static summary = 'Pull config from cloud (link first if needed).'; + + static flags = { + ...CloudInstanceCommand.flags, + 'instance-id': Flags.string({ + description: 'PowerSync Cloud instance ID (required when link.yaml is missing).' + }), + 'org-id': Flags.string({ + description: 'Organization ID (required when link.yaml is missing).' + }), + 'project-id': Flags.string({ + description: 'Project ID (required when link.yaml is missing).' + }) + }; + + async run(): Promise { + const { flags } = await this.parse(PullConfig); + const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; + + const projectDir = this.resolveProjectDir(flags); + if (!existsSync(projectDir)) { + if (instanceId && orgId && projectId) { + mkdirSync(projectDir, { recursive: true }); + } else { + this.error( + `Directory "${directory}" not found. Run \`powersync init\` first, or pass --instance-id, --org-id, and --project-id to create and link.`, + { exit: 1 } + ); + } + } + ensureServiceTypeMatches({ + command: this, + configRequired: false, + directoryLabel: directory, + expectedType: 'cloud', + projectDir + }); + + const linkPath = join(projectDir, LINK_FILENAME); + if (!existsSync(linkPath)) { + if (!instanceId || !orgId || !projectId) { + this.error( + `Linking is required. Either run \`powersync link cloud --instance-id= --org-id= --project-id=\` first, or pass --instance-id, --org-id, and --project-id to this command.`, + { exit: 1 } + ); + } + writeCloudLink(projectDir, { instanceId, orgId, projectId }); + this.log(`Created ${directory}/${LINK_FILENAME} with Cloud instance link.`); + } + + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + const client = this.getClient(); + + this.log( + `Fetching config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}` + ); + + const fetched = await fetchCloudConfig(client, linked).catch((error) => { + this.error( + `Failed to fetch config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + }); + + const serviceExists = existsSync(join(projectDir, SERVICE_FILENAME)); + const syncExists = existsSync(join(projectDir, SYNC_FILENAME)); + if (serviceExists) { + this.warn( + `${SERVICE_FILENAME} already exists. Writing to service-fetched.yaml instead. Manually merge the settings into ${SERVICE_FILENAME} as needed.` + ); + } + if (syncExists && fetched.syncRules) { + this.warn( + `${SYNC_FILENAME} already exists. Writing to sync-fetched.yaml instead. Manually merge the sync rules into ${SYNC_FILENAME} as needed.` + ); + } + const serviceYaml = formatServiceYamlWithComments(fetched.config); + const serviceOutputName = serviceExists ? SERVICE_FETCHED_FILENAME : SERVICE_FILENAME; + const serviceOutputPath = join(projectDir, serviceOutputName); + writeFileSync(serviceOutputPath, serviceYaml, 'utf8'); + this.log(`Wrote ${serviceOutputName} with config from the cloud.`); + + if (typeof fetched.syncRules === 'string') { + const syncOutputName = syncExists ? SYNC_FETCHED_FILENAME : SYNC_FILENAME; + const syncOutputPath = join(projectDir, syncOutputName); + writeFileSync(syncOutputPath, fetched.syncRules, 'utf8'); + this.log(`Wrote ${syncOutputName} with sync rules from the cloud.`); + } + } +} diff --git a/packages/cli/src/commands/pull/index.ts b/packages/cli/src/commands/pull/index.ts new file mode 100644 index 0000000..396e7f6 --- /dev/null +++ b/packages/cli/src/commands/pull/index.ts @@ -0,0 +1,11 @@ +import { Command } from '@oclif/core'; + +export default class Pull extends Command { + static description = 'Pull config from PowerSync Cloud (optionally link first if not already linked).'; + static summary = 'Pull config; link if needed.'; + + async run(): Promise { + await this.parse(Pull); + this.log('Use a subcommand: pull config'); + } +} diff --git a/packages/cli/src/utils/ensureServiceType.ts b/packages/cli/src/utils/ensureServiceType.ts index 769140d..6025997 100644 --- a/packages/cli/src/utils/ensureServiceType.ts +++ b/packages/cli/src/utils/ensureServiceType.ts @@ -6,18 +6,21 @@ const SERVICE_FILENAME = 'service.yaml'; export type ServiceType = 'cloud' | 'self-hosted'; +export type EnsureServiceTypeMatchesOptions = { + command: { error: (message: string, options: { exit: number }) => never }; + configRequired: boolean; + directoryLabel: string; + expectedType: ServiceType; + projectDir: string; +}; + /** * Ensures, if it exists, that service.yaml in the project dir has _type matching the expected service type. * Calls command.error and exits if the file is missing, or _type is missing or mismatched. * Used by link, deploy, and other commands that require a specific project type (cloud or self-hosted). */ -export function ensureServiceTypeMatches( - command: { error: (message: string, options: { exit: number }) => never }, - projectDir: string, - expectedType: ServiceType, - directoryLabel: string, - configRequired: boolean -): void { +export function ensureServiceTypeMatches(options: EnsureServiceTypeMatchesOptions): void { + const { command, configRequired, directoryLabel, expectedType, projectDir } = options; const servicePath = join(projectDir, SERVICE_FILENAME); if (!existsSync(servicePath)) { diff --git a/packages/cli/src/utils/project-config.ts b/packages/cli/src/utils/project-config.ts index 624449f..7c33c21 100644 --- a/packages/cli/src/utils/project-config.ts +++ b/packages/cli/src/utils/project-config.ts @@ -9,8 +9,14 @@ export const LINK_FILENAME = 'link.yaml'; export const SERVICE_FILENAME = 'service.yaml'; +/** Written by `fetch config` when service.yaml already exists; user should manually merge into service.yaml. */ +export const SERVICE_FETCHED_FILENAME = 'service-fetched.yaml'; + export const SYNC_FILENAME = 'sync.yaml'; +/** Written by `fetch config` when sync.yaml already exists; user should manually merge into sync.yaml. */ +export const SYNC_FETCHED_FILENAME = 'sync-fetched.yaml'; + /** * Loads link.yaml as a YAML Document so it can be updated in place (preserving comments). * If the file does not exist, returns a new empty Document. diff --git a/packages/cli/test/commands/deploy.test.ts b/packages/cli/test/commands/deploy.test.ts index 41a2468..a304a9f 100644 --- a/packages/cli/test/commands/deploy.test.ts +++ b/packages/cli/test/commands/deploy.test.ts @@ -1,11 +1,30 @@ -import { runCommand } from '@oclif/test'; +import { Config } from '@oclif/core'; +import { captureOutput, runCommand } from '@oclif/test'; import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; - +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { root } from '../helpers/root.js'; +import * as CloudClient from '../../src/clients/CloudClient.js'; +import * as DeployCommand from '../../src/commands/deploy.js'; + +const mockGetInstanceConfig = vi.fn(); +const mockDeployInstance = vi.fn(); +vi.spyOn(CloudClient, 'createCloudClient').mockReturnValue({ + deployInstance: mockDeployInstance, + getInstanceConfig: mockGetInstanceConfig +} as unknown as ReturnType); + +/** Run deploy by instantiating the command and calling .run() so the spy on createCloudClient applies. */ +async function runDeployDirect(opts?: { directory?: string }) { + const directory = opts?.directory ?? PROJECT_DIR; + const config = await Config.load({ root }); + const Deploy = DeployCommand.default; + const cmd = new Deploy(['--directory', directory], config); + return captureOutput(() => cmd.run()); +} + const LINK_FILENAME = 'link.yaml'; const PROJECT_DIR = 'powersync'; const SERVICE_FILENAME = 'service.yaml'; @@ -27,6 +46,9 @@ describe('deploy', () => { origCwd = process.cwd(); tmpDir = mkdtempSync(join(tmpdir(), 'deploy-test-')); process.chdir(tmpDir); + mockGetInstanceConfig.mockReset(); + mockDeployInstance.mockReset(); + mockGetInstanceConfig.mockRejectedValue(new Error('network error')); }); afterEach(() => { @@ -93,7 +115,7 @@ describe('deploy', () => { }); it('attempts deploy and errors with exit 1 when client fails', async () => { - const result = await runCommand('deploy', { root }); + const result = await runDeployDirect(); expect(result.error?.oclif?.exit).toBe(1); expect(result.error?.message).toMatch( /Failed to deploy changes to instance inst-1 in project proj-1 in org org-1/ diff --git a/packages/cli/test/commands/fetch/config.test.ts b/packages/cli/test/commands/fetch/config.test.ts new file mode 100644 index 0000000..f6cad09 --- /dev/null +++ b/packages/cli/test/commands/fetch/config.test.ts @@ -0,0 +1,133 @@ +import { Config } from '@oclif/core'; +import { captureOutput, runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; + +import FetchConfigCommand from '../../../src/commands/fetch/config.js'; +import { root } from '../../helpers/root.js'; + +const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +/** Minimal valid cloud config decodable by CLICloudConfig. */ +const MOCK_CONFIG = { _type: 'cloud' as const, region: 'us' }; + +const mockCloudClient = { + deployInstance: vi.fn(), + getInstanceConfig: vi.fn() +}; + +vi.mock('../../../src/clients/CloudClient.js', () => ({ + createCloudClient: () => mockCloudClient +})); + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\nregion: us\n`, 'utf8'); +} + +describe('fetch config', () => { + let oclifConfig: Config; + let tmpDir: string; + let origCwd: string; + + beforeAll(async () => { + oclifConfig = await Config.load({ root }); + }); + + function runFetchConfigDirect(opts?: { directory?: string; output?: 'json' | 'yaml' }) { + const directory = opts?.directory ?? PROJECT_DIR; + const args = ['--directory', directory]; + if (opts?.output) args.push('--output', opts.output); + const cmd = new FetchConfigCommand(args, oclifConfig); + return captureOutput(() => cmd.run()); + } + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'fetch-config-test-')); + process.chdir(tmpDir); + mockCloudClient.getInstanceConfig.mockReset(); + mockCloudClient.getInstanceConfig.mockRejectedValue(new Error('network error')); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when directory does not exist', async () => { + const result = await runCommand('fetch config', { root }); + expect(result.error?.message).toMatch( + new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) + ); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('errors when link.yaml does not exist', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runCommand('fetch config', { root }); + expect(result.error?.message).toContain('Linking is required before using this command.'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + describe('with valid cloud project', () => { + beforeEach(async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { + root + }); + }); + + it('errors with exit 1 when client fails', async () => { + const result = await runFetchConfigDirect(); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch( + /Failed to fetch config for instance inst-1 in project proj-1 in org org-1/ + ); + }); + + it('default output is yaml and prints fetched object (config + optional syncRules) to stdout', async () => { + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runFetchConfigDirect(); + expect(result.error).toBeUndefined(); + expect(result.stdout).toContain('config:'); + expect(result.stdout).toContain('_type: cloud'); + expect(result.stdout).toContain('region: us'); + }); + + it('--output yaml prints fetched object as YAML to stdout', async () => { + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runFetchConfigDirect({ output: 'yaml' }); + expect(result.error).toBeUndefined(); + expect(result.stdout).toContain('config:'); + expect(result.stdout).toContain('_type: cloud'); + expect(result.stdout).toContain('region: us'); + }); + + it('--output json prints fetched object (config, syncRules) as JSON to stdout', async () => { + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runFetchConfigDirect({ output: 'json' }); + expect(result.error).toBeUndefined(); + const parsed = JSON.parse(result.stdout) as { config: typeof MOCK_CONFIG }; + expect(parsed.config).toEqual(MOCK_CONFIG); + }); + + it('--output json includes syncRules when returned', async () => { + const syncRules = 'bucket_definitions: []\n'; + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ + config: MOCK_CONFIG, + sync_rules: syncRules + } as { config: typeof MOCK_CONFIG; sync_rules: string }); + const result = await runFetchConfigDirect({ output: 'json' }); + expect(result.error).toBeUndefined(); + const parsed = JSON.parse(result.stdout) as { config: typeof MOCK_CONFIG; syncRules?: string }; + expect(parsed.config).toEqual(MOCK_CONFIG); + expect(parsed.syncRules).toBe(syncRules); + }); + }); +}); diff --git a/packages/cli/test/commands/pull/config.test.ts b/packages/cli/test/commands/pull/config.test.ts new file mode 100644 index 0000000..2fce820 --- /dev/null +++ b/packages/cli/test/commands/pull/config.test.ts @@ -0,0 +1,140 @@ +import { Config } from '@oclif/core'; +import { captureOutput, runCommand } from '@oclif/test'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; + +import PullConfigCommand from '../../../src/commands/pull/config.js'; +import { root } from '../../helpers/root.js'; + +const PROJECT_DIR = 'powersync'; +const SERVICE_FILENAME = 'service.yaml'; + +/** Minimal valid cloud config decodable by CLICloudConfig. */ +const MOCK_CONFIG = { _type: 'cloud' as const, region: 'us' }; + +const mockCloudClient = { + deployInstance: vi.fn(), + getInstanceConfig: vi.fn() +}; + +vi.mock('../../../src/clients/CloudClient.js', () => ({ + createCloudClient: () => mockCloudClient +})); + +function writeServiceYaml(projectDir: string, type: 'cloud' | 'self-hosted') { + writeFileSync(join(projectDir, SERVICE_FILENAME), `_type: ${type}\nregion: us\n`, 'utf8'); +} + +describe('pull config', () => { + let oclifConfig: Config; + let tmpDir: string; + let origCwd: string; + + beforeAll(async () => { + oclifConfig = await Config.load({ root }); + }); + + function runPullConfigDirect(opts?: { directory?: string; instanceId?: string; orgId?: string; projectId?: string }) { + const directory = opts?.directory ?? PROJECT_DIR; + const args = ['--directory', directory]; + if (opts?.instanceId) args.push('--instance-id', opts.instanceId); + if (opts?.orgId) args.push('--org-id', opts.orgId); + if (opts?.projectId) args.push('--project-id', opts.projectId); + const cmd = new PullConfigCommand(args, oclifConfig); + return captureOutput(() => cmd.run()); + } + + beforeEach(() => { + origCwd = process.cwd(); + tmpDir = mkdtempSync(join(tmpdir(), 'pull-config-test-')); + process.chdir(tmpDir); + mockCloudClient.getInstanceConfig.mockReset(); + mockCloudClient.getInstanceConfig.mockRejectedValue(new Error('network error')); + }); + + afterEach(() => { + process.chdir(origCwd); + if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); + }); + + it('errors when directory does not exist and no link args', async () => { + const result = await runCommand('pull config', { root }); + expect(result.error?.message).toContain(`Directory "${PROJECT_DIR}" not found`); + expect(result.error?.message).toContain('--instance-id'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('when directory does not exist but link args given, creates directory and writes config', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + expect(existsSync(projectDir)).toBe(false); + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runPullConfigDirect({ + instanceId: 'inst-1', + orgId: 'org-1', + projectId: 'proj-1' + }); + expect(result.error).toBeUndefined(); + expect(existsSync(projectDir)).toBe(true); + expect(existsSync(join(projectDir, 'link.yaml'))).toBe(true); + expect(existsSync(join(projectDir, SERVICE_FILENAME))).toBe(true); + expect(readFileSync(join(projectDir, SERVICE_FILENAME), 'utf8')).toContain('_type: cloud'); + expect(result.stdout).toContain('Created'); + expect(result.stdout).toContain(`Wrote ${SERVICE_FILENAME}`); + }); + + it('errors when link.yaml does not exist and no link flags', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + writeServiceYaml(projectDir, 'cloud'); + const result = await runPullConfigDirect(); + expect(result.error?.message).toContain('Linking is required'); + expect(result.error?.message).toContain('--instance-id'); + expect(result.error?.oclif?.exit).toBe(1); + }); + + it('when link does not exist but flags provided, creates link and writes service.yaml', async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + // No service.yaml; ensureServiceTypeMatches allows missing when configFileRequired is false + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runPullConfigDirect({ + instanceId: 'inst-1', + orgId: 'org-1', + projectId: 'proj-1' + }); + expect(result.error).toBeUndefined(); + expect(existsSync(join(projectDir, 'link.yaml'))).toBe(true); + expect(readFileSync(join(projectDir, 'link.yaml'), 'utf8')).toContain('instance_id: inst-1'); + expect(result.stdout).toContain('Created'); + expect(result.stdout).toContain('link.yaml'); + expect(result.stdout).toContain(`Wrote ${SERVICE_FILENAME}`); + expect(existsSync(join(projectDir, SERVICE_FILENAME))).toBe(true); + expect(readFileSync(join(projectDir, SERVICE_FILENAME), 'utf8')).toContain('_type: cloud'); + }); + + describe('when already linked', () => { + beforeEach(async () => { + const projectDir = join(tmpDir, PROJECT_DIR); + mkdirSync(projectDir, { recursive: true }); + await runCommand('link cloud --instance-id=inst-1 --org-id=org-1 --project-id=proj-1', { root }); + }); + + it('writes service.yaml when client succeeds', async () => { + mockCloudClient.getInstanceConfig.mockResolvedValueOnce({ config: MOCK_CONFIG }); + const result = await runPullConfigDirect(); + expect(result.error).toBeUndefined(); + const projectDir = join(tmpDir, PROJECT_DIR); + expect(existsSync(join(projectDir, SERVICE_FILENAME))).toBe(true); + expect(readFileSync(join(projectDir, SERVICE_FILENAME), 'utf8')).toContain('_type: cloud'); + expect(result.stdout).toContain(`Wrote ${SERVICE_FILENAME}`); + }); + + it('errors when client fails', async () => { + const result = await runPullConfigDirect(); + expect(result.error?.oclif?.exit).toBe(1); + expect(result.error?.message).toMatch(/Failed to fetch config/); + }); + }); +}); diff --git a/packages/cli/test/setup.ts b/packages/cli/test/setup.ts index 7c2b555..81f4342 100644 --- a/packages/cli/test/setup.ts +++ b/packages/cli/test/setup.ts @@ -1,9 +1,9 @@ -import { Config } from '@oclif/core' +import { Config } from '@oclif/core'; -import { root } from './helpers/root.js' +import { root } from './helpers/root.js'; /** * Load Config from package root so runCommand uses the correct root. * Fails fast if config cannot be loaded. */ -await Config.load({ root }) +await Config.load({ root }); diff --git a/packages/cli/test/utils/cloud-client-factory.ts b/packages/cli/test/utils/cloud-client-factory.ts new file mode 100644 index 0000000..c4dd114 --- /dev/null +++ b/packages/cli/test/utils/cloud-client-factory.ts @@ -0,0 +1,22 @@ +import { PowerSyncManagementClient } from '@powersync/management-client'; +import { vi } from 'vitest'; + +/** Stub used as the cloud client in tests. Created once, returned by createCloudClient and exposed for mocking. */ +const stub: PowerSyncManagementClient = { + getInstanceConfig: vi.fn() +} as unknown as PowerSyncManagementClient; + +/** + * Returns the last (and only) created cloud client stub. + * Use in tests to set up mocks, e.g. getLastCloudClient().getInstanceConfig.mockResolvedValueOnce(...). + */ +export function getLastCloudClient(): PowerSyncManagementClient { + return stub; +} + +/** + * Test double for createCloudClient. Returns the same stub so tests can configure it via getLastCloudClient(). + */ +export function createCloudClient(): PowerSyncManagementClient { + return stub; +} diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts index 07262ab..809716e 100644 --- a/packages/cli/vitest.config.ts +++ b/packages/cli/vitest.config.ts @@ -1,4 +1,9 @@ -import { defineConfig } from 'vitest/config' +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig } from 'vitest/config'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); export default defineConfig({ test: { diff --git a/packages/schemas/src/CLIConfig.ts b/packages/schemas/src/CLIConfig.ts index 33e068a..221fcb4 100644 --- a/packages/schemas/src/CLIConfig.ts +++ b/packages/schemas/src/CLIConfig.ts @@ -7,6 +7,8 @@ export const CLICloudConfig = t _type: t.literal('cloud') }) .and(BasePowerSyncHostedConfig); +export type CLICloudConfig = t.Encoded; +export type CLICloudConfigDecoded = t.Decoded; export const CLISelfHostedConfig = t .object({ @@ -14,4 +16,9 @@ export const CLISelfHostedConfig = t }) .and(configFile.powerSyncConfig); +export type CLISelfHostedConfig = t.Encoded; +export type CLISelfHostedConfigDecoded = t.Decoded; + export const CLIConfig = t.union(CLICloudConfig, CLISelfHostedConfig); +export type CLIConfig = t.Encoded; +export type CLIConfigDecoded = t.Decoded; From a066fd74653a9ba40fad910b9d2fe980a8c5f944 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Thu, 5 Feb 2026 14:10:12 +0200 Subject: [PATCH 009/141] Improvements from testing deploy workflow --- .gitignore | 3 + docs/usage.md | 13 +++ packages/cli/bin/dev.js | 16 ++- packages/cli/package.json | 12 +- packages/cli/src/api/fetch-cloud-config.ts | 2 +- packages/cli/src/clients/CloudClient.ts | 19 +-- .../src/command-types/CloudInstanceCommand.ts | 6 +- packages/cli/src/commands/deploy.ts | 109 ++++++++++++++---- packages/cli/src/commands/destroy.ts | 2 +- packages/cli/src/commands/fetch/config.ts | 2 +- packages/cli/src/commands/login.ts | 20 +++- packages/cli/src/commands/pull/config.ts | 2 +- packages/cli/src/commands/stop.ts | 3 +- packages/cli/src/services/SecureStorage.ts | 88 ++++++++++++++ packages/cli/src/utils/env.ts | 6 +- .../cli/test/commands/pull/config.test.ts | 2 +- packages/schemas/package.json | 2 +- pnpm-lock.yaml | 19 +++ 18 files changed, 275 insertions(+), 51 deletions(-) create mode 100644 docs/usage.md create mode 100644 packages/cli/src/services/SecureStorage.ts diff --git a/.gitignore b/.gitignore index 9a5aced..c5e1ee5 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,6 @@ dist # Vite logs files vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Playground for testing cli commands +playground/ diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..047f111 --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,13 @@ +# Pulling an Existing Project For Config + +```bash +powersync login + +# IDs taken from the PowerSync Dashboard URL +powersync pull config --org-id=5cc84a3ccudjfhgytw0c08b --project-id=6703fd8a3cfe3000hrydg463 --instance-id=688736sdfcfb46688f509bd0 + +# Make any required changes to the YAML files in the powersync/ directory. + +# Deploy changes +powersync deploy +``` diff --git a/packages/cli/bin/dev.js b/packages/cli/bin/dev.js index a937e0c..6dc3d4e 100755 --- a/packages/cli/bin/dev.js +++ b/packages/cli/bin/dev.js @@ -1,5 +1,15 @@ -#!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning +#!/usr/bin/env -S node --import tsx -import {execute} from '@oclif/core' +import { execute } from '@oclif/core'; +import path from 'path'; +import { fileURLToPath } from 'url'; -await execute({development: true, dir: import.meta.url}) +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +await execute({ + development: true, + dir: import.meta.url, + loadOptions: { + root: path.resolve(__dirname, '..') + } +}); diff --git a/packages/cli/package.json b/packages/cli/package.json index 6172781..1863a4d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -8,21 +8,24 @@ }, "bugs": "https://github.com/powersync-ja/cli/issues", "dependencies": { + "@journeyapps-labs/common-sdk": "1.0.2", "@oclif/core": "^4", "@oclif/plugin-help": "^6", "@oclif/plugin-plugins": "^5", - "@powersync/service-client": "0.0.1", - "@powersync/management-types": "0.0.1", "@powersync/cli-schemas": "workspace:*", "@powersync/management-client": "0.0.1", - "@journeyapps-labs/common-sdk": "1.0.2", + "@powersync/management-types": "0.0.1", + "@powersync/service-client": "0.0.1", + "keychain": "^1.5.0", "ts-codec": "^1.3.0", "yaml": "^2" }, "devDependencies": { + "tsx": "^4", "@eslint/compat": "^1", "@oclif/prettier-config": "^0.2.1", "@oclif/test": "^4", + "@types/keychain": "^1.4.4", "@types/node": "^18", "eslint": "^9", "eslint-config-oclif": "^6", @@ -66,7 +69,8 @@ }, "repository": "https://github.com/powersync-ja/powersync-js", "scripts": { - "build": "shx rm -rf dist && tsc -b", + "dev": "tsx bin/dev.js", + "build": "tsc -b", "lint": "eslint", "postpack": "shx rm -f oclif.manifest.json", "posttest": "pnpm run lint", diff --git a/packages/cli/src/api/fetch-cloud-config.ts b/packages/cli/src/api/fetch-cloud-config.ts index c7c5461..fbd3310 100644 --- a/packages/cli/src/api/fetch-cloud-config.ts +++ b/packages/cli/src/api/fetch-cloud-config.ts @@ -18,7 +18,7 @@ export async function fetchCloudConfig( org_id: linked.org_id, id: linked.instance_id }); - const configFromCloud = instanceConfig.config ?? {}; + const configFromCloud = { _type: 'cloud', ...(instanceConfig.config ?? {}) }; const config = CLICloudConfig.decode(configFromCloud as any); return { config, syncRules: instanceConfig.sync_rules }; } diff --git a/packages/cli/src/clients/CloudClient.ts b/packages/cli/src/clients/CloudClient.ts index e1ceb90..e5c9b89 100644 --- a/packages/cli/src/clients/CloudClient.ts +++ b/packages/cli/src/clients/CloudClient.ts @@ -1,21 +1,24 @@ import * as sdk from '@journeyapps-labs/common-sdk'; import { PowerSyncManagementClient } from '@powersync/management-client'; +import { getSecureStorage } from '../services/SecureStorage.js'; import { env } from '../utils/env.js'; /** * Creates a PowerSync Management Client for the Cloud. - * Uses the credentials from the login command. + * Uses the token stored by the login command (secure storage, e.g. macOS Keychain). */ -export function createCloudClient(): PowerSyncManagementClient { - const getToken = () => { - // TODO: get from secure store - return 'TODO'; - }; - +export async function createCloudClient(): Promise { + const storage = getSecureStorage(); + const token = env.PS_TOKEN || (await storage.getToken()); + if (!token) { + throw new Error( + 'Not logged in. Run `powersync login --token=` to authenticate. Login is supported on macOS (other platforms coming soon).' + ); + } return new PowerSyncManagementClient({ client: sdk.createNodeNetworkClient({ headers: () => ({ - Authorization: `Bearer ${getToken()}` + Authorization: `Bearer ${token}` }) }), endpoint: env._PS_MANAGEMENT_SERVICE_URL diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index 679dcb6..b3adf5e 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -26,9 +26,9 @@ export abstract class CloudInstanceCommand extends InstanceCommand { }; /** - * @returns A PowerSync Management Client for the Cloud. + * @returns A PowerSync Management Client for the Cloud (uses token from login). */ - getClient(): PowerSyncManagementClient { + async getClient(): Promise { return createCloudClient(); } @@ -52,9 +52,9 @@ export abstract class CloudInstanceCommand extends InstanceCommand { ); } - const doc = loadLinkDocument(linkPath); let linked: RequiredCloudLinkConfig; try { + const doc = loadLinkDocument(linkPath); linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); } catch (error) { this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 39a7886..4f454e9 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -1,5 +1,30 @@ +import { routes } from '@powersync/management-types'; import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; +/** Pretty-print test connection response for error output. Uses types from @powersync/management-types (BaseTestConnectionResponse). */ +function formatTestConnectionFailure( + response: { + success?: boolean; + connection?: { success?: boolean; reachable?: boolean }; + configuration?: { success?: boolean }; + error?: string; + }, + connectionName: string +): string { + const lines: string[] = [ + `Failed to test connection for connection "${connectionName}":`, + '', + ' Overall success: ' + String(response.success), + ' Error: ' + (response.error ?? '(none)'), + '', + ' Checks:', + ' • connection.success: ' + String(response.connection?.success ?? '—'), + ' • connection.reachable: ' + String(response.connection?.reachable ?? '—'), + ' • configuration.success: ' + String(response.configuration?.success ?? '—') + ]; + return lines.join('\n'); +} + export default class Deploy extends CloudInstanceCommand { static description = 'Deploys changes to the PowerSync management service. Cloud only.'; static summary = 'Deploy sync rules and configuration changes.'; @@ -17,34 +42,78 @@ export default class Deploy extends CloudInstanceCommand { }); const config = this.parseConfig(projectDirectory); - const client = this.getClient(); + const client = await this.getClient(); + + // The existing config is required to deploy changes. The isntance should have been created already. + const existingConfig = await client + .getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }) + .catch((error) => { + this.error( + ` +Failed to get existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error} +Ensure the instance has been created before deploying. + `.trim(), + { exit: 1 } + ); + }); + + const existingRegion = existingConfig.config?.region; + if (existingRegion && existingRegion !== config.region) { + this.error( + ` +The existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id} has a different region than the config being deployed. +The region cannot be changed after the initial deployment. +Existing region: ${existingRegion} +New region: ${config.region} + `.trim(), + { exit: 1 } + ); + } + + this.log('Testing connection before deploy...'); + if ((config.replication?.connections?.length ?? 0) <= 0) { + this.error( + 'No connection found in config. Please add a connection to the config in replication->connections before deploying.', + { exit: 1 } + ); + } + for (const connection of config.replication?.connections ?? []) { + const response = await client + .testConnection({ + // The instance ID allows secret_refs to be used + id: linked.instance_id, + org_id: linked.org_id, + app_id: linked.project_id, + connection + }) + .catch((error) => { + this.error(`Failed to test connection for connection ${connection.name}: ${error}`, { exit: 1 }); + }); + if (response.success !== true) { + this.error(formatTestConnectionFailure(response, connection.name ?? 'unnamed'), { exit: 1 }); + } + } + this.log('Connection test successful.'); this.log( `Deploying changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}` ); try { - const existingConfig = await client - .getInstanceConfig({ + await client.deployInstance( + routes.DeployInstanceRequest.encode({ + // Spread the existing config like name, and program version contraints. + // Should we allow specifying these in the config file? + ...existingConfig, app_id: linked.project_id, - org_id: linked.org_id, - id: linked.instance_id + config, + sync_rules: syncRulesContent }) - .catch((error) => { - this.error( - `Failed to get existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, - { exit: 1 } - ); - }); - - await client.deployInstance({ - // Spread the existing config like name, and program version contraints. - // Should we allow specifying these in the config file? - ...existingConfig, - app_id: linked.project_id, - config, - sync_rules: syncRulesContent - }); + ); } catch (error) { this.error( `Failed to deploy changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, diff --git a/packages/cli/src/commands/destroy.ts b/packages/cli/src/commands/destroy.ts index 578af4d..5cf440f 100644 --- a/packages/cli/src/commands/destroy.ts +++ b/packages/cli/src/commands/destroy.ts @@ -25,7 +25,7 @@ export default class Destroy extends CloudInstanceCommand { configFileRequired: false, linkingIsRequired: true }); - const client = this.getClient(); + const client = await this.getClient(); this.log(`Destroying instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}`); diff --git a/packages/cli/src/commands/fetch/config.ts b/packages/cli/src/commands/fetch/config.ts index 84f71ec..3e760f3 100644 --- a/packages/cli/src/commands/fetch/config.ts +++ b/packages/cli/src/commands/fetch/config.ts @@ -25,7 +25,7 @@ export default class FetchConfig extends CloudInstanceCommand { linkingIsRequired: true }); - const client = this.getClient(); + const client = await this.getClient(); const fetched = await fetchCloudConfig(client, linked).catch((error) => { this.error( diff --git a/packages/cli/src/commands/login.ts b/packages/cli/src/commands/login.ts index 4ed6329..8d9d9ae 100644 --- a/packages/cli/src/commands/login.ts +++ b/packages/cli/src/commands/login.ts @@ -1,10 +1,22 @@ -import {Command} from '@oclif/core' +import { Command, Flags } from '@oclif/core'; + +import { getSecureStorage } from '../services/SecureStorage.js'; export default class Login extends Command { - static description = 'Authenticate the CLI with PowerSync (e.g. PAT token).' - static summary = 'Authenticate the CLI with PowerSync (e.g. PAT token).' + static description = 'Authenticate the CLI with PowerSync (e.g. PAT token).'; + static summary = 'Authenticate the CLI with PowerSync (e.g. PAT token).'; + + static flags = { + token: Flags.string({ + description: 'PowerSync auth token (e.g. PAT). Stored securely in the system keychain on macOS.', + required: true + }) + }; async run(): Promise { - this.log('login: not yet implemented') + const { flags } = await this.parse(Login); + const storage = getSecureStorage(); + await storage.setToken(flags.token); + this.log('Token stored successfully.'); } } diff --git a/packages/cli/src/commands/pull/config.ts b/packages/cli/src/commands/pull/config.ts index a6f9d04..e35de28 100644 --- a/packages/cli/src/commands/pull/config.ts +++ b/packages/cli/src/commands/pull/config.ts @@ -135,7 +135,7 @@ export default class PullConfig extends CloudInstanceCommand { configFileRequired: false, linkingIsRequired: true }); - const client = this.getClient(); + const client = await this.getClient(); this.log( `Fetching config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}` diff --git a/packages/cli/src/commands/stop.ts b/packages/cli/src/commands/stop.ts index 8d45585..d3c80e0 100644 --- a/packages/cli/src/commands/stop.ts +++ b/packages/cli/src/commands/stop.ts @@ -26,7 +26,8 @@ export default class Stop extends CloudInstanceCommand { configFileRequired: false, linkingIsRequired: true }); - const client = this.getClient(); + + const client = await this.getClient(); this.log(`Stopping instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}`); diff --git a/packages/cli/src/services/SecureStorage.ts b/packages/cli/src/services/SecureStorage.ts new file mode 100644 index 0000000..df3ba53 --- /dev/null +++ b/packages/cli/src/services/SecureStorage.ts @@ -0,0 +1,88 @@ +/** + * Interface for storing and retrieving the PowerSync auth token securely. + * Implementations are platform-specific (e.g. macOS Keychain). + */ +export interface SecureStorage { + deleteToken(): Promise; + getToken(): Promise; + setToken(token: string): Promise; +} + +const SERVICE_NAME = 'PowerSync CLI'; +const ACCOUNT_NAME = 'auth-token'; + +type KeychainModule = { + getPassword( + options: { account: string; service: string }, + callback: (err: Error | null, password: string) => void + ): void; + setPassword( + options: { account: string; service: string; password: string }, + callback: (err: Error | null) => void + ): void; + deletePassword(options: { account: string; service: string }, callback: (err: Error | null) => void): void; +}; + +let keychainPromise: Promise | null = null; + +async function getKeychain(): Promise { + if (!keychainPromise) { + keychainPromise = import('keychain').then((m) => (m.default ?? m) as KeychainModule); + } + return keychainPromise; +} + +/** + * Returns the secure storage implementation for the current platform. + * On macOS uses the system Keychain via the keychain package (lazy-loaded). + * Other platforms: throws (not implemented yet). + */ +export function getSecureStorage(): SecureStorage { + if (process.platform === 'darwin') { + return createMacOSSecureStorage(); + } + throw new Error(`Secure storage is not implemented for ${process.platform}. Login is only supported on macOS.`); +} + +function createMacOSSecureStorage(): SecureStorage { + const options = { account: ACCOUNT_NAME, service: SERVICE_NAME }; + + return { + async getToken(): Promise { + const keychain = await getKeychain(); + return new Promise((resolve, reject) => { + keychain.getPassword(options, (err: Error | null, password: string) => { + if (err) { + if (err.message?.includes('could not be found') || (err as Error & { code?: number }).code === 44) { + resolve(null); + return; + } + reject(err); + return; + } + resolve(password ?? null); + }); + }); + }, + + async setToken(token: string): Promise { + const keychain = await getKeychain(); + return new Promise((resolve, reject) => { + keychain.setPassword({ ...options, password: token }, (err: Error | null) => { + if (err) reject(err); + else resolve(); + }); + }); + }, + + async deleteToken(): Promise { + const keychain = await getKeychain(); + return new Promise((resolve, reject) => { + keychain.deletePassword(options, (err: Error | null) => { + if (err) reject(err); + else resolve(); + }); + }); + } + }; +} diff --git a/packages/cli/src/utils/env.ts b/packages/cli/src/utils/env.ts index c7284f4..84fb067 100644 --- a/packages/cli/src/utils/env.ts +++ b/packages/cli/src/utils/env.ts @@ -1,9 +1,11 @@ -const DEFAULT_PS_MANAGEMENT_SERVICE_URL = 'https://api.powersync.com'; +const DEFAULT_PS_MANAGEMENT_SERVICE_URL = 'https://powersync-api.journeyapps.com'; export type ENV = { _PS_MANAGEMENT_SERVICE_URL: string; + PS_TOKEN?: string; }; export const env: ENV = { - _PS_MANAGEMENT_SERVICE_URL: process.env._PS_MANAGEMENT_SERVICE_URL || DEFAULT_PS_MANAGEMENT_SERVICE_URL + _PS_MANAGEMENT_SERVICE_URL: process.env._PS_MANAGEMENT_SERVICE_URL || DEFAULT_PS_MANAGEMENT_SERVICE_URL, + PS_TOKEN: process.env.PS_TOKEN }; diff --git a/packages/cli/test/commands/pull/config.test.ts b/packages/cli/test/commands/pull/config.test.ts index 2fce820..0956ae5 100644 --- a/packages/cli/test/commands/pull/config.test.ts +++ b/packages/cli/test/commands/pull/config.test.ts @@ -12,7 +12,7 @@ const PROJECT_DIR = 'powersync'; const SERVICE_FILENAME = 'service.yaml'; /** Minimal valid cloud config decodable by CLICloudConfig. */ -const MOCK_CONFIG = { _type: 'cloud' as const, region: 'us' }; +const MOCK_CONFIG = { region: 'us' }; const mockCloudClient = { deployInstance: vi.fn(), diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 350fc33..1204a0b 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -11,7 +11,7 @@ "json-schema" ], "scripts": { - "build": "shx rm -rf dist && tsc -b && tsx scripts/create-schemas.ts" + "build": "tsc -b && tsx scripts/create-schemas.ts" }, "dependencies": { "ts-codec": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8dfb504..303479b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,6 +46,9 @@ importers: '@powersync/service-client': specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz version: file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) + keychain: + specifier: ^1.5.0 + version: 1.5.0 ts-codec: specifier: ^1.3.0 version: 1.3.0 @@ -62,6 +65,9 @@ importers: '@oclif/test': specifier: ^4 version: 4.1.16(@oclif/core@4.8.0) + '@types/keychain': + specifier: ^1.4.4 + version: 1.4.4 '@types/node': specifier: ^18 version: 18.19.130 @@ -83,6 +89,9 @@ importers: ts-node: specifier: ^10 version: 10.9.2(@types/node@18.19.130)(typescript@5.9.3) + tsx: + specifier: ^4 + version: 4.21.0 typescript: specifier: ^5 version: 5.9.3 @@ -1452,6 +1461,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/keychain@1.4.4': + resolution: {integrity: sha512-YV2kEhGaEjZaNzbmXmr5Y0IbO7yjEi52O1VIOMDMtkYyqvzKv9EQNjXfj8ykOuCuu0JBVnich1tF5xy1kD+8MA==} + '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} @@ -2950,6 +2962,9 @@ packages: jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + keychain@1.5.0: + resolution: {integrity: sha512-liyp4r+93RI7EB2jhwaRd4MWfdgHH6shuldkaPMkELCJjMFvOOVXuTvw1pGqFfhsrgA6OqfykWWPQgBjQakVag==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -6290,6 +6305,8 @@ snapshots: '@types/json5@0.0.29': {} + '@types/keychain@1.4.4': {} + '@types/mute-stream@0.0.4': dependencies: '@types/node': 18.19.130 @@ -8007,6 +8024,8 @@ snapshots: jwa: 2.0.1 safe-buffer: 5.2.1 + keychain@1.5.0: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 From 0def64961c552c5c4853c406841d31615db3d2ee Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Thu, 5 Feb 2026 14:54:13 +0200 Subject: [PATCH 010/141] Add multiple options for specifying cloud instance --- docs/usage.md | 80 ++++++++++++++++ .../src/command-types/CloudInstanceCommand.ts | 93 ++++++++++++++++--- packages/cli/src/utils/env.ts | 17 +++- 3 files changed, 176 insertions(+), 14 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 047f111..70611d3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -11,3 +11,83 @@ powersync pull config --org-id=5cc84a3ccudjfhgytw0c08b --project-id=6703fd8a3cfe # Deploy changes powersync deploy ``` + +# Supplying Linking Information for Cloud Commands + +Cloud commands (`deploy`, `destroy`, `stop`, `fetch config`, `pull config`) need instance, org, and project IDs. You can supply them in three ways; the CLI uses the first that is available: + +1. **Flags** — `--instance-id`, `--org-id`, `--project-id` on the command +2. **link.yaml** — a `powersync/link.yaml` file in the project (written by `powersync link cloud`) +3. **Environment variables** — `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` + +--- + +## Method 1: Flags (one-off or override) + +Pass the IDs on each command. Useful for one-off runs or to override the current context. + +```bash +powersync login + +# Stop a specific instance without linking the directory (overrides link.yaml if present) +powersync stop --confirm=yes \ + --instance-id=688736sdfcfb46688f509bd0 \ + --org-id=5cc84a3ccudjfhgytw0c08b \ + --project-id=6703fd8a3cfe3000hrydg463 +``` + +You can use a different project directory with `--directory`: + +```bash +powersync stop --confirm=yes --directory=my-powersync --instance-id=... --org-id=... --project-id=... +``` + +--- + +## Method 2: link.yaml (persistent context) + +Link the project once; later commands use the stored IDs. Best for day-to-day work in a single project. + +```bash +powersync login + +# Link this project to a Cloud instance (writes powersync/link.yaml) +powersync link cloud \ + --instance-id=688736sdfcfb46688f509bd0 \ + --org-id=5cc84a3ccudjfhgytw0c08b \ + --project-id=6703fd8a3cfe3000hrydg463 + +# No IDs needed on later commands +powersync stop --confirm=yes +powersync fetch config +``` + +If the project lives in a non-default directory: + +```bash +powersync link cloud --directory=my-powersync --instance-id=... --org-id=... --project-id=... +powersync stop --confirm=yes --directory=my-powersync +``` + +--- + +## Method 3: Environment variables + +Set IDs in the environment when you don’t want to link the directory or pass flags every time (e.g. CI or scripts). + +```bash +export INSTANCE_ID=688736sdfcfb46688f509bd0 +export ORG_ID=5cc84a3ccudjfhgytw0c08b +export PROJECT_ID=6703fd8a3cfe3000hrydg463 + +powersync stop --confirm=yes +powersync fetch config --output=json +``` + +Inline for a single command: + +```bash +INSTANCE_ID=... ORG_ID=... PROJECT_ID=... powersync stop --confirm=yes +``` + +**Note:** Environment variables are only used when neither flags nor `link.yaml` provide linking information. diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index b3adf5e..fa10869 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -1,9 +1,11 @@ +import { Flags, Interfaces } from '@oclif/core'; import { CLICloudConfig, RequiredCloudLinkConfig } from '@powersync/cli-schemas'; import { PowerSyncManagementClient } from '@powersync/management-client'; import { existsSync, readFileSync } from 'node:fs'; import { join } from 'node:path'; import { createCloudClient } from '../clients/CloudClient.js'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; +import { env } from '../utils/env.js'; import { LINK_FILENAME, loadLinkDocument, @@ -19,10 +21,38 @@ export type CloudProject = { syncRulesContent?: string; }; +/** + * Parsed (output) type of CloudInstanceCommand flags. + * Use when you need the type of `flags` from `await this.parse(CloudInstanceCommand)`. + */ +export type CloudInstanceCommandFlags = Interfaces.InferredFlags< + typeof CloudInstanceCommand.flags & typeof CloudInstanceCommand.baseFlags +>; + /** Base command for operations that require a Cloud-type PowerSync project (service.yaml _type: cloud). */ export abstract class CloudInstanceCommand extends InstanceCommand { static flags = { - ...InstanceCommand.flags + /** + * All Cloud instance Commands support manually providing the instance ID, org ID, and project ID. + * This can be useful for quickly performing an operation on a specific instance. + * The order of precedence is: + * 1. Flags passed to the command (explicitly provided) + * 2. Link.yaml file (due to the current context) + * 3. Environment variables (used if none of the above are provided) + */ + ...InstanceCommand.flags, + 'instance-id': Flags.string({ + description: 'PowerSync Cloud instance ID. Manually passed if the current context has not been linked.', + required: false + }), + 'org-id': Flags.string({ + description: 'Organization ID. Manually passed if the current context has not been linked.', + required: false + }), + 'project-id': Flags.string({ + description: 'Project ID. Manually passed if the current context has not been linked.', + required: false + }) }; /** @@ -32,7 +62,7 @@ export abstract class CloudInstanceCommand extends InstanceCommand { return createCloudClient(); } - loadProject(flags: { directory: string }, options?: EnsureConfigOptions): CloudProject { + loadProject(flags: CloudInstanceCommandFlags, options?: EnsureConfigOptions): CloudProject { const projectDir = this.ensureProjectDirExists(flags); // Check if the service.yaml file is present and has _type: cloud @@ -45,21 +75,58 @@ export abstract class CloudInstanceCommand extends InstanceCommand { }); const linkPath = join(projectDir, LINK_FILENAME); - if (options?.linkingIsRequired && !existsSync(linkPath)) { + + let linked: RequiredCloudLinkConfig | null = null; + if (flags['instance-id']) { + try { + // Use the decode to validate the flags + linked = RequiredCloudLinkConfig.decode({ + type: 'cloud', + instance_id: flags['instance-id'], + org_id: flags['org-id']!, + project_id: flags['project-id']! + }); + } catch (error) { + // It's only an error if linking is required + if (options?.linkingIsRequired) { + this.error( + `Linking is required before using this command. Explicitly provided flags were specified, but validation failed ${error}`, + { exit: 1 } + ); + } + } + } else if (existsSync(linkPath)) { + try { + const linkPath = join(projectDir, LINK_FILENAME); + const doc = loadLinkDocument(linkPath); + linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); + } catch (error) { + if (options?.linkingIsRequired) { + this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); + } + } + } else if (env.INSTANCE_ID) { + try { + linked = RequiredCloudLinkConfig.decode({ + type: 'cloud', + instance_id: env.INSTANCE_ID, + org_id: env.ORG_ID!, + project_id: env.PROJECT_ID! + }); + } catch (error) { + if (options?.linkingIsRequired) { + this.error(`Failed to parse environment variables as CloudLinkConfig: ${error}`, { exit: 1 }); + } + } + } + + if (!linked && options?.linkingIsRequired) { this.error( - `Linking is required before using this command. Run:\n powersync link cloud --instance-id= --org-id= --project-id=\nSee \`powersync link cloud --help\` for details.`, + `Linking is required before using this command. No linking information was found in the current context.`, { exit: 1 } ); } - let linked: RequiredCloudLinkConfig; - try { - const doc = loadLinkDocument(linkPath); - linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); - } catch (error) { - this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); - } - const syncRulesPath = join(projectDir, SYNC_FILENAME); let syncRulesContent: string | undefined; if (existsSync(syncRulesPath)) { @@ -67,7 +134,7 @@ export abstract class CloudInstanceCommand extends InstanceCommand { } return { projectDirectory: projectDir, - linked, + linked: linked!, syncRulesContent }; } diff --git a/packages/cli/src/utils/env.ts b/packages/cli/src/utils/env.ts index 84fb067..29dfaec 100644 --- a/packages/cli/src/utils/env.ts +++ b/packages/cli/src/utils/env.ts @@ -3,9 +3,24 @@ const DEFAULT_PS_MANAGEMENT_SERVICE_URL = 'https://powersync-api.journeyapps.com export type ENV = { _PS_MANAGEMENT_SERVICE_URL: string; PS_TOKEN?: string; + + /** + * Environment variables for manually providing the instance ID, org ID, and project ID. + * This can be useful for quickly performing an operation on a specific instance. + * The order of precedence is: + * 1. Flags passed to the command + * 2. Link.yaml file + * 3. Environment variables + */ + INSTANCE_ID?: string; + ORG_ID?: string; + PROJECT_ID?: string; }; export const env: ENV = { _PS_MANAGEMENT_SERVICE_URL: process.env._PS_MANAGEMENT_SERVICE_URL || DEFAULT_PS_MANAGEMENT_SERVICE_URL, - PS_TOKEN: process.env.PS_TOKEN + PS_TOKEN: process.env.PS_TOKEN, + INSTANCE_ID: process.env.INSTANCE_ID, + ORG_ID: process.env.ORG_ID, + PROJECT_ID: process.env.PROJECT_ID }; From 23ad67ef7400e50023640cb1d7719f4dc2db0a01 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Thu, 5 Feb 2026 17:41:10 +0200 Subject: [PATCH 011/141] Various command improvements. cloud Token and schema generation commands. --- docs/usage.md | 30 ++++ packages/cli/package.json | 4 +- .../src/command-types/CloudInstanceCommand.ts | 5 +- packages/cli/src/commands/deploy.ts | 114 +++++++++---- packages/cli/src/commands/fetch/status.ts | 156 +++++++++++++++++- packages/cli/src/commands/generate/schema.ts | 87 +++++++++- packages/cli/src/commands/generate/token.ts | 69 +++++++- packages/cli/src/commands/init.ts | 22 +-- packages/cli/src/commands/pull/config.ts | 15 +- packages/cli/test/commands/deploy.test.ts | 5 +- .../cli/test/utils/cloud-client-factory.ts | 4 +- pnpm-lock.yaml | 138 ++++++++++++++++ 12 files changed, 583 insertions(+), 66 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 70611d3..e944840 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,6 +12,36 @@ powersync pull config --org-id=5cc84a3ccudjfhgytw0c08b --project-id=6703fd8a3cfe powersync deploy ``` +# Authentication (Tokens) + +Cloud commands need an auth token (e.g. a PowerSync PAT). You can supply it in two ways; the CLI uses the first that is available: + +1. **Environment variable** — `PS_TOKEN` +2. **Stored via login** — token saved by `powersync login` (secure storage, e.g. macOS Keychain) + +**Environment variable** — useful for CI, scripts, or one-off runs: + +```bash +export PS_TOKEN=your-token-here +powersync stop --confirm=yes +``` + +Inline: + +```bash +PS_TOKEN=your-token-here powersync fetch config --output=json +``` + +**Stored via login** — convenient for local use; token is stored securely and reused: + +```bash +powersync login --token=your-token-here +# Later commands use the stored token +powersync fetch config +``` + +Login is supported on macOS (other platforms coming soon). If you use another platform or prefer not to store the token, set `PS_TOKEN` in the environment instead. + # Supplying Linking Information for Cloud Commands Cloud commands (`deploy`, `destroy`, `stop`, `fetch config`, `pull config`) need instance, org, and project IDs. You can supply them in three ways; the CLI uses the first that is available: diff --git a/packages/cli/package.json b/packages/cli/package.json index 1863a4d..3f11c3d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -16,12 +16,13 @@ "@powersync/management-client": "0.0.1", "@powersync/management-types": "0.0.1", "@powersync/service-client": "0.0.1", + "@powersync/service-sync-rules": "^0.30.0", "keychain": "^1.5.0", + "ora": "^9.0.0", "ts-codec": "^1.3.0", "yaml": "^2" }, "devDependencies": { - "tsx": "^4", "@eslint/compat": "^1", "@oclif/prettier-config": "^0.2.1", "@oclif/test": "^4", @@ -33,6 +34,7 @@ "oclif": "^4", "shx": "^0.3.3", "ts-node": "^10", + "tsx": "^4", "typescript": "^5", "vitest": "^4.0.0" }, diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index fa10869..a5efd7a 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -122,7 +122,10 @@ export abstract class CloudInstanceCommand extends InstanceCommand { if (!linked && options?.linkingIsRequired) { this.error( - `Linking is required before using this command. No linking information was found in the current context.`, + [ + 'Linking is required before using this command.', + 'No linking information was found in the current context.' + ].join('\n'), { exit: 1 } ); } diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 4f454e9..e17910d 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -1,16 +1,36 @@ +import type { RequiredCloudLinkConfig } from '@powersync/cli-schemas'; +import { PowerSyncManagementClient } from '@powersync/management-client'; import { routes } from '@powersync/management-types'; +import ora from 'ora'; import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; +const STATUS_POLL_INTERVAL_MS = 5000; +type DeployStatus = 'pending' | 'running' | 'failed' | 'completed'; + +async function waitForStatusChange( + client: PowerSyncManagementClient, + linked: RequiredCloudLinkConfig, + instanceId: string +): Promise { + for (;;) { + const result = await client.getInstanceStatus({ + org_id: linked.org_id, + app_id: linked.project_id, + id: instanceId + }); + const operation = result.operations?.[0]; + const status = operation?.status as DeployStatus | undefined; + if (status === 'failed' || status === 'completed') return status; + if (status === undefined) { + // No operation or unknown status; trpeat as failed to avoid infinite loop + return 'failed'; + } + await new Promise((resolve) => setTimeout(resolve, STATUS_POLL_INTERVAL_MS)); + } +} + /** Pretty-print test connection response for error output. Uses types from @powersync/management-types (BaseTestConnectionResponse). */ -function formatTestConnectionFailure( - response: { - success?: boolean; - connection?: { success?: boolean; reachable?: boolean }; - configuration?: { success?: boolean }; - error?: string; - }, - connectionName: string -): string { +function formatTestConnectionFailure(response: routes.TestConnectionResponse, connectionName: string): string { const lines: string[] = [ `Failed to test connection for connection "${connectionName}":`, '', @@ -53,10 +73,10 @@ export default class Deploy extends CloudInstanceCommand { }) .catch((error) => { this.error( - ` -Failed to get existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error} -Ensure the instance has been created before deploying. - `.trim(), + [ + `Failed to get existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + 'Ensure the instance has been created before deploying.' + ].join('\n'), { exit: 1 } ); }); @@ -64,12 +84,25 @@ Ensure the instance has been created before deploying. const existingRegion = existingConfig.config?.region; if (existingRegion && existingRegion !== config.region) { this.error( - ` -The existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id} has a different region than the config being deployed. -The region cannot be changed after the initial deployment. -Existing region: ${existingRegion} -New region: ${config.region} - `.trim(), + [ + `The existing config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id} has a different region than the config being deployed.`, + 'The region cannot be changed after the initial deployment.', + `Existing region: ${existingRegion}`, + `New region: ${config.region}` + ].join('\n'), + { exit: 1 } + ); + } + + // Validate region against list of regions obtained from client.listRegions() + const regions = await client.listRegions({}).catch((error) => { + this.error(`Could not validate region against list of regions: Failed to list regions: ${error}`, { exit: 1 }); + }); + + const foundRegion = regions.regions.find((region) => region.name === config.region); + if (!foundRegion) { + this.error( + `The region ${config.region} is not supported. Please choose a region from the list of supported regions: ${regions.regions.map((region) => region.name).join(', ')}`, { exit: 1 } ); } @@ -83,13 +116,15 @@ New region: ${config.region} } for (const connection of config.replication?.connections ?? []) { const response = await client - .testConnection({ - // The instance ID allows secret_refs to be used - id: linked.instance_id, - org_id: linked.org_id, - app_id: linked.project_id, - connection - }) + .testConnection( + routes.TestConnectionRequest.encode({ + // The instance ID allows secret_refs to be used + id: linked.instance_id, + org_id: linked.org_id, + app_id: linked.project_id, + connection + }) + ) .catch((error) => { this.error(`Failed to test connection for connection ${connection.name}: ${error}`, { exit: 1 }); }); @@ -99,12 +134,16 @@ New region: ${config.region} } this.log('Connection test successful.'); - this.log( - `Deploying changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}` - ); + const spinner = ora({ + prefixText: 'Deploying instance.\n', + spinner: 'moon', + suffixText: '\nThis may take a few minutes.\n' + }); + spinner.start(); + let deployResult: { id: string; operation_id?: string }; try { - await client.deployInstance( + deployResult = await client.deployInstance( routes.DeployInstanceRequest.encode({ // Spread the existing config like name, and program version contraints. // Should we allow specifying these in the config file? @@ -115,10 +154,25 @@ New region: ${config.region} }) ); } catch (error) { + spinner.stop(); this.error( `Failed to deploy changes to instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, { exit: 1 } ); } + + const status = await waitForStatusChange(client, linked, deployResult.id); + spinner.stop(); + + if (status === 'failed') { + this.error( + [ + `Deploy failed for instance ${linked.instance_id}.`, + 'Check instance diagnostics for details, for example:', + ' powersync fetch status' + ].join('\n'), + { exit: 1 } + ); + } } } diff --git a/packages/cli/src/commands/fetch/status.ts b/packages/cli/src/commands/fetch/status.ts index 63348d3..2ca5905 100644 --- a/packages/cli/src/commands/fetch/status.ts +++ b/packages/cli/src/commands/fetch/status.ts @@ -1,11 +1,157 @@ -import {Command} from '@oclif/core' +import { Flags } from '@oclif/core'; +import { routes } from '@powersync/management-types'; +import { Document } from 'yaml'; -export default class FetchStatus extends Command { +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; + +type DiagnosticsResponse = routes.InstanceDiagnosticsResponse; +type SyncRulesSection = NonNullable; + +const INDENT = ' '; +const BULLET = '•'; + +function pad(level: number): string { + return INDENT.repeat(level); +} + +/** Format a date value as "ISO (local)" for human output. Returns raw value if not parseable. */ +function formatDate(value: string | number | undefined | null): string { + if (value === undefined || value === null) return '—'; + const date = new Date(value); + if (Number.isNaN(date.getTime())) return String(value); + return `${date.toISOString()} (${date.toLocaleString()})`; +} + +function formatErrors(errors: Array<{ level: string; message: string; ts?: string }>, indentLevel: number): string { + if (!errors?.length) return ''; + const p = pad(indentLevel); + return errors.map((e) => `${p}${BULLET} [${e.level}] ${e.message}${e.ts ? ` (${e.ts})` : ''}`).join('\n'); +} + +function formatConnectionsSection(connections: DiagnosticsResponse['connections'], indentLevel: number): string { + if (!connections?.length) return `${pad(indentLevel)}(no connections)\n`; + const p = pad(indentLevel); + const lines: string[] = []; + for (const conn of connections) { + const status = conn.connected ? 'connected' : 'disconnected'; + lines.push(`${p}${BULLET} ${conn.id}`); + lines.push(`${p} Postgres URI: ${conn.postgres_uri ?? '—'}`); + lines.push(`${p} Status: ${status}`); + if (conn.errors?.length) { + lines.push(`${p} Errors:`); + lines.push(formatErrors(conn.errors, indentLevel + 2)); + } + lines.push(''); + } + return lines.join('\n').trimEnd() + '\n'; +} + +function formatSyncRulesSection(section: SyncRulesSection, indentLevel: number): string { + const p = pad(indentLevel); + const lines: string[] = []; + + if (section.errors?.length) { + lines.push(`${p}Errors:`); + lines.push(formatErrors(section.errors, indentLevel + 1)); + lines.push(''); + } + + if (section.connections?.length) { + lines.push(`${p}Connections:`); + for (const conn of section.connections) { + lines.push(`${p} ${BULLET} ${conn.tag ?? conn.id} (slot: ${conn.slot_name ?? '—'})`); + lines.push(`${p} Initial replication done: ${conn.initial_replication_done}`); + if (conn.last_lsn != null) lines.push(`${p} Last LSN: ${conn.last_lsn}`); + if (conn.last_keepalive_ts != null) lines.push(`${p} Last keepalive: ${formatDate(conn.last_keepalive_ts)}`); + if (conn.last_checkpoint_ts != null) + lines.push(`${p} Last checkpoint: ${formatDate(conn.last_checkpoint_ts)}`); + if (conn.replication_lag_bytes != null) + lines.push(`${p} Replication lag: ${conn.replication_lag_bytes} bytes`); + if (conn.tables?.length) { + lines.push(`${p} Tables:`); + for (const table of conn.tables) { + const name = `${table.schema}.${table.name}`; + const repl = table.replication_id?.length ? table.replication_id.join(', ') : '—'; + lines.push(`${p} - ${name} (replication_id: ${repl})`); + if (table.data_queries != null) lines.push(`${p} data_queries: ${table.data_queries}`); + if (table.parameter_queries != null) lines.push(`${p} parameter_queries: ${table.parameter_queries}`); + if (table.errors?.length) lines.push(formatErrors(table.errors, indentLevel + 3)); + } + } + } + lines.push(''); + } + + if (section.content != null && section.content !== '') { + lines.push(`${p}Content:`); + lines.push(`${p} ${section.content.split('\n').join(`\n${p} `)}`); + } + + return lines.join('\n').trimEnd() || `${p}(no data)\n`; +} + +function formatDiagnosticsHuman(diagnostics: DiagnosticsResponse): string { + const sections: string[] = []; + + sections.push('═══ Connections ═══'); + sections.push(formatConnectionsSection(diagnostics.connections ?? [], 0)); + + if (diagnostics.active_sync_rules != null) { + sections.push('═══ Active Sync Rules ═══'); + sections.push(formatSyncRulesSection(diagnostics.active_sync_rules, 0)); + } + + if (diagnostics.deploying_sync_rules != null) { + sections.push('═══ Deploying Sync Rules ═══'); + sections.push(formatSyncRulesSection(diagnostics.deploying_sync_rules, 0)); + } + + return sections.join('\n').trimEnd(); +} + +// TODO self hosted support +export default class FetchStatus extends CloudInstanceCommand { static description = - 'Fetches diagnostics (connections, sync rules state, etc.). Routes to Management service (Cloud) or linked instance (self-hosted).' - static summary = 'Fetch diagnostics status for an instance.' + 'Fetches diagnostics (connections, sync rules state, etc.). Routes to Management service (Cloud) or linked instance (self-hosted).'; + static summary = 'Fetch diagnostics status for an instance.'; + + static flags = { + ...CloudInstanceCommand.flags, + output: Flags.string({ + default: 'human', + description: 'Output format: human-readable, json, or yaml.', + options: ['human', 'json', 'yaml'] + }) + }; async run(): Promise { - this.log('fetch status: not yet implemented') + const { flags } = await this.parse(FetchStatus); + + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + + const client = await this.getClient(); + + const diagnostics = await client + .getInstanceDiagnostics({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }) + .catch((error) => { + this.error(`Failed to fetch diagnostics for instance ${linked.instance_id}: ${error}`, { exit: 1 }); + }); + + if (flags.output === 'json') { + this.log(JSON.stringify(diagnostics, null, 2)); + return; + } else if (flags.output === 'yaml') { + this.log(new Document(diagnostics).toString()); + return; + } else { + this.log(formatDiagnosticsHuman(diagnostics)); + } } } diff --git a/packages/cli/src/commands/generate/schema.ts b/packages/cli/src/commands/generate/schema.ts index 165ed6a..6f0d5e8 100644 --- a/packages/cli/src/commands/generate/schema.ts +++ b/packages/cli/src/commands/generate/schema.ts @@ -1,11 +1,88 @@ -import {Command} from '@oclif/core' +import { Flags } from '@oclif/core'; +import { schemaGenerators, SqlSyncRules, StaticSchema } from '@powersync/service-sync-rules'; +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; +import { SYNC_FILENAME } from '../../utils/project-config.js'; -export default class GenerateSchema extends Command { +// TODO: Add support for self-hosted instances. +export default class GenerateSchema extends CloudInstanceCommand { static description = - 'Generates client-side schema from instance schema and sync rules. Supported for Cloud and self-hosted.' - static summary = 'Create client-side schemas.' + 'Generates client-side schema from instance schema and sync rules. Supported for Cloud and self-hosted.'; + static summary = 'Create client-side schemas.'; + + static flags = { + ...CloudInstanceCommand.flags, + output: Flags.string({ + default: 'type', + description: 'Output type: ' + Object.keys(schemaGenerators).join(', '), + options: Object.keys(schemaGenerators), + required: true + }), + 'output-path': Flags.string({ + description: 'Path to output the schema file.', + required: true + }) + }; async run(): Promise { - this.log('generate schema: not yet implemented') + const { flags } = await this.parse(GenerateSchema); + + const { projectDirectory, linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + + const client = await this.getClient(); + + const instanceConfig = await client.getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + + const databaseSchema = await client + .getInstanceSchema({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }) + .catch((error) => { + this.error( + `Failed to get database schema for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + }); + + const schemaGenerator = schemaGenerators[flags.output as keyof typeof schemaGenerators]; + if (!schemaGenerator) { + this.error(`Invalid output type: ${flags.output}. Supported types: ${Object.keys(schemaGenerators).join(', ')}`, { + exit: 1 + }); + } + + const syncRulesPath = join(projectDirectory, SYNC_FILENAME); + const syncRulesContent = existsSync(syncRulesPath) + ? readFileSync(syncRulesPath, 'utf8') + : instanceConfig.sync_rules; + + if (!syncRulesContent) { + this.error( + `No sync rules found. Either create a sync.yaml file in the project directory or deploy sync rules to the instance first.`, + { exit: 1 } + ); + } + + const staticSchema = new StaticSchema(databaseSchema.connections); + const schema = schemaGenerator.generate( + SqlSyncRules.fromYaml(syncRulesContent, { + defaultSchema: databaseSchema.defaultSchema ?? 'public', + schema: staticSchema + }), + staticSchema + ); + + writeFileSync(flags['output-path'], schema, 'utf8'); + this.log(`Generated schema written to ${flags.outputPath}`); } } diff --git a/packages/cli/src/commands/generate/token.ts b/packages/cli/src/commands/generate/token.ts index 61297bd..b6df542 100644 --- a/packages/cli/src/commands/generate/token.ts +++ b/packages/cli/src/commands/generate/token.ts @@ -1,11 +1,70 @@ -import {Command} from '@oclif/core' +import { Flags } from '@oclif/core'; +import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; -export default class GenerateToken extends Command { +export default class GenerateToken extends CloudInstanceCommand { static description = - 'Generates a development token for connecting clients. Cloud and self-hosted (when shared secret is in config).' - static summary = 'Create a client token for the PowerSync service.' + 'Generates a development token for connecting clients. Cloud and self-hosted (when shared secret is in config).'; + static summary = 'Create a client token for the PowerSync service.'; + + static flags = { + ...CloudInstanceCommand.flags, + subject: Flags.string({ + description: 'Subject of the token.', + required: true + }), + 'expires-in-seconds': Flags.integer({ + description: 'Expiration time in seconds. Default is 43,200 (12 hours).', + required: false, + default: 43_200 + }) + }; async run(): Promise { - this.log('generate token: not yet implemented') + const { flags } = await this.parse(GenerateToken); + const { linked } = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + const client = await this.getClient(); + + // Get the config in order to check if development tokens are enabled. + const config = await client + .getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }) + .catch((error) => { + this.error( + `Failed to get config for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, + { exit: 1 } + ); + }); + + if (!config?.config?.client_auth?.allow_temporary_tokens) { + this.error( + [ + 'Development tokens are not enabled for this instance.', + 'Set the following config in the instance config to enable development tokens:', + ' client_auth:', + ' allow_temporary_tokens: true', + 'Then deploy an update to enable development tokens first.' + ].join('\n'), + { + exit: 1 + } + ); + } + + const response = await client.generateDevToken({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id, + subject: flags.subject, + expiresInSeconds: flags['expires-in-seconds'] + }); + + // The output of this is purposefully simple in order for the output to be easily used in shell scripts. + this.log(response.token); } } diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 2357ec5..c18c0f6 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -49,24 +49,18 @@ export default class Init extends PowerSyncCommand { mkdirSync(targetDir, { recursive: true }); cpSync(templatePath, targetDir, { recursive: true }); - const cloudInstructions = `To deploy to PowerSync Cloud, run: -powersync link -powersync deploy - `.trim(); + const cloudInstructions = ['To deploy to PowerSync Cloud, run:', 'powersync link', 'powersync deploy'].join('\n'); - const selfHostedInstructions = - `Self Hosted projects currently require external configuration for starting and deploying. -Please refer to the PowerSync Self-Hosted documentation for more information. - `.trim(); + const selfHostedInstructions = [ + 'Self Hosted projects currently require external configuration for starting and deploying.', + 'Please refer to the PowerSync Self-Hosted documentation for more information.' + ].join('\n'); const instructions = type === 'cloud' ? cloudInstructions : selfHostedInstructions; this.log( - `Created PowerSync ${type} project! -Configuration files are located in: -${targetDir} - -${instructions} - `.trim() + [`Created PowerSync ${type} project!`, 'Configuration files are located in:', targetDir, '', instructions].join( + '\n' + ) ); } } diff --git a/packages/cli/src/commands/pull/config.ts b/packages/cli/src/commands/pull/config.ts index e35de28..12231ec 100644 --- a/packages/cli/src/commands/pull/config.ts +++ b/packages/cli/src/commands/pull/config.ts @@ -123,7 +123,10 @@ export default class PullConfig extends CloudInstanceCommand { if (!existsSync(linkPath)) { if (!instanceId || !orgId || !projectId) { this.error( - `Linking is required. Either run \`powersync link cloud --instance-id= --org-id= --project-id=\` first, or pass --instance-id, --org-id, and --project-id to this command.`, + [ + 'Linking is required. Either run `powersync link cloud --instance-id= --org-id= --project-id=` first,', + 'or pass --instance-id, --org-id, and --project-id to this command.' + ].join('\n'), { exit: 1 } ); } @@ -152,12 +155,18 @@ export default class PullConfig extends CloudInstanceCommand { const syncExists = existsSync(join(projectDir, SYNC_FILENAME)); if (serviceExists) { this.warn( - `${SERVICE_FILENAME} already exists. Writing to service-fetched.yaml instead. Manually merge the settings into ${SERVICE_FILENAME} as needed.` + [ + `${SERVICE_FILENAME} already exists. Writing to service-fetched.yaml instead.`, + `Manually merge the settings into ${SERVICE_FILENAME} as needed.` + ].join('\n') ); } if (syncExists && fetched.syncRules) { this.warn( - `${SYNC_FILENAME} already exists. Writing to sync-fetched.yaml instead. Manually merge the sync rules into ${SYNC_FILENAME} as needed.` + [ + `${SYNC_FILENAME} already exists. Writing to sync-fetched.yaml instead.`, + `Manually merge the sync rules into ${SYNC_FILENAME} as needed.` + ].join('\n') ); } const serviceYaml = formatServiceYamlWithComments(fetched.config); diff --git a/packages/cli/test/commands/deploy.test.ts b/packages/cli/test/commands/deploy.test.ts index a304a9f..055ea95 100644 --- a/packages/cli/test/commands/deploy.test.ts +++ b/packages/cli/test/commands/deploy.test.ts @@ -11,9 +11,11 @@ import * as DeployCommand from '../../src/commands/deploy.js'; const mockGetInstanceConfig = vi.fn(); const mockDeployInstance = vi.fn(); +const mockGetInstanceStatus = vi.fn(); vi.spyOn(CloudClient, 'createCloudClient').mockReturnValue({ deployInstance: mockDeployInstance, - getInstanceConfig: mockGetInstanceConfig + getInstanceConfig: mockGetInstanceConfig, + getInstanceStatus: mockGetInstanceStatus } as unknown as ReturnType); /** Run deploy by instantiating the command and calling .run() so the spy on createCloudClient applies. */ @@ -48,6 +50,7 @@ describe('deploy', () => { process.chdir(tmpDir); mockGetInstanceConfig.mockReset(); mockDeployInstance.mockReset(); + mockGetInstanceStatus.mockReset(); mockGetInstanceConfig.mockRejectedValue(new Error('network error')); }); diff --git a/packages/cli/test/utils/cloud-client-factory.ts b/packages/cli/test/utils/cloud-client-factory.ts index c4dd114..48aba5b 100644 --- a/packages/cli/test/utils/cloud-client-factory.ts +++ b/packages/cli/test/utils/cloud-client-factory.ts @@ -3,7 +3,9 @@ import { vi } from 'vitest'; /** Stub used as the cloud client in tests. Created once, returned by createCloudClient and exposed for mocking. */ const stub: PowerSyncManagementClient = { - getInstanceConfig: vi.fn() + getInstanceConfig: vi.fn(), + getInstanceDiagnostics: vi.fn(), + getInstanceStatus: vi.fn() } as unknown as PowerSyncManagementClient; /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 303479b..d98dd91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,9 +46,15 @@ importers: '@powersync/service-client': specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz version: file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) + '@powersync/service-sync-rules': + specifier: ^0.30.0 + version: 0.30.0 keychain: specifier: ^1.5.0 version: 1.5.0 + ora: + specifier: ^9.0.0 + version: 9.3.0 ts-codec: specifier: ^1.3.0 version: 1.3.0 @@ -1004,6 +1010,9 @@ packages: '@powersync/service-sync-rules@0.29.10': resolution: {integrity: sha512-z26aJVvTVeYhFuopItQEwU3snS0BfTrPRA6PWkpfgN6RAEOCzb0oj8L/D3RM4w0k6FqyxEQb7/TI11YAUv7Lrg==} + '@powersync/service-sync-rules@0.30.0': + resolution: {integrity: sha512-3ud6ZICdI1d86OWRMGLJMWvkzd32oZxwNa9QGyqvrJUJ8S0UjLC6Pl3xYVHehC8X8S1dNMr2YQjrAPfpJTgjmw==} + '@powersync/service-types@0.13.3': resolution: {integrity: sha512-4QLFpvuZlAo3aBBfBvN/K1r8cvY7iRm7H2USuGFBLATq8onL33njPpho/ps2sm4LxPhwlQcUU0ApywAHajhCzg==} @@ -1762,6 +1771,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1938,6 +1951,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -1964,10 +1981,18 @@ packages: resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} engines: {node: '>=10'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -2541,6 +2566,10 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2804,6 +2833,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2856,6 +2889,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3021,6 +3058,10 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} @@ -3061,6 +3102,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -3288,6 +3333,10 @@ packages: one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -3296,6 +3345,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@9.3.0: + resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} + engines: {node: '>=20'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -3512,6 +3565,10 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -3667,6 +3724,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.3.1: + resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -3675,6 +3736,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -3694,6 +3759,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -4144,6 +4213,10 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -5766,6 +5839,15 @@ snapshots: uuid: 11.1.0 yaml: 2.8.2 + '@powersync/service-sync-rules@0.30.0': + dependencies: + '@powersync/service-jsonbig': 0.17.12 + '@syncpoint/wkx': 0.5.2 + ajv: 8.17.1 + pgsql-ast-parser: 11.2.0 + uuid: 11.1.0 + yaml: 2.8.2 + '@powersync/service-types@0.13.3': dependencies: dedent: 1.7.1 @@ -6637,6 +6719,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -6851,6 +6935,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@4.1.2: dependencies: camel-case: 4.1.2 @@ -6882,8 +6968,14 @@ snapshots: dependencies: escape-string-regexp: 4.0.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} + cli-width@4.1.0: {} color-convert@2.0.1: @@ -7606,6 +7698,8 @@ snapshots: generator-function@2.0.1: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7879,6 +7973,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -7924,6 +8020,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -8069,6 +8167,11 @@ snapshots: lodash@4.17.23: {} + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -8107,6 +8210,8 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mimic-function@5.0.1: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} @@ -8285,6 +8390,10 @@ snapshots: dependencies: fn.name: 1.1.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open@10.2.0: dependencies: default-browser: 5.5.0 @@ -8301,6 +8410,17 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@9.3.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.1 + string-width: 8.1.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -8518,6 +8638,11 @@ snapshots: dependencies: lowercase-keys: 3.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + ret@0.1.15: {} retry@0.13.1: {} @@ -8714,6 +8839,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.3.1: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -8725,6 +8852,11 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@8.1.1: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -8756,6 +8888,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + strip-bom@3.0.0: {} strip-indent@3.0.0: @@ -9294,6 +9430,8 @@ snapshots: yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} + zod@3.25.76: {} zod@4.3.6: {} From 5d9a0903df5aad11d644d536652fe5df271dcb18 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 10:09:27 +0200 Subject: [PATCH 012/141] wip: shared commands --- packages/cli/package.json | 1 + .../src/api/{ => cloud}/fetch-cloud-config.ts | 0 .../cloud/fetch-cloud-sync-rules-content.ts | 33 ++++ .../src/api/{ => cloud}/write-cloud-link.ts | 0 .../fetch-self-hosted-sync-rules-content.ts | 33 ++++ .../src/command-types/CloudInstanceCommand.ts | 2 +- .../SelfHostedInstanceCommand.ts | 16 +- .../command-types/SharedInstanceCommand.ts | 170 ++++++++++++++++++ packages/cli/src/commands/destroy.ts | 4 +- packages/cli/src/commands/fetch/config.ts | 6 +- packages/cli/src/commands/fetch/status.ts | 48 +++-- packages/cli/src/commands/generate/schema.ts | 78 ++++---- packages/cli/src/commands/generate/token.ts | 4 +- packages/cli/src/commands/init.ts | 4 +- packages/cli/src/commands/link/cloud.ts | 5 +- packages/cli/src/commands/link/self-hosted.ts | 11 +- packages/cli/src/commands/pull/config.ts | 14 +- packages/cli/src/commands/stop.ts | 4 +- packages/cli/src/commands/validate.ts | 8 +- packages/cli/src/utils/env.ts | 14 +- packages/schemas/src/LinkConfig.ts | 4 + pnpm-lock.yaml | 3 + 22 files changed, 362 insertions(+), 100 deletions(-) rename packages/cli/src/api/{ => cloud}/fetch-cloud-config.ts (100%) create mode 100644 packages/cli/src/api/cloud/fetch-cloud-sync-rules-content.ts rename packages/cli/src/api/{ => cloud}/write-cloud-link.ts (100%) create mode 100644 packages/cli/src/api/self-hosted/fetch-self-hosted-sync-rules-content.ts create mode 100644 packages/cli/src/command-types/SharedInstanceCommand.ts diff --git a/packages/cli/package.json b/packages/cli/package.json index 3f11c3d..20ea623 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -17,6 +17,7 @@ "@powersync/management-types": "0.0.1", "@powersync/service-client": "0.0.1", "@powersync/service-sync-rules": "^0.30.0", + "@powersync/service-types": "^0.13.3", "keychain": "^1.5.0", "ora": "^9.0.0", "ts-codec": "^1.3.0", diff --git a/packages/cli/src/api/fetch-cloud-config.ts b/packages/cli/src/api/cloud/fetch-cloud-config.ts similarity index 100% rename from packages/cli/src/api/fetch-cloud-config.ts rename to packages/cli/src/api/cloud/fetch-cloud-config.ts diff --git a/packages/cli/src/api/cloud/fetch-cloud-sync-rules-content.ts b/packages/cli/src/api/cloud/fetch-cloud-sync-rules-content.ts new file mode 100644 index 0000000..62878d3 --- /dev/null +++ b/packages/cli/src/api/cloud/fetch-cloud-sync-rules-content.ts @@ -0,0 +1,33 @@ +import { existsSync, readFileSync } from 'fs'; +import { join } from 'path'; +import { createCloudClient } from '../../clients/CloudClient.js'; +import { CloudProject } from '../../command-types/CloudInstanceCommand.js'; +import { SYNC_FILENAME } from '../../utils/project-config.js'; + +/** + * Fetches the sync rules content for a cloud project. + * @param project - The project to fetch the sync rules content for. + * @returns The sync rules content. + */ +export async function fetchCloudSyncRulesContent(project: CloudProject): Promise { + const { linked } = project; + const client = await createCloudClient(); + + // First try and use the local file + if (existsSync(join(project.projectDirectory, SYNC_FILENAME))) { + return readFileSync(join(project.projectDirectory, SYNC_FILENAME), 'utf8'); + } + + // Try and fetch from the cloud config + const instanceConfig = await client.getInstanceConfig({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + + if (!instanceConfig.sync_rules) { + throw new Error('No sync rules found'); + } + + return instanceConfig.sync_rules; +} diff --git a/packages/cli/src/api/write-cloud-link.ts b/packages/cli/src/api/cloud/write-cloud-link.ts similarity index 100% rename from packages/cli/src/api/write-cloud-link.ts rename to packages/cli/src/api/cloud/write-cloud-link.ts diff --git a/packages/cli/src/api/self-hosted/fetch-self-hosted-sync-rules-content.ts b/packages/cli/src/api/self-hosted/fetch-self-hosted-sync-rules-content.ts new file mode 100644 index 0000000..6491220 --- /dev/null +++ b/packages/cli/src/api/self-hosted/fetch-self-hosted-sync-rules-content.ts @@ -0,0 +1,33 @@ +import { existsSync, readFileSync } from 'fs'; +import { join } from 'path'; +import { createSelfHostedClient } from '../../clients/SelfHostedClient.js'; +import { SelfHostedProject } from '../../command-types/SelfHostedInstanceCommand.js'; +import { SYNC_FILENAME } from '../../utils/project-config.js'; + +/** + * Fetches the sync rules content for a self-hosted project. + * @param project - The project to fetch the sync rules content for. + * @returns The sync rules content. + */ +export async function fetchSelfHostedSyncRulesContent(project: SelfHostedProject): Promise { + const { linked } = project; + const client = createSelfHostedClient({ + apiUrl: linked.api_url, + apiKey: linked.api_key + }); + + // First try and use the local file + if (existsSync(join(project.projectDirectory, SYNC_FILENAME))) { + return readFileSync(join(project.projectDirectory, SYNC_FILENAME), 'utf8'); + } + + // Try and fetch from the cloud config + const instanceConfig = await client.diagnostics({}); + const content = instanceConfig.active_sync_rules?.content; + + if (!content) { + throw new Error('No active sync rules found'); + } + + return content; +} diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index a5efd7a..005589c 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -142,7 +142,7 @@ export abstract class CloudInstanceCommand extends InstanceCommand { }; } - parseConfig(projectDirectory: string) { + parseConfig(projectDirectory: string): CLICloudConfig { const servicePath = join(projectDirectory, SERVICE_FILENAME); const doc = loadServiceDocument(servicePath); return CLICloudConfig.decode(doc.contents?.toJSON()); diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts index d4f1e9a..26d326e 100644 --- a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -1,3 +1,4 @@ +import { Flags } from '@oclif/core'; import { CLISelfHostedConfig, RequiredSelfHostedLinkConfig } from '@powersync/cli-schemas'; import { join } from 'node:path'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; @@ -12,7 +13,20 @@ export type SelfHostedProject = { /** Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). */ export abstract class SelfHostedInstanceCommand extends InstanceCommand { static flags = { - ...InstanceCommand.flags + ...InstanceCommand.flags, + /** + * All SelfHosted instance Commands support manually providing the API URL. + * This can be useful for quickly performing an operation on a specific instance. + * The order of precedence is: + * 1. Flags passed to the command (explicitly provided) + * 2. Link.yaml file (due to the current context) + * 3. Environment variables (used if none of the above are provided) + */ + ...InstanceCommand.flags, + 'api-url': Flags.string({ + description: 'PowerSync API URL. When set, context is treated as self-hosted (exclusive with --instance-id).', + required: false + }) }; loadProject(flags: { directory: string }, options?: EnsureConfigOptions): SelfHostedProject { diff --git a/packages/cli/src/command-types/SharedInstanceCommand.ts b/packages/cli/src/command-types/SharedInstanceCommand.ts new file mode 100644 index 0000000..1116003 --- /dev/null +++ b/packages/cli/src/command-types/SharedInstanceCommand.ts @@ -0,0 +1,170 @@ +import { Flags, Interfaces } from '@oclif/core'; +import { + CLICloudConfig, + CLISelfHostedConfig, + CloudLinkConfig, + LinkConfig, + RequiredCloudLinkConfig, + RequiredSelfHostedLinkConfig, + SelfHostedLinkConfig +} from '@powersync/cli-schemas'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; +import { env } from '../utils/env.js'; +import { + LINK_FILENAME, + loadLinkDocument, + loadServiceDocument, + SERVICE_FILENAME, + SYNC_FILENAME +} from '../utils/project-config.js'; +import { CloudProject } from './CloudInstanceCommand.js'; +import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; +import { SelfHostedProject } from './SelfHostedInstanceCommand.js'; + +export type SharedInstanceCommandFlags = Interfaces.InferredFlags< + typeof SharedInstanceCommand.flags & typeof SharedInstanceCommand.baseFlags +>; + +export abstract class SharedInstanceCommand extends InstanceCommand { + static flags = { + ...InstanceCommand.flags, + 'api-url': Flags.string({ + description: + '[Self-hosted] PowerSync API URL. When set, context is treated as self-hosted (exclusive with --instance-id).', + required: false + }), + 'instance-id': Flags.string({ + description: + '[Cloud] PowerSync Cloud instance ID (BSON ObjectID). When set, context is treated as cloud (exclusive with --api-url).', + required: false + }), + 'org-id': Flags.string({ + description: '[Cloud] Organization ID. Manually passed if the current context has not been linked.', + required: false + }), + 'project-id': Flags.string({ + description: '[Cloud] Project ID. Manually passed if the current context has not been linked.', + required: false + }) + }; + + loadProject(flags: SharedInstanceCommandFlags, options?: EnsureConfigOptions): CloudProject | SelfHostedProject { + const projectDir = this.ensureProjectDirExists(flags); + const linkPath = join(projectDir, LINK_FILENAME); + + // Start to attempt to detect cloud or self-hosted inputs + const hasCloudInstanceInputs = flags['instance-id'] || env.INSTANCE_ID || flags['org-id'] || flags['project-id']; + const hasSelfHostedInputs = flags['api-url'] || env.API_URL; + + // There can be only one + if (hasCloudInstanceInputs && hasSelfHostedInputs) { + this.error(['Cannot use both cloud and self-hosted inputs. Use one or the other.'].join('\n'), { exit: 1 }); + } + + let projectType: 'cloud' | 'self-hosted' | null = hasSelfHostedInputs + ? 'self-hosted' + : hasCloudInstanceInputs + ? 'cloud' + : null; + + // Try and set the type from the link file (if it exists) + let rawLinkConfig: LinkConfig | null = null; + // check if the link file exists + if (existsSync(linkPath)) { + const doc = loadLinkDocument(linkPath); + rawLinkConfig = LinkConfig.decode(doc.contents?.toJSON()); + if (rawLinkConfig.type === 'self-hosted') { + projectType = 'self-hosted'; + } else if (rawLinkConfig.type === 'cloud') { + projectType = 'cloud'; + } + } + + const linkMissingErrorMessage = [ + 'Linking is required before using this command.', + 'Provide --api-url (self-hosted) or --instance-id with --org-id and --project-id (cloud), or link the project first.' + ].join('\n'); + + // If we don't have a project type by now, we need to error + if (!projectType && options?.linkingIsRequired) { + this.error(linkMissingErrorMessage, { exit: 1 }); + } + + // Resolve the link config from the flags and the link file + let linkConfig: RequiredCloudLinkConfig | RequiredSelfHostedLinkConfig | null = null; + if (projectType === 'self-hosted') { + const _rawSelfHostedLinkConfig = (rawLinkConfig as SelfHostedLinkConfig) ?? { type: 'self-hosted' }; + try { + linkConfig = RequiredSelfHostedLinkConfig.decode({ + ..._rawSelfHostedLinkConfig, + api_key: flags['api-key'] ?? env.PS_TOKEN ?? _rawSelfHostedLinkConfig.api_key!, + api_url: flags['api-url'] ?? env.API_URL ?? _rawSelfHostedLinkConfig.api_url! + }); + } catch (error) { + if (options?.linkingIsRequired) { + this.error(`${linkMissingErrorMessage}\n${error}`, { exit: 1 }); + } + } + } else { + const _rawCloudLinkConfig = (rawLinkConfig as CloudLinkConfig) ?? { type: 'cloud' }; + try { + linkConfig = RequiredCloudLinkConfig.decode({ + ..._rawCloudLinkConfig, + instance_id: flags['instance-id'] ?? env.INSTANCE_ID ?? _rawCloudLinkConfig.instance_id!, + org_id: flags['org-id'] ?? env.ORG_ID ?? _rawCloudLinkConfig.org_id!, + project_id: flags['project-id'] ?? env.PROJECT_ID ?? _rawCloudLinkConfig.project_id! + }); + } catch (error) { + if (options?.linkingIsRequired) { + this.error(`${linkMissingErrorMessage}\n${error}`, { exit: 1 }); + } + } + } + + if (!linkConfig && options?.linkingIsRequired) { + this.error(linkMissingErrorMessage, { exit: 1 }); + } + + // ensure the link config is valid + ensureServiceTypeMatches({ + command: this, + configRequired: false, + directoryLabel: projectDir, + expectedType: projectType!, + projectDir + }); + + const syncRulesPath = join(projectDir, SYNC_FILENAME); + let syncRulesContent: string | undefined; + if (existsSync(syncRulesPath)) { + syncRulesContent = readFileSync(syncRulesPath, 'utf8'); + } + + if (projectType === 'cloud') { + return { + projectDirectory: projectDir, + linked: linkConfig as RequiredCloudLinkConfig, + syncRulesContent + }; + } + return { + projectDirectory: projectDir, + linked: linkConfig as RequiredSelfHostedLinkConfig, + syncRulesContent + }; + } + + parseCloudConfig(projectDirectory: string): CLICloudConfig { + const servicePath = join(projectDirectory, SERVICE_FILENAME); + const doc = loadServiceDocument(servicePath); + return CLICloudConfig.decode(doc.contents?.toJSON()); + } + + parseSelfHostedConfig(projectDirectory: string): CLISelfHostedConfig { + const servicePath = join(projectDirectory, SERVICE_FILENAME); + const doc = loadServiceDocument(servicePath); + return CLISelfHostedConfig.decode(doc.contents?.toJSON()); + } +} diff --git a/packages/cli/src/commands/destroy.ts b/packages/cli/src/commands/destroy.ts index 5cf440f..a60a532 100644 --- a/packages/cli/src/commands/destroy.ts +++ b/packages/cli/src/commands/destroy.ts @@ -7,11 +7,11 @@ export default class Destroy extends CloudInstanceCommand { static summary = 'Destroy a PowerSync instance.'; static flags = { - ...CloudInstanceCommand.flags, confirm: Flags.string({ description: 'Set to "yes" to confirm destruction of the instance.', options: ['yes'] - }) + }), + ...CloudInstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/fetch/config.ts b/packages/cli/src/commands/fetch/config.ts index 3e760f3..139d98d 100644 --- a/packages/cli/src/commands/fetch/config.ts +++ b/packages/cli/src/commands/fetch/config.ts @@ -1,7 +1,7 @@ import { Flags } from '@oclif/core'; import { Document } from 'yaml'; -import { fetchCloudConfig } from '../../api/fetch-cloud-config.js'; +import { fetchCloudConfig } from '../../api/cloud/fetch-cloud-config.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; export default class FetchConfig extends CloudInstanceCommand { @@ -9,12 +9,12 @@ export default class FetchConfig extends CloudInstanceCommand { static summary = 'Fetch config from cloud (output as yaml or json).'; static flags = { - ...CloudInstanceCommand.flags, output: Flags.string({ default: 'yaml', description: 'Output format: yaml or json.', options: ['json', 'yaml'] - }) + }), + ...CloudInstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/fetch/status.ts b/packages/cli/src/commands/fetch/status.ts index 2ca5905..088a04c 100644 --- a/packages/cli/src/commands/fetch/status.ts +++ b/packages/cli/src/commands/fetch/status.ts @@ -2,7 +2,11 @@ import { Flags } from '@oclif/core'; import { routes } from '@powersync/management-types'; import { Document } from 'yaml'; -import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; +import { createCloudClient } from '../../clients/CloudClient.js'; +import { createSelfHostedClient } from '../../clients/SelfHostedClient.js'; +import { CloudProject } from '../../command-types/CloudInstanceCommand.js'; +import { SelfHostedProject } from '../../command-types/SelfHostedInstanceCommand.js'; +import { SharedInstanceCommand } from '../../command-types/SharedInstanceCommand.js'; type DiagnosticsResponse = routes.InstanceDiagnosticsResponse; type SyncRulesSection = NonNullable; @@ -109,40 +113,50 @@ function formatDiagnosticsHuman(diagnostics: DiagnosticsResponse): string { return sections.join('\n').trimEnd(); } -// TODO self hosted support -export default class FetchStatus extends CloudInstanceCommand { +export default class FetchStatus extends SharedInstanceCommand { static description = 'Fetches diagnostics (connections, sync rules state, etc.). Routes to Management service (Cloud) or linked instance (self-hosted).'; static summary = 'Fetch diagnostics status for an instance.'; static flags = { - ...CloudInstanceCommand.flags, output: Flags.string({ default: 'human', description: 'Output format: human-readable, json, or yaml.', options: ['human', 'json', 'yaml'] - }) + }), + ...SharedInstanceCommand.flags }; + async getCloudStatus(project: CloudProject): Promise { + const { linked } = project; + const client = await createCloudClient(); + return client.getInstanceDiagnostics({ + app_id: linked.project_id, + org_id: linked.org_id, + id: linked.instance_id + }); + } + + async getSelfHostedStatus(project: SelfHostedProject): Promise { + const { linked } = project; + const client = createSelfHostedClient({ + apiUrl: linked.api_url, + apiKey: linked.api_key + }); + return client.diagnostics({}); + } + async run(): Promise { const { flags } = await this.parse(FetchStatus); - const { linked } = this.loadProject(flags, { + const project = this.loadProject(flags, { configFileRequired: false, linkingIsRequired: true }); - const client = await this.getClient(); - - const diagnostics = await client - .getInstanceDiagnostics({ - app_id: linked.project_id, - org_id: linked.org_id, - id: linked.instance_id - }) - .catch((error) => { - this.error(`Failed to fetch diagnostics for instance ${linked.instance_id}: ${error}`, { exit: 1 }); - }); + const diagnostics = await (project.linked.type === 'cloud' + ? this.getCloudStatus(project as CloudProject) + : this.getSelfHostedStatus(project as SelfHostedProject)); if (flags.output === 'json') { this.log(JSON.stringify(diagnostics, null, 2)); diff --git a/packages/cli/src/commands/generate/schema.ts b/packages/cli/src/commands/generate/schema.ts index 6f0d5e8..2987a4f 100644 --- a/packages/cli/src/commands/generate/schema.ts +++ b/packages/cli/src/commands/generate/schema.ts @@ -1,18 +1,21 @@ import { Flags } from '@oclif/core'; +import { routes } from '@powersync/management-types'; import { schemaGenerators, SqlSyncRules, StaticSchema } from '@powersync/service-sync-rules'; -import { existsSync, readFileSync, writeFileSync } from 'fs'; -import { join } from 'path'; -import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; -import { SYNC_FILENAME } from '../../utils/project-config.js'; +import { writeFileSync } from 'fs'; +import { fetchCloudSyncRulesContent } from '../../api/cloud/fetch-cloud-sync-rules-content.js'; +import { fetchSelfHostedSyncRulesContent } from '../../api/self-hosted/fetch-self-hosted-sync-rules-content.js'; +import { createCloudClient } from '../../clients/CloudClient.js'; +import { createSelfHostedClient } from '../../clients/SelfHostedClient.js'; +import { CloudProject } from '../../command-types/CloudInstanceCommand.js'; +import { SelfHostedProject } from '../../command-types/SelfHostedInstanceCommand.js'; +import { SharedInstanceCommand } from '../../command-types/SharedInstanceCommand.js'; -// TODO: Add support for self-hosted instances. -export default class GenerateSchema extends CloudInstanceCommand { +export default class GenerateSchema extends SharedInstanceCommand { static description = 'Generates client-side schema from instance schema and sync rules. Supported for Cloud and self-hosted.'; static summary = 'Create client-side schemas.'; static flags = { - ...CloudInstanceCommand.flags, output: Flags.string({ default: 'type', description: 'Output type: ' + Object.keys(schemaGenerators).join(', '), @@ -22,38 +25,37 @@ export default class GenerateSchema extends CloudInstanceCommand { 'output-path': Flags.string({ description: 'Path to output the schema file.', required: true - }) + }), + ...SharedInstanceCommand.flags }; + async getCloudSchema(project: CloudProject): Promise { + const { linked } = project; + const client = await createCloudClient(); + return client.getInstanceSchema({ + app_id: linked.project_id, + id: linked.instance_id, + org_id: linked.org_id + }); + } + + async getSelfHostedSchema(project: SelfHostedProject): Promise { + const { linked } = project; + const client = createSelfHostedClient({ + apiKey: linked.api_key, + apiUrl: linked.api_url + }); + return client.getSchema({}); + } + async run(): Promise { const { flags } = await this.parse(GenerateSchema); - const { projectDirectory, linked } = this.loadProject(flags, { + const project = this.loadProject(flags, { configFileRequired: false, linkingIsRequired: true }); - const client = await this.getClient(); - - const instanceConfig = await client.getInstanceConfig({ - app_id: linked.project_id, - org_id: linked.org_id, - id: linked.instance_id - }); - - const databaseSchema = await client - .getInstanceSchema({ - app_id: linked.project_id, - org_id: linked.org_id, - id: linked.instance_id - }) - .catch((error) => { - this.error( - `Failed to get database schema for instance ${linked.instance_id} in project ${linked.project_id} in org ${linked.org_id}: ${error}`, - { exit: 1 } - ); - }); - const schemaGenerator = schemaGenerators[flags.output as keyof typeof schemaGenerators]; if (!schemaGenerator) { this.error(`Invalid output type: ${flags.output}. Supported types: ${Object.keys(schemaGenerators).join(', ')}`, { @@ -61,17 +63,13 @@ export default class GenerateSchema extends CloudInstanceCommand { }); } - const syncRulesPath = join(projectDirectory, SYNC_FILENAME); - const syncRulesContent = existsSync(syncRulesPath) - ? readFileSync(syncRulesPath, 'utf8') - : instanceConfig.sync_rules; + const databaseSchema = await (project.linked.type === 'cloud' + ? this.getCloudSchema(project as CloudProject) + : this.getSelfHostedSchema(project as SelfHostedProject)); - if (!syncRulesContent) { - this.error( - `No sync rules found. Either create a sync.yaml file in the project directory or deploy sync rules to the instance first.`, - { exit: 1 } - ); - } + const syncRulesContent = await (project.linked.type === 'cloud' + ? fetchCloudSyncRulesContent(project as CloudProject) + : fetchSelfHostedSyncRulesContent(project as SelfHostedProject)); const staticSchema = new StaticSchema(databaseSchema.connections); const schema = schemaGenerator.generate( diff --git a/packages/cli/src/commands/generate/token.ts b/packages/cli/src/commands/generate/token.ts index b6df542..7d79718 100644 --- a/packages/cli/src/commands/generate/token.ts +++ b/packages/cli/src/commands/generate/token.ts @@ -7,7 +7,6 @@ export default class GenerateToken extends CloudInstanceCommand { static summary = 'Create a client token for the PowerSync service.'; static flags = { - ...CloudInstanceCommand.flags, subject: Flags.string({ description: 'Subject of the token.', required: true @@ -16,7 +15,8 @@ export default class GenerateToken extends CloudInstanceCommand { description: 'Expiration time in seconds. Default is 43,200 (12 hours).', required: false, default: 43_200 - }) + }), + ...CloudInstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index c18c0f6..7562820 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -15,12 +15,12 @@ export default class Init extends PowerSyncCommand { static description = 'Creates a new PowerSync project in the current directory. Supports --type=cloud or self-hosted.'; static flags = { - ...InstanceCommand.flags, type: Flags.string({ default: 'cloud', description: 'Type of PowerSync instance to scaffold.', options: ['cloud', 'self-hosted'] - }) + }), + ...InstanceCommand.flags }; static summary = 'Create a new PowerSync project.'; diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index 3dd13f9..196ac6d 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -2,6 +2,7 @@ import { Flags } from '@oclif/core'; import { writeCloudLink } from '../../api/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; +import { InstanceCommand } from '../../command-types/InstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; import { LINK_FILENAME } from '../../utils/project-config.js'; @@ -9,7 +10,6 @@ export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; static flags = { - ...CloudInstanceCommand.flags, /** * TODO, we could default some of these to the values used after login */ @@ -24,7 +24,8 @@ export default class LinkCloud extends CloudInstanceCommand { 'project-id': Flags.string({ description: 'Project ID.', required: true - }) + }), + ...InstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index 1c1514f..ecdc4ea 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -2,6 +2,7 @@ import { Flags } from '@oclif/core'; import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; +import { InstanceCommand } from '../../command-types/InstanceCommand.js'; import { SelfHostedInstanceCommand } from '../../command-types/SelfHostedInstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; @@ -10,20 +11,20 @@ export default class LinkSelfHosted extends SelfHostedInstanceCommand { static description = 'Link this directory to a self-hosted PowerSync instance.'; static summary = 'Link to self-hosted PowerSync (API URL and token).'; static flags = { - ...SelfHostedInstanceCommand.flags, - url: Flags.string({ + 'api-url': Flags.string({ description: 'Self-hosted PowerSync API base URL (e.g. https://powersync.example.com).', required: true }), 'api-key': Flags.string({ description: 'API key / token for the self-hosted instance.', default: '!env POWERSYNC_API_KEY' - }) + }), + ...InstanceCommand.flags }; async run(): Promise { const { flags } = await this.parse(LinkSelfHosted); - const { directory, url, 'api-key': apiKey } = flags; + const { directory, 'api-url': apiUrl, 'api-key': apiKey } = flags; const projectDir = this.ensureProjectDirExists(flags); ensureServiceTypeMatches({ @@ -37,7 +38,7 @@ export default class LinkSelfHosted extends SelfHostedInstanceCommand { const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); doc.set('type', 'self-hosted'); - doc.set('api_url', url); + doc.set('api_url', apiUrl); doc.set('api_key', apiKey); writeFileSync(linkPath, doc.toString(), 'utf8'); this.log(`Updated ${directory}/${LINK_FILENAME} with self-hosted link.`); diff --git a/packages/cli/src/commands/pull/config.ts b/packages/cli/src/commands/pull/config.ts index 12231ec..ca0897c 100644 --- a/packages/cli/src/commands/pull/config.ts +++ b/packages/cli/src/commands/pull/config.ts @@ -1,11 +1,10 @@ -import { Flags } from '@oclif/core'; import { CLICloudConfig } from '@powersync/cli-schemas'; import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import * as t from 'ts-codec'; import { Document } from 'yaml'; -import { fetchCloudConfig } from '../../api/fetch-cloud-config.js'; +import { fetchCloudConfig } from '../../api/cloud/fetch-cloud-config.js'; import { writeCloudLink } from '../../api/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; @@ -84,16 +83,7 @@ export default class PullConfig extends CloudInstanceCommand { static summary = 'Pull config from cloud (link first if needed).'; static flags = { - ...CloudInstanceCommand.flags, - 'instance-id': Flags.string({ - description: 'PowerSync Cloud instance ID (required when link.yaml is missing).' - }), - 'org-id': Flags.string({ - description: 'Organization ID (required when link.yaml is missing).' - }), - 'project-id': Flags.string({ - description: 'Project ID (required when link.yaml is missing).' - }) + ...CloudInstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/stop.ts b/packages/cli/src/commands/stop.ts index d3c80e0..1e33385 100644 --- a/packages/cli/src/commands/stop.ts +++ b/packages/cli/src/commands/stop.ts @@ -8,11 +8,11 @@ export default class Stop extends CloudInstanceCommand { static summary = 'Stop a PowerSync instance.'; static flags = { - ...CloudInstanceCommand.flags, confirm: Flags.string({ description: 'Set to "yes" to confirm stopping the instance.', options: ['yes'] - }) + }), + ...CloudInstanceCommand.flags }; async run(): Promise { diff --git a/packages/cli/src/commands/validate.ts b/packages/cli/src/commands/validate.ts index c176f72..db5c40c 100644 --- a/packages/cli/src/commands/validate.ts +++ b/packages/cli/src/commands/validate.ts @@ -1,10 +1,10 @@ -import {Command} from '@oclif/core' +import { Command } from '@oclif/core'; export default class Validate extends Command { - static description = 'Validates configuration. Supported for both Cloud and self-hosted.' - static summary = 'Validate configuration (sync rules, connection, etc.).' + static description = 'Validates configuration. Supported for both Cloud and self-hosted.'; + static summary = 'Validate configuration (sync rules, connection, etc.).'; async run(): Promise { - this.log('validate: not yet implemented') + this.log('validate: not yet implemented'); } } diff --git a/packages/cli/src/utils/env.ts b/packages/cli/src/utils/env.ts index 29dfaec..1be1489 100644 --- a/packages/cli/src/utils/env.ts +++ b/packages/cli/src/utils/env.ts @@ -5,16 +5,15 @@ export type ENV = { PS_TOKEN?: string; /** - * Environment variables for manually providing the instance ID, org ID, and project ID. - * This can be useful for quickly performing an operation on a specific instance. - * The order of precedence is: - * 1. Flags passed to the command - * 2. Link.yaml file - * 3. Environment variables + * Environment variables for manually providing the instance ID, org ID, and project ID (cloud). + * Or API URL for self-hosted. + * Order of precedence: flags → link.yaml → environment variables. */ INSTANCE_ID?: string; ORG_ID?: string; PROJECT_ID?: string; + /** [Self-hosted] PowerSync API URL. */ + API_URL?: string; }; export const env: ENV = { @@ -22,5 +21,6 @@ export const env: ENV = { PS_TOKEN: process.env.PS_TOKEN, INSTANCE_ID: process.env.INSTANCE_ID, ORG_ID: process.env.ORG_ID, - PROJECT_ID: process.env.PROJECT_ID + PROJECT_ID: process.env.PROJECT_ID, + API_URL: process.env.API_URL }; diff --git a/packages/schemas/src/LinkConfig.ts b/packages/schemas/src/LinkConfig.ts index 8116bca..c6a0a0d 100644 --- a/packages/schemas/src/LinkConfig.ts +++ b/packages/schemas/src/LinkConfig.ts @@ -7,6 +7,8 @@ export const CloudLinkConfig = t.object({ project_id: t.string.optional() }); +export type CloudLinkConfig = t.Encoded; + export const RequiredCloudLinkConfig = t.object({ type: t.literal('cloud'), instance_id: t.string, @@ -22,6 +24,8 @@ export const SelfHostedLinkConfig = t.object({ api_key: t.string.optional() }); +export type SelfHostedLinkConfig = t.Encoded; + export const RequiredSelfHostedLinkConfig = t.object({ type: t.literal('self-hosted'), api_url: t.string, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d98dd91..426476b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ importers: '@powersync/service-sync-rules': specifier: ^0.30.0 version: 0.30.0 + '@powersync/service-types': + specifier: ^0.13.3 + version: 0.13.3 keychain: specifier: ^1.5.0 version: 1.5.0 From 14d3e518eacce90314ff709ccb27c679cec9b4c1 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 12:00:13 +0200 Subject: [PATCH 013/141] Help groups for CLI command flags. Unify linking resolve patterns. Update self hosted schemas. --- packages/cli/package.json | 3 +- .../cli/src/api/cloud/write-cloud-link.ts | 2 +- .../src/command-types/CloudInstanceCommand.ts | 54 +- packages/cli/src/command-types/HelpGroup.ts | 20 + .../cli/src/command-types/InstanceCommand.ts | 4 +- .../SelfHostedInstanceCommand.ts | 89 +- .../command-types/SharedInstanceCommand.ts | 55 +- packages/cli/src/commands/generate/schema.ts | 2 +- packages/cli/src/commands/generate/token.ts | 94 +- packages/cli/src/commands/link/cloud.ts | 10 +- packages/cli/src/commands/pull/config.ts | 2 +- packages/cli/src/syncpoint-wkx.d.ts | 18 + packages/cli/src/utils/env.ts | 6 +- .../self-hosted/base/powersync/service.yaml | 2 - packages/cli/tsconfig.json | 5 +- packages/schemas/package.json | 1 + packages/schemas/src/CLIConfig.ts | 4 +- pnpm-lock.yaml | 1305 +++++++++++++---- 18 files changed, 1330 insertions(+), 346 deletions(-) create mode 100644 packages/cli/src/command-types/HelpGroup.ts create mode 100644 packages/cli/src/syncpoint-wkx.d.ts diff --git a/packages/cli/package.json b/packages/cli/package.json index 20ea623..5a55763 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -18,6 +18,7 @@ "@powersync/service-client": "0.0.1", "@powersync/service-sync-rules": "^0.30.0", "@powersync/service-types": "^0.13.3", + "jose": "^6.1.3", "keychain": "^1.5.0", "ora": "^9.0.0", "ts-codec": "^1.3.0", @@ -28,7 +29,7 @@ "@oclif/prettier-config": "^0.2.1", "@oclif/test": "^4", "@types/keychain": "^1.4.4", - "@types/node": "^18", + "@types/node": "^24", "eslint": "^9", "eslint-config-oclif": "^6", "eslint-config-prettier": "^10", diff --git a/packages/cli/src/api/cloud/write-cloud-link.ts b/packages/cli/src/api/cloud/write-cloud-link.ts index bd66fe9..6bb4781 100644 --- a/packages/cli/src/api/cloud/write-cloud-link.ts +++ b/packages/cli/src/api/cloud/write-cloud-link.ts @@ -1,7 +1,7 @@ import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -import { LINK_FILENAME, loadLinkDocument } from '../utils/project-config.js'; +import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; export type WriteCloudLinkOptions = { instanceId: string; diff --git a/packages/cli/src/command-types/CloudInstanceCommand.ts b/packages/cli/src/command-types/CloudInstanceCommand.ts index 005589c..7760dcd 100644 --- a/packages/cli/src/command-types/CloudInstanceCommand.ts +++ b/packages/cli/src/command-types/CloudInstanceCommand.ts @@ -13,6 +13,7 @@ import { SERVICE_FILENAME, SYNC_FILENAME } from '../utils/project-config.js'; +import { HelpGroup } from './HelpGroup.js'; import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; export type CloudProject = { @@ -29,29 +30,42 @@ export type CloudInstanceCommandFlags = Interfaces.InferredFlags< typeof CloudInstanceCommand.flags & typeof CloudInstanceCommand.baseFlags >; -/** Base command for operations that require a Cloud-type PowerSync project (service.yaml _type: cloud). */ +/** + * Base command for operations that require a Cloud-type PowerSync project (service.yaml _type: cloud). + * + * Instance context (instance_id, org_id, project_id) is resolved in this order: + * 1. Command-line flags (--instance-id, --org-id, --project-id) + * 2. Environment variables (INSTANCE_ID, ORG_ID, PROJECT_ID) + * 3. Linked config from link.yaml + * + * @example + * # Use linked project (link.yaml) + * pnpm exec powersync some-cloud-cmd + * # Override with env + * INSTANCE_ID=... ORG_ID=... PROJECT_ID=... pnpm exec powersync some-cloud-cmd + * # Override with flags + * pnpm exec powersync some-cloud-cmd --instance-id=... --org-id=... --project-id=... + */ export abstract class CloudInstanceCommand extends InstanceCommand { static flags = { /** - * All Cloud instance Commands support manually providing the instance ID, org ID, and project ID. - * This can be useful for quickly performing an operation on a specific instance. - * The order of precedence is: - * 1. Flags passed to the command (explicitly provided) - * 2. Link.yaml file (due to the current context) - * 3. Environment variables (used if none of the above are provided) + * Instance ID, org ID, and project ID are resolved in order: flags → env (INSTANCE_ID, ORG_ID, PROJECT_ID) → link.yaml. */ ...InstanceCommand.flags, 'instance-id': Flags.string({ description: 'PowerSync Cloud instance ID. Manually passed if the current context has not been linked.', - required: false + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT }), 'org-id': Flags.string({ description: 'Organization ID. Manually passed if the current context has not been linked.', - required: false + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT }), 'project-id': Flags.string({ description: 'Project ID. Manually passed if the current context has not been linked.', - required: false + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT }) }; @@ -95,16 +109,6 @@ export abstract class CloudInstanceCommand extends InstanceCommand { ); } } - } else if (existsSync(linkPath)) { - try { - const linkPath = join(projectDir, LINK_FILENAME); - const doc = loadLinkDocument(linkPath); - linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); - } catch (error) { - if (options?.linkingIsRequired) { - this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); - } - } } else if (env.INSTANCE_ID) { try { linked = RequiredCloudLinkConfig.decode({ @@ -118,6 +122,16 @@ export abstract class CloudInstanceCommand extends InstanceCommand { this.error(`Failed to parse environment variables as CloudLinkConfig: ${error}`, { exit: 1 }); } } + } else if (existsSync(linkPath)) { + try { + const linkPath = join(projectDir, LINK_FILENAME); + const doc = loadLinkDocument(linkPath); + linked = RequiredCloudLinkConfig.decode(doc.contents?.toJSON()); + } catch (error) { + if (options?.linkingIsRequired) { + this.error(`Failed to parse ${LINK_FILENAME} as CloudLinkConfig: ${error}`, { exit: 1 }); + } + } } if (!linked && options?.linkingIsRequired) { diff --git a/packages/cli/src/command-types/HelpGroup.ts b/packages/cli/src/command-types/HelpGroup.ts new file mode 100644 index 0000000..5ef5074 --- /dev/null +++ b/packages/cli/src/command-types/HelpGroup.ts @@ -0,0 +1,20 @@ +/** + * Groups for command flag inheritance. + * https://oclif.io/docs/flag_inheritance/ + */ +export enum HelpGroup { + /** + * Flags which are relevant to the project being operated on. + */ + PROJECT = 'PROJECT', + + /** + * Flags which are relevant to the cloud project being operated on. + */ + CLOUD_PROJECT = 'CLOUD_PROJECT', + + /** + * Flags which are relevant to the self-hosted project being operated on. + */ + SELF_HOSTED_PROJECT = 'SELF_HOSTED_PROJECT' +} diff --git a/packages/cli/src/command-types/InstanceCommand.ts b/packages/cli/src/command-types/InstanceCommand.ts index 0e58474..e5ef385 100644 --- a/packages/cli/src/command-types/InstanceCommand.ts +++ b/packages/cli/src/command-types/InstanceCommand.ts @@ -1,5 +1,6 @@ import { Flags } from '@oclif/core'; import { existsSync } from 'node:fs'; +import { HelpGroup } from './HelpGroup.js'; import { PowerSyncCommand } from './PowerSyncCommand.js'; export type EnsureConfigOptions = { @@ -21,7 +22,8 @@ export abstract class InstanceCommand extends PowerSyncCommand { ...PowerSyncCommand.flags, directory: Flags.string({ default: 'powersync', - description: 'Directory containing PowerSync config (default: powersync).' + description: 'Directory containing PowerSync config (default: powersync).', + helpGroup: HelpGroup.PROJECT }) }; diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts index 26d326e..3844441 100644 --- a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -1,8 +1,11 @@ -import { Flags } from '@oclif/core'; +import { Flags, Interfaces } from '@oclif/core'; import { CLISelfHostedConfig, RequiredSelfHostedLinkConfig } from '@powersync/cli-schemas'; +import { existsSync } from 'node:fs'; import { join } from 'node:path'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; +import { env } from '../utils/env.js'; import { LINK_FILENAME, loadLinkDocument, loadServiceDocument, SERVICE_FILENAME } from '../utils/project-config.js'; +import { HelpGroup } from './HelpGroup.js'; import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; export type SelfHostedProject = { @@ -10,26 +13,42 @@ export type SelfHostedProject = { linked: RequiredSelfHostedLinkConfig; }; -/** Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). */ +export type SelfHostedInstanceCommandFlags = Interfaces.InferredFlags< + typeof SelfHostedInstanceCommand.flags & typeof SelfHostedInstanceCommand.baseFlags +>; + +/** + * Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). + * + * Instance context (api_url, api_key) is resolved in this order: + * 1. Command-line flags (--api-url, --api-key) + * 2. Environment variables (API_URL, PS_TOKEN) + * 3. Linked config from link.yaml + * + * @example + * # Use linked project (link.yaml) + * pnpm exec powersync some-self-hosted-cmd + * # Override with env + * API_URL=... PS_TOKEN=... pnpm exec powersync some-self-hosted-cmd + * # Override with flags + * pnpm exec powersync some-self-hosted-cmd --api-url=https://... --api-key=... + */ export abstract class SelfHostedInstanceCommand extends InstanceCommand { static flags = { ...InstanceCommand.flags, - /** - * All SelfHosted instance Commands support manually providing the API URL. - * This can be useful for quickly performing an operation on a specific instance. - * The order of precedence is: - * 1. Flags passed to the command (explicitly provided) - * 2. Link.yaml file (due to the current context) - * 3. Environment variables (used if none of the above are provided) - */ - ...InstanceCommand.flags, 'api-url': Flags.string({ - description: 'PowerSync API URL. When set, context is treated as self-hosted (exclusive with --instance-id).', - required: false + description: 'PowerSync API URL. Resolved: flag → API_URL → link.yaml.', + required: false, + helpGroup: HelpGroup.SELF_HOSTED_PROJECT + }), + 'api-key': Flags.string({ + description: 'PowerSync API key (self-hosted). Resolved: flag → PS_TOKEN → link.yaml.', + required: false, + helpGroup: HelpGroup.SELF_HOSTED_PROJECT }) }; - loadProject(flags: { directory: string }, options?: EnsureConfigOptions): SelfHostedProject { + loadProject(flags: SelfHostedInstanceCommandFlags, options?: EnsureConfigOptions): SelfHostedProject { const projectDir = this.ensureProjectDirExists(flags); ensureServiceTypeMatches({ @@ -41,17 +60,49 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { }); const linkPath = join(projectDir, LINK_FILENAME); - const doc = loadLinkDocument(linkPath); - let linked: RequiredSelfHostedLinkConfig; + let rawLink: Record | null = null; + if (existsSync(linkPath)) { + try { + const doc = loadLinkDocument(linkPath); + rawLink = doc.contents?.toJSON() as Record; + } catch { + rawLink = null; + } + } + + // Resolved per field: flags → env → link file + const api_url = flags['api-url'] ?? env.API_URL ?? (rawLink?.api_url as string | undefined); + const api_key = flags['api-key'] ?? env.PS_TOKEN ?? (rawLink?.api_key as string | undefined); + + let linked: RequiredSelfHostedLinkConfig | null = null; try { - linked = RequiredSelfHostedLinkConfig.decode(doc.contents?.toJSON()); + linked = RequiredSelfHostedLinkConfig.decode({ + type: 'self-hosted', + api_url: api_url!, + api_key: api_key! + }); } catch (error) { - this.error(`Failed to parse ${LINK_FILENAME} as SelfHostedLinkConfig: ${error}`, { exit: 1 }); + if (options?.linkingIsRequired) { + this.error( + `Linking is required before using this command. Provide --api-url and --api-key, set API_URL and PS_TOKEN, or link the project first. ${error}`, + { exit: 1 } + ); + } + } + + if (!linked && options?.linkingIsRequired) { + this.error( + [ + 'Linking is required before using this command.', + 'Provide --api-url and --api-key, set API_URL and PS_TOKEN, or link the project first.' + ].join('\n'), + { exit: 1 } + ); } return { projectDirectory: projectDir, - linked + linked: linked! }; } diff --git a/packages/cli/src/command-types/SharedInstanceCommand.ts b/packages/cli/src/command-types/SharedInstanceCommand.ts index 1116003..8d9d034 100644 --- a/packages/cli/src/command-types/SharedInstanceCommand.ts +++ b/packages/cli/src/command-types/SharedInstanceCommand.ts @@ -20,6 +20,7 @@ import { SYNC_FILENAME } from '../utils/project-config.js'; import { CloudProject } from './CloudInstanceCommand.js'; +import { HelpGroup } from './HelpGroup.js'; import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; import { SelfHostedProject } from './SelfHostedInstanceCommand.js'; @@ -27,38 +28,64 @@ export type SharedInstanceCommandFlags = Interfaces.InferredFlags< typeof SharedInstanceCommand.flags & typeof SharedInstanceCommand.baseFlags >; +/** + * Base command for operations that work with either a Cloud or self-hosted PowerSync instance. + * + * Resolution order: + * + * 1. **Context (cloud vs self-hosted)** — Cannot mix both. + * - Cloud: if any of --instance-id, INSTANCE_ID, --org-id, --project-id are set. + * - Self-hosted: if --api-url or API_URL is set. + * - If neither set: type is taken from link.yaml (if present). + * + * 2. **Per-field values** (instance_id, org_id, project_id for cloud; api_url, api_key for self-hosted): + * - Flags (e.g. --instance-id, --api-url) → environment variables (INSTANCE_ID, API_URL, etc.) → link.yaml. + * + * @example + * # Use linked project (link.yaml determines cloud vs self-hosted) + * pnpm exec powersync some-shared-cmd + * # Force cloud with env + * INSTANCE_ID=... ORG_ID=... PROJECT_ID=... pnpm exec powersync some-shared-cmd + * # Force self-hosted with flag + * pnpm exec powersync some-shared-cmd --api-url=https://... + * # Force cloud with flags + * pnpm exec powersync some-shared-cmd --instance-id=... --org-id=... --project-id=... + */ export abstract class SharedInstanceCommand extends InstanceCommand { static flags = { - ...InstanceCommand.flags, 'api-url': Flags.string({ description: - '[Self-hosted] PowerSync API URL. When set, context is treated as self-hosted (exclusive with --instance-id).', - required: false + '[Self-hosted] PowerSync API URL. When set, context is treated as self-hosted (exclusive with --instance-id). Resolved: flag → API_URL → link.yaml.', + required: false, + helpGroup: HelpGroup.SELF_HOSTED_PROJECT }), 'instance-id': Flags.string({ description: - '[Cloud] PowerSync Cloud instance ID (BSON ObjectID). When set, context is treated as cloud (exclusive with --api-url).', - required: false + '[Cloud] PowerSync Cloud instance ID (BSON ObjectID). When set, context is treated as cloud (exclusive with --api-url). Resolved: flag → INSTANCE_ID → link.yaml.', + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT }), 'org-id': Flags.string({ - description: '[Cloud] Organization ID. Manually passed if the current context has not been linked.', - required: false + description: '[Cloud] Organization ID. Resolved: flag → ORG_ID → link.yaml.', + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT }), 'project-id': Flags.string({ - description: '[Cloud] Project ID. Manually passed if the current context has not been linked.', - required: false - }) + description: '[Cloud] Project ID. Resolved: flag → PROJECT_ID → link.yaml.', + required: false, + helpGroup: HelpGroup.CLOUD_PROJECT + }), + ...InstanceCommand.flags }; loadProject(flags: SharedInstanceCommandFlags, options?: EnsureConfigOptions): CloudProject | SelfHostedProject { const projectDir = this.ensureProjectDirExists(flags); const linkPath = join(projectDir, LINK_FILENAME); - // Start to attempt to detect cloud or self-hosted inputs + // 1) Context type: from flags/env first, then link file (see class JSDoc for resolution order). const hasCloudInstanceInputs = flags['instance-id'] || env.INSTANCE_ID || flags['org-id'] || flags['project-id']; const hasSelfHostedInputs = flags['api-url'] || env.API_URL; - // There can be only one if (hasCloudInstanceInputs && hasSelfHostedInputs) { this.error(['Cannot use both cloud and self-hosted inputs. Use one or the other.'].join('\n'), { exit: 1 }); } @@ -69,7 +96,7 @@ export abstract class SharedInstanceCommand extends InstanceCommand { ? 'cloud' : null; - // Try and set the type from the link file (if it exists) + // If type not set by flags/env, use link file type (if present). let rawLinkConfig: LinkConfig | null = null; // check if the link file exists if (existsSync(linkPath)) { @@ -92,7 +119,7 @@ export abstract class SharedInstanceCommand extends InstanceCommand { this.error(linkMissingErrorMessage, { exit: 1 }); } - // Resolve the link config from the flags and the link file + // 2) Per-field: flags → env → link file (see class JSDoc). let linkConfig: RequiredCloudLinkConfig | RequiredSelfHostedLinkConfig | null = null; if (projectType === 'self-hosted') { const _rawSelfHostedLinkConfig = (rawLinkConfig as SelfHostedLinkConfig) ?? { type: 'self-hosted' }; diff --git a/packages/cli/src/commands/generate/schema.ts b/packages/cli/src/commands/generate/schema.ts index 2987a4f..620c78b 100644 --- a/packages/cli/src/commands/generate/schema.ts +++ b/packages/cli/src/commands/generate/schema.ts @@ -81,6 +81,6 @@ export default class GenerateSchema extends SharedInstanceCommand { ); writeFileSync(flags['output-path'], schema, 'utf8'); - this.log(`Generated schema written to ${flags.outputPath}`); + this.log(`Generated schema written to ${flags['output-path']}`); } } diff --git a/packages/cli/src/commands/generate/token.ts b/packages/cli/src/commands/generate/token.ts index 7d79718..7855783 100644 --- a/packages/cli/src/commands/generate/token.ts +++ b/packages/cli/src/commands/generate/token.ts @@ -1,7 +1,17 @@ import { Flags } from '@oclif/core'; -import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; +import * as jose from 'jose'; +import { createCloudClient } from '../../clients/CloudClient.js'; +import { CloudProject } from '../../command-types/CloudInstanceCommand.js'; +import { SelfHostedProject } from '../../command-types/SelfHostedInstanceCommand.js'; +import { SharedInstanceCommand } from '../../command-types/SharedInstanceCommand.js'; -export default class GenerateToken extends CloudInstanceCommand { +type TokenConfig = { + subject: string; + expiresInSeconds: number; + kid?: string; +}; + +export default class GenerateToken extends SharedInstanceCommand { static description = 'Generates a development token for connecting clients. Cloud and self-hosted (when shared secret is in config).'; static summary = 'Create a client token for the PowerSync service.'; @@ -16,19 +26,20 @@ export default class GenerateToken extends CloudInstanceCommand { required: false, default: 43_200 }), - ...CloudInstanceCommand.flags + kid: Flags.string({ + description: + '[Self-hosted only] Key ID of the key to use for signing the token. If not provided, the first key will be used.', + required: false + }), + ...SharedInstanceCommand.flags }; - async run(): Promise { - const { flags } = await this.parse(GenerateToken); - const { linked } = this.loadProject(flags, { - configFileRequired: false, - linkingIsRequired: true - }); - const client = await this.getClient(); + protected async generateCloudToken(project: CloudProject, config: TokenConfig): Promise { + const { linked } = project; + const client = await createCloudClient(); // Get the config in order to check if development tokens are enabled. - const config = await client + const cloudInstanceConfig = await client .getInstanceConfig({ app_id: linked.project_id, org_id: linked.org_id, @@ -41,7 +52,7 @@ export default class GenerateToken extends CloudInstanceCommand { ); }); - if (!config?.config?.client_auth?.allow_temporary_tokens) { + if (!cloudInstanceConfig?.config?.client_auth?.allow_temporary_tokens) { this.error( [ 'Development tokens are not enabled for this instance.', @@ -60,11 +71,62 @@ export default class GenerateToken extends CloudInstanceCommand { app_id: linked.project_id, org_id: linked.org_id, id: linked.instance_id, - subject: flags.subject, - expiresInSeconds: flags['expires-in-seconds'] + subject: config.subject, + expiresInSeconds: config.expiresInSeconds }); + return response.token; + } + + protected async generateSelfHostedToken(project: SelfHostedProject, config: TokenConfig): Promise { + // For self hosted we can check if there is a shared secret in the config file and then manually create a token with JOSE + const instanceConfig = this.parseSelfHostedConfig(project.projectDirectory); + const usableKeys = instanceConfig.client_auth?.jwks?.keys?.filter((key) => key.alg === 'HS256') ?? []; + if (!usableKeys.length) { + this.error('No usable keys found in the config file. Please add a shared secret to the config file.', { + exit: 1 + }); + } + const specificKey = usableKeys.find((key) => key.kid === config.kid); + if (config.kid && !specificKey) { + this.error('No key found with the given kid.', { exit: 1 }); + } + + const key = (config.kid ? specificKey : usableKeys[0])!; + + const endpoint = project.linked.api_url; + const audiences = [endpoint]; + instanceConfig.client_auth?.audience?.forEach((audience) => audiences.push(audience)); + + const token = await new jose.SignJWT({}) + .setProtectedHeader({ alg: key.alg!, kid: key.kid }) + .setSubject(config.subject) + .setAudience(audiences) + .setIssuer('powersync-cli') + .setIssuedAt() + .setExpirationTime(`${config.expiresInSeconds}s`) + .sign(key); + return token; + } + + async run(): Promise { + const { flags } = await this.parse(GenerateToken); + const project = this.loadProject(flags, { + configFileRequired: false, + linkingIsRequired: true + }); + + const token = await (project.linked.type === 'cloud' + ? this.generateCloudToken(project as CloudProject, { + subject: flags.subject, + expiresInSeconds: flags['expires-in-seconds'] + }) + : this.generateSelfHostedToken(project as SelfHostedProject, { + subject: flags.subject, + expiresInSeconds: flags['expires-in-seconds'], + kid: flags['kid'] + })); - // The output of this is purposefully simple in order for the output to be easily used in shell scripts. - this.log(response.token); + // This is purposefully simple in order for the output to be easily used in shell scripts. + this.log(token); } } diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index 196ac6d..6d1e62a 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -1,28 +1,30 @@ import { Flags } from '@oclif/core'; -import { writeCloudLink } from '../../api/write-cloud-link.js'; +import { writeCloudLink } from '../../api/cloud/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { InstanceCommand } from '../../command-types/InstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; +import { env } from '../../utils/env.js'; import { LINK_FILENAME } from '../../utils/project-config.js'; export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; static flags = { - /** - * TODO, we could default some of these to the values used after login - */ + // These are required for the linking command 'instance-id': Flags.string({ description: 'PowerSync Cloud instance ID.', + default: env.INSTANCE_ID, required: true }), 'org-id': Flags.string({ description: 'Organization ID.', + default: env.ORG_ID, required: true }), 'project-id': Flags.string({ description: 'Project ID.', + default: env.PROJECT_ID, required: true }), ...InstanceCommand.flags diff --git a/packages/cli/src/commands/pull/config.ts b/packages/cli/src/commands/pull/config.ts index ca0897c..6629d72 100644 --- a/packages/cli/src/commands/pull/config.ts +++ b/packages/cli/src/commands/pull/config.ts @@ -5,7 +5,7 @@ import * as t from 'ts-codec'; import { Document } from 'yaml'; import { fetchCloudConfig } from '../../api/cloud/fetch-cloud-config.js'; -import { writeCloudLink } from '../../api/write-cloud-link.js'; +import { writeCloudLink } from '../../api/cloud/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { ensureServiceTypeMatches } from '../../utils/ensureServiceType.js'; import { diff --git a/packages/cli/src/syncpoint-wkx.d.ts b/packages/cli/src/syncpoint-wkx.d.ts new file mode 100644 index 0000000..fc223a8 --- /dev/null +++ b/packages/cli/src/syncpoint-wkx.d.ts @@ -0,0 +1,18 @@ +// Required for the @powersync/service-sync-rules package +declare module '@syncpoint/wkx' { + export class Geometry { + static parse(blob: unknown): Geometry | null; + toGeoJSON(): unknown; + toWkt(): string; + } + + export class Point extends Geometry { + x: number; + y: number; + } + + export namespace wkx { + export { Geometry, Point }; + } + export default wkx; +} diff --git a/packages/cli/src/utils/env.ts b/packages/cli/src/utils/env.ts index 1be1489..38d5b3a 100644 --- a/packages/cli/src/utils/env.ts +++ b/packages/cli/src/utils/env.ts @@ -5,9 +5,9 @@ export type ENV = { PS_TOKEN?: string; /** - * Environment variables for manually providing the instance ID, org ID, and project ID (cloud). - * Or API URL for self-hosted. - * Order of precedence: flags → link.yaml → environment variables. + * Environment variables for manually providing the instance ID, org ID, and project ID (cloud), + * or API URL for self-hosted (SharedInstanceCommand only). + * Order of precedence in commands: flags → environment variables → link file (link.yaml). */ INSTANCE_ID?: string; ORG_ID?: string; diff --git a/packages/cli/templates/self-hosted/base/powersync/service.yaml b/packages/cli/templates/self-hosted/base/powersync/service.yaml index 1a387a5..9b85528 100644 --- a/packages/cli/templates/self-hosted/base/powersync/service.yaml +++ b/packages/cli/templates/self-hosted/base/powersync/service.yaml @@ -93,8 +93,6 @@ telemetry: # username: string # password: !env PS_MONGO_PASSWORD # reject_ip_ranges: [] -# Maximum number of connections to the storage database, per process. Defaults to 8. -# max_pool_size: 8 # ----------------------------------------------------------------------------- # PostgreSQL storage – uncomment this block and comment out the MongoDB storage block above to use PostgreSQL diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index defcf63..70f5252 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -7,7 +7,10 @@ "strict": true, "target": "es2022", "moduleResolution": "node16", - "composite": true + "composite": true, + "paths": { + "@syncpoint/wkx": ["./src/syncpoint-wkx.d.ts"] + } }, "skipLibCheck": true, "include": ["./src/**/*"], diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 1204a0b..6f0af33 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -16,6 +16,7 @@ "dependencies": { "ts-codec": "^1.3.0", "@powersync/service-types": "^0.13.3", + "@powersync/service-schema": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz", "@powersync/management-types": "file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types" }, "devDependencies": { diff --git a/packages/schemas/src/CLIConfig.ts b/packages/schemas/src/CLIConfig.ts index 221fcb4..b56ab4c 100644 --- a/packages/schemas/src/CLIConfig.ts +++ b/packages/schemas/src/CLIConfig.ts @@ -1,5 +1,5 @@ import { BasePowerSyncHostedConfig } from '@powersync/management-types'; -import { configFile } from '@powersync/service-types'; +import { MergedServiceConfig } from '@powersync/service-schema'; import * as t from 'ts-codec'; export const CLICloudConfig = t @@ -14,7 +14,7 @@ export const CLISelfHostedConfig = t .object({ _type: t.literal('self-hosted') }) - .and(configFile.powerSyncConfig); + .and(MergedServiceConfig); export type CLISelfHostedConfig = t.Encoded; export type CLISelfHostedConfigDecoded = t.Decoded; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 426476b..8400f43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,6 +52,9 @@ importers: '@powersync/service-types': specifier: ^0.13.3 version: 0.13.3 + jose: + specifier: ^6.1.3 + version: 6.1.3 keychain: specifier: ^1.5.0 version: 1.5.0 @@ -78,8 +81,8 @@ importers: specifier: ^1.4.4 version: 1.4.4 '@types/node': - specifier: ^18 - version: 18.19.130 + specifier: ^24 + version: 24.10.10 eslint: specifier: ^9 version: 9.39.2 @@ -91,13 +94,13 @@ importers: version: 10.1.8(eslint@9.39.2) oclif: specifier: ^4 - version: 4.22.73(@types/node@18.19.130) + version: 4.22.73(@types/node@24.10.10) shx: specifier: ^0.3.3 version: 0.3.4 ts-node: specifier: ^10 - version: 10.9.2(@types/node@18.19.130)(typescript@5.9.3) + version: 10.9.2(@types/node@24.10.10)(typescript@5.9.3) tsx: specifier: ^4 version: 4.21.0 @@ -106,13 +109,16 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.0 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) packages/schemas: dependencies: '@powersync/management-types': specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz - version: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0) + version: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)(yaml@2.8.2) + '@powersync/service-schema': + specifier: file:/Users/stevenontong/Documents/platform_code/powersync/service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz + version: file:../service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz '@powersync/service-types': specifier: ^0.13.3 version: 0.13.3 @@ -848,9 +854,126 @@ packages: '@js-sdsl/ordered-set@4.4.2': resolution: {integrity: sha512-ieYQ8WlBPKYzEo81H3q0DFbd8WtFRXXABb4+vRCF0AO3WWtJZFxYvRGdipUXGrd6tlSySmqhcPuO3J6SCodCxg==} + '@mongodb-js/saslprep@1.4.5': + resolution: {integrity: sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw==} + + '@mongodb-js/zstd@2.0.1': + resolution: {integrity: sha512-hbQKltFj0hMrhe+Udh9gjkzswIJJVOo55vEHgfHbb6wjPpo4Oc3kng2bao/XnzLPCdd5Q1PXbWTC91LYPQrCtA==} + engines: {node: '>= 16.20.1'} + + '@napi-rs/snappy-android-arm-eabi@7.3.3': + resolution: {integrity: sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/snappy-android-arm64@7.3.3': + resolution: {integrity: sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/snappy-darwin-arm64@7.3.3': + resolution: {integrity: sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/snappy-darwin-x64@7.3.3': + resolution: {integrity: sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/snappy-freebsd-x64@7.3.3': + resolution: {integrity: sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': + resolution: {integrity: sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/snappy-linux-arm64-gnu@7.3.3': + resolution: {integrity: sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/snappy-linux-arm64-musl@7.3.3': + resolution: {integrity: sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': + resolution: {integrity: sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': + resolution: {integrity: sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/snappy-linux-s390x-gnu@7.3.3': + resolution: {integrity: sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/snappy-linux-x64-gnu@7.3.3': + resolution: {integrity: sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/snappy-linux-x64-musl@7.3.3': + resolution: {integrity: sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/snappy-openharmony-arm64@7.3.3': + resolution: {integrity: sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/snappy-wasm32-wasi@7.3.3': + resolution: {integrity: sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@napi-rs/snappy-win32-arm64-msvc@7.3.3': + resolution: {integrity: sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/snappy-win32-ia32-msvc@7.3.3': + resolution: {integrity: sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/snappy-win32-x64-msvc@7.3.3': + resolution: {integrity: sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nolyfill/is-core-module@1.0.39': resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} @@ -980,9 +1103,18 @@ packages: resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} + '@powersync/lib-service-mongodb@0.6.17': + resolution: {integrity: sha512-3UIjaTlnLVAXhuR/9ExLWsnqAJYT+8i/hvV2N3G78w+F49J2uBteH3fA+pCEUJ/rYptiSgy9u22wpjk9JpDIhg==} + + '@powersync/lib-service-postgres@0.4.19': + resolution: {integrity: sha512-TyteBdKcjRUMewaCMJ8KEOn01Xxe9lTeiOLHo6EK2zs8I15Oiv6qYB2/xCNA77WVgGY/PFdCPcLBz+Uefk08Xw==} + '@powersync/lib-services-framework@0.7.14': resolution: {integrity: sha512-beQyt75NMkiRiZOqcLGuKnCnPzwe59hCO9GjUn8Ox70PQoXncIw/9W7A9OiECQkRnWKuzX5LVarUrMnm6GCh0A==} + '@powersync/lib-services-framework@0.8.0': + resolution: {integrity: sha512-qC56hA5Qc8Y0OWSWK4wSTw58i6pJiDRw6XzP2YPDVTRzs4P37akpKXbe5CyR6E0L3GGe1ITOWLLpysn7ZWDAlQ==} + '@powersync/management-client@file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz': resolution: {integrity: sha512-ZGZPdgIBtclAfALiPDOMUlZB/toRptK/Tpa+sEfnOMiauz59ipVncqyBVTtWJAF0AmKXlz7BW0lBeFuvIgceIg==, tarball: file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz} version: 0.0.1 @@ -991,6 +1123,10 @@ packages: resolution: {integrity: sha512-payOWRLyDwfKQoS3w60Wl5EYAbtmbjk5wJBYsWCZXCGASSKOvD5nV4+1azcKDZYKhPNGjjrGWzuw7/ASkUs0Ow==, tarball: file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz} version: 0.0.1 + '@powersync/mysql-zongji@0.6.0': + resolution: {integrity: sha512-iLWHTqDtoSmZye3Zh4TpKohFL+teqzoi+MGeFlmE6AAN50LeGm3XhJ+aWTGbheOjv7ZLildt+7SXlH4o4idZaw==} + engines: {node: '>=22.0.0'} + '@powersync/service-client@file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz': resolution: {integrity: sha512-N9Wfx3Xjm2dZXcZQFi7B5jKck1ZPs3MX+K7Dk3e+zRtN9oGclgukYRXGJEnqLB8DUpUiMT4H3lW804IQYwB+Tg==, tarball: file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz} version: 1.18.2 @@ -998,18 +1134,46 @@ packages: '@powersync/service-core@1.18.2': resolution: {integrity: sha512-5ffw+V2KybJI0zDeLYSoOrhZNZRBldJfCysZ8Ht0kYwYwvRcdWH558K5YHqFYxao3yszTmOMLJuseUs4Aq5k7w==} + '@powersync/service-core@1.19.0': + resolution: {integrity: sha512-07+0qvCgmKxWgWgGwOv8vpBakz5bcDzd1s/pD5OsXVxSyqZKGssStQIxVuczqiWjy0yASG5oNFJptlCRRNSJ7w==} + '@powersync/service-errors@0.3.6': resolution: {integrity: sha512-dLbh8E+VyaKiOSwoqeYledFq3Fiz90SOkTzi2Ej4Wo1L9jBcuT2TZDRMIw2bQc27UQ6iXAZp8pEvS8lhfx5gWw==} + '@powersync/service-jpgwire@0.21.10': + resolution: {integrity: sha512-eY06olUhmBIvhcHq0/Y14LVmhiCd3ONYZJFia5ttx4Jo96JjGKMKrGPiYjMFdhsXwtgpvaXeYBlh37J6a/yepg==} + '@powersync/service-jsonbig@0.17.12': resolution: {integrity: sha512-ilssJP6I+v8LfBCIwRJlKZhuxVT7pGhYg/B2+xsodVRRmTkyRDpmBpV+RlabksbtR1H0G3aXm5AtNYwmfblBkQ==} + '@powersync/service-module-mongodb-storage@0.13.0': + resolution: {integrity: sha512-+Ygctum7Q3rqg4wgltazYviRaATQlH2uoILq1JVdzItzmoDG19Bhdov1wJPvs1wkXqIeChyBjO5gSM866LFK4w==} + + '@powersync/service-module-mongodb@0.13.0': + resolution: {integrity: sha512-E7wxSw7zaWtydmSZHn7uiGVhqHIw0/VIcWDuy+bBmveyqmi++4FfQNu94bQZfpq9Irf5fsznSBk8bho3jgP9mQ==} + '@powersync/service-module-mssql@0.1.2': resolution: {integrity: sha512-tMYOHtXdnwVs0hXgs9Rh+EYXI9QjjXguTOnX6LeEWxu+WayMOK5FhLUxbdAi5bMYV27Xu86jTofhkgdIbrn9Pg==} + '@powersync/service-module-mysql@0.10.0': + resolution: {integrity: sha512-EoWwu+0XwRJ48F3kfJxaskzKwo6iTDkCnjWaMWI0OPdFnkGM8tjTC78b8lo22EimRKQxqAxzgEgOtTyeBcCJ5Q==} + + '@powersync/service-module-postgres-storage@0.11.0': + resolution: {integrity: sha512-0crwgXzLt4GVqmaVMce82Ir1RYN+ZwaZcX3t743eIpZ9x+EGm9YziLCN2nceRJ7t1Mwm7qpJqJbqaXpbKBlPjQ==} + + '@powersync/service-module-postgres@0.17.0': + resolution: {integrity: sha512-9vrFJMD2I5hNq71ulaSBxpz7WAXZMJc7P9YwJqgx8HlLUEqsyuDH5zmCnk5hI8lbQt3gLud2YQyu9zsD5t+Lmw==} + '@powersync/service-rsocket-router@0.2.11': resolution: {integrity: sha512-ChnVdoXestJGLd6vfwITkMvYwmOyEnKyZmfQf1ByuyfRi3sM+FByy6QGTgcKx14GxCMEU0aanf0Q5zOPhAvp4Q==} + '@powersync/service-rsocket-router@0.2.12': + resolution: {integrity: sha512-ICMencKesBUoXBH+mlUX9O7xIk+iPU5+p0hl844tPEBVdHqcsuEeA0aInebM2Rji5rKGSxPCqT6r4kNDx4OfZA==} + + '@powersync/service-schema@file:../service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz': + resolution: {integrity: sha512-6txEsEH1WA0qNZ8zj4z4wzZyGJTjbMPyT0Ne3G5x2+7vDDoeX0HRH+GbtrywZwJI1wKZPv+hDt6zhv9bFQq8YA==, tarball: file:../service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz} + version: 1.19.0 + '@powersync/service-sync-rules@0.29.10': resolution: {integrity: sha512-z26aJVvTVeYhFuopItQEwU3snS0BfTrPRA6PWkpfgN6RAEOCzb0oj8L/D3RM4w0k6FqyxEQb7/TI11YAUv7Lrg==} @@ -1019,6 +1183,9 @@ packages: '@powersync/service-types@0.13.3': resolution: {integrity: sha512-4QLFpvuZlAo3aBBfBvN/K1r8cvY7iRm7H2USuGFBLATq8onL33njPpho/ps2sm4LxPhwlQcUU0ApywAHajhCzg==} + '@powersync/service-types@0.14.0': + resolution: {integrity: sha512-fb5nUWWdoP13CQqJZrmSwt6W3DyINbc9nGfKe3rPOiPJlsMQZ6ea7ePKzPurHtFhgu628ThKQAQJ+q4R8+Ylfw==} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -1485,9 +1652,6 @@ packages: '@types/node@15.14.9': resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} @@ -1497,6 +1661,9 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/pegjs@0.10.6': + resolution: {integrity: sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==} + '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -1515,6 +1682,12 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} @@ -1734,6 +1907,10 @@ packages: '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vlasky/mysql@2.18.7': + resolution: {integrity: sha512-enkl4DCEFss5n7Gpe2ZTWvE85edQyYzdW3hAv0Kegx6MLmz6s7xHEqk4iG430RjDxINnCf4QPJMProccBRq39w==} + engines: {node: '>= 0.6'} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1841,6 +2018,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1863,6 +2044,16 @@ packages: peerDependencies: ajv: 4.11.8 - 8 + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@6.1.6: resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} @@ -1891,6 +2082,9 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1968,6 +2162,9 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -2057,6 +2254,9 @@ packages: core-js-compat@3.48.0: resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -2084,6 +2284,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2117,6 +2320,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2144,10 +2351,18 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + detect-indent@7.0.2: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@4.0.1: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2191,6 +2406,9 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.4: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} @@ -2456,6 +2674,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -2543,6 +2765,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -2565,6 +2790,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -2603,6 +2831,9 @@ packages: git-hooks-list@3.2.0: resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2710,6 +2941,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -2860,6 +3095,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2916,6 +3154,9 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2937,6 +3178,9 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} @@ -3088,6 +3332,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru.min@1.1.4: + resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -3101,6 +3349,9 @@ packages: mdn-data@2.23.0: resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3135,6 +3386,39 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb@6.21.0: + resolution: {integrity: sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} @@ -3154,11 +3438,22 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} + mysql2@3.16.3: + resolution: {integrity: sha512-+3XhQEt4FEFuvGV0JjIDj4eP2OT/oIj/54dYvqhblnSzlfcxVOuj+cd15Xz6hsG4HU1a+A5+BA9gm0618C4z7A==} + engines: {node: '>= 8.0'} + + named-placeholders@1.1.6: + resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} + engines: {node: '>=8.0.0'} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3185,6 +3480,13 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.87.0: + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} + engines: {node: '>=10'} + + node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -3197,6 +3499,10 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-sql-parser@5.4.0: + resolution: {integrity: sha512-jVe6Z61gPcPjCElPZ6j8llB3wnqGcuQzefim1ERsqIakxnEy5JlzV7XKdO1KmacRG5TKwPc4vJTgSRQ0LfkbFw==} + engines: {node: '>=8'} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -3360,6 +3666,10 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} + p-defer@4.0.1: + resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} + engines: {node: '>=12'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3436,6 +3746,10 @@ packages: pgsql-ast-parser@11.2.0: resolution: {integrity: sha512-/8KCcQjePoQDOtfZQuoV/4Y3WpmQVp7E+RFayAdjJpdBdu2dBnKnuQe9XU4g5Td5qC0G+i/fFK/DlNjvWwg+FA==} + pgwire@0.8.1: + resolution: {integrity: sha512-9Q1Mh5eR0IaeTrfZ+vovkj0zyEpxTijEbGizMezwUjo1vSbJnequf7Y+roSQph7POuJ7xOPDqjQJUMM2OQR+zw==} + engines: {node: '>=18.17.0'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3459,6 +3773,11 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3472,6 +3791,9 @@ packages: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -3483,6 +3805,9 @@ packages: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3501,6 +3826,10 @@ packages: resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} engines: {node: '>=0.12'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -3509,6 +3838,9 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3596,6 +3928,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3630,6 +3965,9 @@ packages: sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3683,9 +4021,19 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snappy@7.3.3: + resolution: {integrity: sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ==} + engines: {node: '>= 10'} + sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} @@ -3697,6 +4045,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3715,6 +4066,10 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -3755,6 +4110,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3774,6 +4132,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3800,6 +4162,13 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tarn@3.0.2: resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} @@ -3848,6 +4217,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} @@ -3946,9 +4319,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -4117,6 +4487,14 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -5131,40 +5509,40 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@18.19.130)': + '@inquirer/checkbox@4.3.2(@types/node@24.10.10)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@24.10.10) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@inquirer/confirm@3.2.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/confirm@5.1.21(@types/node@18.19.130)': + '@inquirer/confirm@5.1.21(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/core@10.3.2(@types/node@18.19.130)': + '@inquirer/core@10.3.2(@types/node@24.10.10)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@24.10.10) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@inquirer/core@9.2.1': dependencies: @@ -5181,28 +5559,28 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 - '@inquirer/editor@4.2.23(@types/node@18.19.130)': + '@inquirer/editor@4.2.23(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/external-editor': 1.0.3(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/external-editor': 1.0.3(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/expand@4.0.23(@types/node@18.19.130)': + '@inquirer/expand@4.0.23(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/external-editor@1.0.3(@types/node@18.19.130)': + '@inquirer/external-editor@1.0.3(@types/node@24.10.10)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@inquirer/figures@1.0.15': {} @@ -5211,59 +5589,59 @@ snapshots: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/input@4.3.1(@types/node@18.19.130)': + '@inquirer/input@4.3.1(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/number@3.0.23(@types/node@18.19.130)': + '@inquirer/number@3.0.23(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/password@4.0.23(@types/node@18.19.130)': + '@inquirer/password@4.0.23(@types/node@24.10.10)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 - - '@inquirer/prompts@7.10.1(@types/node@18.19.130)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@18.19.130) - '@inquirer/confirm': 5.1.21(@types/node@18.19.130) - '@inquirer/editor': 4.2.23(@types/node@18.19.130) - '@inquirer/expand': 4.0.23(@types/node@18.19.130) - '@inquirer/input': 4.3.1(@types/node@18.19.130) - '@inquirer/number': 3.0.23(@types/node@18.19.130) - '@inquirer/password': 4.0.23(@types/node@18.19.130) - '@inquirer/rawlist': 4.1.11(@types/node@18.19.130) - '@inquirer/search': 3.2.2(@types/node@18.19.130) - '@inquirer/select': 4.4.2(@types/node@18.19.130) + '@types/node': 24.10.10 + + '@inquirer/prompts@7.10.1(@types/node@24.10.10)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.10.10) + '@inquirer/confirm': 5.1.21(@types/node@24.10.10) + '@inquirer/editor': 4.2.23(@types/node@24.10.10) + '@inquirer/expand': 4.0.23(@types/node@24.10.10) + '@inquirer/input': 4.3.1(@types/node@24.10.10) + '@inquirer/number': 3.0.23(@types/node@24.10.10) + '@inquirer/password': 4.0.23(@types/node@24.10.10) + '@inquirer/rawlist': 4.1.11(@types/node@24.10.10) + '@inquirer/search': 3.2.2(@types/node@24.10.10) + '@inquirer/select': 4.4.2(@types/node@24.10.10) optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/rawlist@4.1.11(@types/node@18.19.130)': + '@inquirer/rawlist@4.1.11(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 - '@inquirer/search@3.2.2(@types/node@18.19.130)': + '@inquirer/search@3.2.2(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@24.10.10) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@inquirer/select@2.5.0': dependencies: @@ -5273,15 +5651,15 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/select@4.4.2(@types/node@18.19.130)': + '@inquirer/select@4.4.2(@types/node@24.10.10)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/core': 10.3.2(@types/node@24.10.10) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@24.10.10) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@inquirer/type@1.5.5': dependencies: @@ -5291,9 +5669,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.10(@types/node@18.19.130)': + '@inquirer/type@3.0.10(@types/node@24.10.10)': optionalDependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@journeyapps-labs/common-sdk@1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': dependencies: @@ -5325,32 +5703,6 @@ snapshots: - tsx - yaml - '@journeyapps-labs/micro-codecs@1.0.1(tsx@4.21.0)': - dependencies: - '@types/node': 24.10.10 - bson: 6.10.4 - ts-codec: 1.3.0 - vitest: 3.2.4(@types/node@24.10.10)(tsx@4.21.0) - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@types/debug' - - '@vitest/browser' - - '@vitest/ui' - - happy-dom - - jiti - - jsdom - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - '@journeyapps-labs/micro-codecs@1.0.1(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/node': 24.10.10 @@ -5452,52 +5804,124 @@ snapshots: '@js-sdsl/ordered-set@4.4.2': {} - '@napi-rs/wasm-runtime@0.2.12': + '@mongodb-js/saslprep@1.4.5': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@nolyfill/is-core-module@1.0.39': {} + sparse-bitfield: 3.0.3 - '@oclif/core@4.8.0': + '@mongodb-js/zstd@2.0.1': dependencies: - ansi-escapes: 4.3.2 - ansis: 3.17.0 - clean-stack: 3.0.1 - cli-spinners: 2.9.2 - debug: 4.4.3(supports-color@8.1.1) - ejs: 3.1.10 - get-package-type: 0.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lilconfig: 3.1.3 - minimatch: 9.0.5 - semver: 7.7.3 - string-width: 4.2.3 - supports-color: 8.1.1 - tinyglobby: 0.2.15 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 + node-addon-api: 4.3.0 + prebuild-install: 7.1.3 - '@oclif/plugin-help@6.2.37': - dependencies: - '@oclif/core': 4.8.0 + '@napi-rs/snappy-android-arm-eabi@7.3.3': + optional: true - '@oclif/plugin-not-found@3.2.74(@types/node@18.19.130)': - dependencies: - '@inquirer/prompts': 7.10.1(@types/node@18.19.130) - '@oclif/core': 4.8.0 - ansis: 3.17.0 - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@types/node' + '@napi-rs/snappy-android-arm64@7.3.3': + optional: true - '@oclif/plugin-plugins@5.4.55': - dependencies: - '@oclif/core': 4.8.0 + '@napi-rs/snappy-darwin-arm64@7.3.3': + optional: true + + '@napi-rs/snappy-darwin-x64@7.3.3': + optional: true + + '@napi-rs/snappy-freebsd-x64@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm64-musl@7.3.3': + optional: true + + '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-s390x-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-x64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-x64-musl@7.3.3': + optional: true + + '@napi-rs/snappy-openharmony-arm64@7.3.3': + optional: true + + '@napi-rs/snappy-wasm32-wasi@7.3.3': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@napi-rs/snappy-win32-arm64-msvc@7.3.3': + optional: true + + '@napi-rs/snappy-win32-ia32-msvc@7.3.3': + optional: true + + '@napi-rs/snappy-win32-x64-msvc@7.3.3': + optional: true + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nolyfill/is-core-module@1.0.39': {} + + '@oclif/core@4.8.0': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 9.0.5 + semver: 7.7.3 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.15 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/plugin-help@6.2.37': + dependencies: + '@oclif/core': 4.8.0 + + '@oclif/plugin-not-found@3.2.74(@types/node@24.10.10)': + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@24.10.10) + '@oclif/core': 4.8.0 + ansis: 3.17.0 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@types/node' + + '@oclif/plugin-plugins@5.4.55': + dependencies: + '@oclif/core': 4.8.0 ansis: 3.17.0 debug: 4.4.3(supports-color@8.1.1) npm: 10.9.4 @@ -5633,6 +6057,34 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@powersync/lib-service-mongodb@0.6.17': + dependencies: + '@mongodb-js/zstd': 2.0.1 + '@powersync/lib-services-framework': 0.8.0 + bson: 6.10.4 + mongodb: 6.21.0(@mongodb-js/zstd@2.0.1)(snappy@7.3.3) + mongodb-connection-string-url: 3.0.2 + snappy: 7.3.3 + ts-codec: 1.3.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - socks + + '@powersync/lib-service-postgres@0.4.19': + dependencies: + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-jpgwire': 0.21.10 + '@powersync/service-types': 0.14.0 + p-defer: 4.0.1 + ts-codec: 1.3.0 + uri-js: 4.4.1 + uuid: 11.1.0 + transitivePeerDependencies: + - babel-plugin-macros + '@powersync/lib-services-framework@0.7.14': dependencies: '@powersync/service-errors': 0.3.6 @@ -5648,6 +6100,21 @@ snapshots: winston: 3.19.0 zod: 3.25.76 + '@powersync/lib-services-framework@0.8.0': + dependencies: + '@powersync/service-errors': 0.3.6 + '@powersync/service-sync-rules': 0.30.0 + ajv: 8.17.1 + better-ajv-errors: 1.2.0(ajv@8.17.1) + bson: 6.10.4 + dotenv: 16.6.1 + ipaddr.js: 2.3.0 + lodash: 4.17.23 + ts-codec: 1.3.0 + uuid: 11.1.0 + winston: 3.19.0 + zod: 3.25.76 + '@powersync/management-client@file:../service/powersync-hosted/public-packages/client/powersync-management-client-0.0.1.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@journeyapps-labs/common-sdk': 1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) @@ -5676,36 +6143,6 @@ snapshots: - utf-8-validate - yaml - '@powersync/management-types@file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)': - dependencies: - '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0) - '@powersync/service-module-mssql': 0.1.2 - '@powersync/service-types': 0.13.3 - bson: 6.10.4 - ts-codec: 1.3.0 - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@types/debug' - - '@vitest/browser' - - '@vitest/ui' - - babel-plugin-macros - - bufferutil - - happy-dom - - jiti - - jsdom - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - utf-8-validate - - yaml - '@powersync/management-types@file:../service/powersync-hosted/public-packages/types/powersync-management-types-0.0.1.tgz(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@journeyapps-labs/micro-codecs': 1.0.1(tsx@4.21.0)(yaml@2.8.2) @@ -5736,6 +6173,12 @@ snapshots: - utf-8-validate - yaml + '@powersync/mysql-zongji@0.6.0': + dependencies: + '@vlasky/mysql': 2.18.7 + big-integer: 1.6.52 + iconv-lite: 0.6.3 + '@powersync/service-client@file:../service/powersync-service/packages/service-client/powersync-service-client-1.18.2.tgz(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@journeyapps-labs/common-sdk': 1.0.2(@types/json-schema@7.0.15)(tsx@4.21.0)(yaml@2.8.2) @@ -5797,12 +6240,98 @@ snapshots: - bufferutil - utf-8-validate + '@powersync/service-core@1.19.0': + dependencies: + '@js-sdsl/ordered-set': 4.4.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.5.0(@opentelemetry/api@1.9.0) + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-rsocket-router': 0.2.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + async: 3.2.6 + async-mutex: 0.5.0 + bson: 6.10.4 + commander: 12.1.0 + cors: 2.8.6 + ipaddr.js: 2.3.0 + ix: 5.0.0 + jose: 4.15.9 + lodash: 4.17.23 + lru-cache: 10.4.3 + negotiator: 1.0.0 + node-fetch: 3.3.2 + ts-codec: 1.3.0 + uri-js: 4.4.1 + uuid: 11.1.0 + winston: 3.19.0 + yaml: 2.8.2 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - utf-8-validate + '@powersync/service-errors@0.3.6': {} + '@powersync/service-jpgwire@0.21.10': + dependencies: + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + date-fns: 4.1.0 + pgwire: 0.8.1 + '@powersync/service-jsonbig@0.17.12': dependencies: lossless-json: 2.0.11 + '@powersync/service-module-mongodb-storage@0.13.0': + dependencies: + '@powersync/lib-service-mongodb': 0.6.17 + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-core': 1.19.0 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + bson: 6.10.4 + ix: 5.0.0 + lru-cache: 10.4.3 + ts-codec: 1.3.0 + uuid: 11.1.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - babel-plugin-macros + - bufferutil + - gcp-metadata + - kerberos + - mongodb-client-encryption + - socks + - utf-8-validate + + '@powersync/service-module-mongodb@0.13.0': + dependencies: + '@powersync/lib-service-mongodb': 0.6.17 + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-core': 1.19.0 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + bson: 6.10.4 + ts-codec: 1.3.0 + uuid: 11.1.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - babel-plugin-macros + - bufferutil + - gcp-metadata + - kerberos + - mongodb-client-encryption + - socks + - utf-8-validate + '@powersync/service-module-mssql@0.1.2': dependencies: '@powersync/lib-services-framework': 0.7.14 @@ -5822,6 +6351,62 @@ snapshots: - supports-color - utf-8-validate + '@powersync/service-module-mysql@0.10.0': + dependencies: + '@powersync/lib-services-framework': 0.8.0 + '@powersync/mysql-zongji': 0.6.0 + '@powersync/service-core': 1.19.0 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + async: 3.2.6 + mysql2: 3.16.3 + node-sql-parser: 5.4.0 + semver: 7.7.3 + ts-codec: 1.3.0 + uri-js: 4.4.1 + uuid: 11.1.0 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - utf-8-validate + + '@powersync/service-module-postgres-storage@0.11.0': + dependencies: + '@powersync/lib-service-postgres': 0.4.19 + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-core': 1.19.0 + '@powersync/service-jpgwire': 0.21.10 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + ix: 5.0.0 + lru-cache: 10.4.3 + p-defer: 4.0.1 + ts-codec: 1.3.0 + uuid: 11.1.0 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - utf-8-validate + + '@powersync/service-module-postgres@0.17.0': + dependencies: + '@powersync/lib-service-postgres': 0.4.19 + '@powersync/lib-services-framework': 0.8.0 + '@powersync/service-core': 1.19.0 + '@powersync/service-jpgwire': 0.21.10 + '@powersync/service-jsonbig': 0.17.12 + '@powersync/service-sync-rules': 0.30.0 + '@powersync/service-types': 0.14.0 + semver: 7.7.3 + ts-codec: 1.3.0 + uuid: 11.1.0 + transitivePeerDependencies: + - babel-plugin-macros + - bufferutil + - utf-8-validate + '@powersync/service-rsocket-router@0.2.11': dependencies: '@powersync/lib-services-framework': 0.7.14 @@ -5833,6 +6418,36 @@ snapshots: - bufferutil - utf-8-validate + '@powersync/service-rsocket-router@0.2.12': + dependencies: + '@powersync/lib-services-framework': 0.8.0 + rsocket-core: 1.0.0-alpha.3 + ts-codec: 1.3.0 + uuid: 11.1.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@powersync/service-schema@file:../service/powersync-service/packages/schema/powersync-service-schema-1.19.0.tgz': + dependencies: + '@powersync/service-module-mongodb': 0.13.0 + '@powersync/service-module-mongodb-storage': 0.13.0 + '@powersync/service-module-mysql': 0.10.0 + '@powersync/service-module-postgres': 0.17.0 + '@powersync/service-module-postgres-storage': 0.11.0 + '@powersync/service-types': 0.14.0 + ts-codec: 1.3.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - babel-plugin-macros + - bufferutil + - gcp-metadata + - kerberos + - mongodb-client-encryption + - socks + - utf-8-validate + '@powersync/service-sync-rules@0.29.10': dependencies: '@powersync/service-jsonbig': 0.17.12 @@ -5859,6 +6474,14 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@powersync/service-types@0.14.0': + dependencies: + dedent: 1.7.1 + ts-codec: 1.3.0 + uri-js: 4.4.1 + transitivePeerDependencies: + - babel-plugin-macros + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -6354,7 +6977,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/chai@5.2.3': dependencies: @@ -6363,7 +6986,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/deep-eql@4.0.2': {} @@ -6371,7 +6994,7 @@ snapshots: '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -6394,16 +7017,12 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 18.19.130 + '@types/node': 24.10.10 '@types/node@13.13.52': {} '@types/node@15.14.9': {} - '@types/node@18.19.130': - dependencies: - undici-types: 5.26.5 - '@types/node@22.19.7': dependencies: undici-types: 6.21.0 @@ -6414,25 +7033,33 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/pegjs@0.10.6': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} '@types/readable-stream@4.0.23': dependencies: - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.7 + '@types/node': 24.10.10 '@types/triple-beam@1.3.5': {} + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + '@types/wrap-ansi@3.0.0': {} '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': @@ -6610,15 +7237,7 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 @@ -6626,13 +7245,13 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -6682,6 +7301,13 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 + '@vlasky/mysql@2.18.7': + dependencies: + bignumber.js: 9.1.1 + readable-stream: 2.3.7 + safe-buffer: 5.2.1 + sqlstring: 2.3.3 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -6804,6 +7430,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + aws-ssl-profiles@1.1.2: {} + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -6828,6 +7456,16 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + big-integer@1.6.52: {} + + bignumber.js@9.1.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + bl@6.1.6: dependencies: '@types/readable-stream': 4.0.23 @@ -6862,6 +7500,11 @@ snapshots: buffer-equal-constant-time@1.0.1: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -6959,6 +7602,8 @@ snapshots: check-error@2.1.3: {} + chownr@1.1.4: {} + ci-info@3.9.0: {} ci-info@4.4.0: {} @@ -7031,6 +7676,8 @@ snapshots: dependencies: browserslist: 4.28.1 + core-util-is@1.0.3: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -7064,6 +7711,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns@4.1.0: {} + debug@3.2.7: dependencies: ms: 2.1.3 @@ -7082,6 +7731,8 @@ snapshots: deep-eql@5.0.2: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} default-browser-id@5.0.1: {} @@ -7107,8 +7758,12 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + denque@2.1.0: {} + detect-indent@7.0.2: {} + detect-libc@2.1.2: {} + detect-newline@4.0.1: {} diff@4.0.4: {} @@ -7146,6 +7801,10 @@ snapshots: enabled@2.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 @@ -7599,6 +8258,8 @@ snapshots: events@3.3.0: {} + expand-template@2.0.3: {} + expect-type@1.3.0: {} fast-deep-equal@3.1.3: {} @@ -7675,6 +8336,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 + fs-constants@1.0.0: {} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -7699,6 +8362,10 @@ snapshots: functions-have-names@1.2.3: {} + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + generator-function@2.0.1: {} get-east-asian-width@1.4.0: {} @@ -7739,6 +8406,8 @@ snapshots: git-hooks-list@3.2.0: {} + github-from-package@0.0.0: {} + github-slugger@2.0.0: {} glob-parent@6.0.2: @@ -7860,6 +8529,10 @@ snapshots: dependencies: ms: 2.1.3 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -7991,6 +8664,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-property@1.0.2: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8044,6 +8719,8 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -8063,6 +8740,8 @@ snapshots: jose@4.15.9: {} + jose@6.1.3: {} + js-md4@0.3.2: {} js-tokens@4.0.0: {} @@ -8198,6 +8877,8 @@ snapshots: lru-cache@10.4.3: {} + lru.min@1.1.4: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8208,6 +8889,8 @@ snapshots: mdn-data@2.23.0: {} + memory-pager@1.5.0: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -8235,6 +8918,22 @@ snapshots: minimist@1.2.8: {} + mkdirp-classic@0.5.3: {} + + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.2.0 + + mongodb@6.21.0(@mongodb-js/zstd@2.0.1)(snappy@7.3.3): + dependencies: + '@mongodb-js/saslprep': 1.4.5 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + '@mongodb-js/zstd': 2.0.1 + snappy: 7.3.3 + moo@0.5.2: {} ms@2.1.3: {} @@ -8253,8 +8952,26 @@ snapshots: mute-stream@2.0.0: {} + mysql2@3.16.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.2 + long: 5.3.2 + lru.min: 1.1.4 + named-placeholders: 1.1.6 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + named-placeholders@1.1.6: + dependencies: + lru.min: 1.1.4 + nanoid@3.3.11: {} + napi-build-utils@2.0.0: {} + napi-postinstall@0.3.4: {} native-duplexpair@1.0.0: {} @@ -8277,6 +8994,12 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@3.87.0: + dependencies: + semver: 7.7.3 + + node-addon-api@4.3.0: {} + node-domexception@1.0.0: {} node-fetch@3.3.2: @@ -8287,6 +9010,11 @@ snapshots: node-releases@2.0.27: {} + node-sql-parser@5.4.0: + dependencies: + '@types/pegjs': 0.10.6 + big-integer: 1.6.52 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -8354,7 +9082,7 @@ snapshots: obug@2.1.1: {} - oclif@4.22.73(@types/node@18.19.130): + oclif@4.22.73(@types/node@24.10.10): dependencies: '@aws-sdk/client-cloudfront': 3.980.0 '@aws-sdk/client-s3': 3.980.0 @@ -8363,7 +9091,7 @@ snapshots: '@inquirer/select': 2.5.0 '@oclif/core': 4.8.0 '@oclif/plugin-help': 6.2.37 - '@oclif/plugin-not-found': 3.2.74(@types/node@18.19.130) + '@oclif/plugin-not-found': 3.2.74(@types/node@24.10.10) '@oclif/plugin-warn-if-update-available': 3.1.55 ansis: 3.17.0 async-retry: 1.3.3 @@ -8432,6 +9160,8 @@ snapshots: p-cancelable@3.0.0: {} + p-defer@4.0.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -8506,6 +9236,8 @@ snapshots: moo: 0.5.2 nearley: 2.20.1 + pgwire@0.8.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -8522,12 +9254,29 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.87.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier@3.8.1: {} proc-log@4.2.0: {} + process-nextick-args@2.0.1: {} + process@0.11.10: {} proto-list@1.2.4: {} @@ -8544,9 +9293,14 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.7 + '@types/node': 24.10.10 long: 5.3.2 + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} quick-lru@5.1.1: {} @@ -8560,6 +9314,13 @@ snapshots: discontinuous-range: 1.0.0 ret: 0.1.15 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -8573,6 +9334,16 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 + readable-stream@2.3.7: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -8693,6 +9464,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -8722,6 +9495,8 @@ snapshots: tslib: 2.8.1 upper-case-first: 2.0.2 + seq-queue@0.0.5: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8793,11 +9568,40 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.8.1 + snappy@7.3.3: + optionalDependencies: + '@napi-rs/snappy-android-arm-eabi': 7.3.3 + '@napi-rs/snappy-android-arm64': 7.3.3 + '@napi-rs/snappy-darwin-arm64': 7.3.3 + '@napi-rs/snappy-darwin-x64': 7.3.3 + '@napi-rs/snappy-freebsd-x64': 7.3.3 + '@napi-rs/snappy-linux-arm-gnueabihf': 7.3.3 + '@napi-rs/snappy-linux-arm64-gnu': 7.3.3 + '@napi-rs/snappy-linux-arm64-musl': 7.3.3 + '@napi-rs/snappy-linux-ppc64-gnu': 7.3.3 + '@napi-rs/snappy-linux-riscv64-gnu': 7.3.3 + '@napi-rs/snappy-linux-s390x-gnu': 7.3.3 + '@napi-rs/snappy-linux-x64-gnu': 7.3.3 + '@napi-rs/snappy-linux-x64-musl': 7.3.3 + '@napi-rs/snappy-openharmony-arm64': 7.3.3 + '@napi-rs/snappy-wasm32-wasi': 7.3.3 + '@napi-rs/snappy-win32-arm64-msvc': 7.3.3 + '@napi-rs/snappy-win32-ia32-msvc': 7.3.3 + '@napi-rs/snappy-win32-x64-msvc': 7.3.3 + sort-object-keys@1.1.3: {} sort-package-json@2.15.1: @@ -8813,6 +9617,10 @@ snapshots: source-map-js@1.2.1: {} + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -8834,6 +9642,8 @@ snapshots: sprintf-js@1.1.3: {} + sqlstring@2.3.3: {} + stable-hash@0.0.5: {} stack-trace@0.0.10: {} @@ -8883,6 +9693,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -8901,6 +9715,8 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} strip-literal@3.1.0: @@ -8921,6 +9737,21 @@ snapshots: tapable@2.3.0: {} + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tarn@3.0.2: {} tedious@19.2.0: @@ -8929,7 +9760,7 @@ snapshots: '@azure/identity': 4.13.0 '@azure/keyvault-keys': 4.10.0 '@js-joda/core': 5.7.0 - '@types/node': 22.19.7 + '@types/node': 24.10.10 bl: 6.1.6 iconv-lite: 0.7.2 js-md4: 0.3.2 @@ -8965,6 +9796,10 @@ snapshots: dependencies: is-number: 7.0.0 + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + triple-beam@1.4.1: {} ts-api-utils@2.4.0(typescript@5.9.3): @@ -8978,14 +9813,14 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 - ts-node@10.9.2(@types/node@18.19.130)(typescript@5.9.3): + ts-node@10.9.2(@types/node@24.10.10)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.130 + '@types/node': 24.10.10 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -9081,8 +9916,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} - undici-types@6.21.0: {} undici-types@7.16.0: {} @@ -9171,20 +10004,6 @@ snapshots: - tsx - yaml - vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 18.19.130 - fsevents: 2.3.3 - tsx: 4.21.0 - yaml: 2.8.2 - vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -9199,52 +10018,11 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest@3.2.4(@types/node@24.10.10)(tsx@4.21.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.10.10 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.2.4(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9281,10 +10059,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -9301,11 +10079,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@18.19.130)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.10)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 18.19.130 + '@types/node': 24.10.10 transitivePeerDependencies: - jiti - less @@ -9321,6 +10099,13 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@7.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 From 51bd353ef3dcf953d87ce4db644f63dc22dafd0f Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 12:23:35 +0200 Subject: [PATCH 014/141] validation commands --- packages/cli/src/api/cloud/test-connection.ts | 51 +++++ packages/cli/src/commands/deploy.ts | 39 +--- packages/cli/src/commands/validate.ts | 208 +++++++++++++++++- 3 files changed, 264 insertions(+), 34 deletions(-) create mode 100644 packages/cli/src/api/cloud/test-connection.ts diff --git a/packages/cli/src/api/cloud/test-connection.ts b/packages/cli/src/api/cloud/test-connection.ts new file mode 100644 index 0000000..561b197 --- /dev/null +++ b/packages/cli/src/api/cloud/test-connection.ts @@ -0,0 +1,51 @@ +import type { RequiredCloudLinkConfig } from '@powersync/cli-schemas'; +import type { PowerSyncManagementClient } from '@powersync/management-client'; +import { routes } from '@powersync/management-types'; + +export type TestConnectionResult = { + connectionName: string; + response: routes.TestConnectionResponse; +}; + +/** + * Tests each database connection from the config against PowerSync Cloud. + * Uses the instance ID so secret_refs can be resolved. + */ +export async function testCloudConnections( + client: PowerSyncManagementClient, + linked: RequiredCloudLinkConfig, + connections: Array<{ name?: string } & Record> +): Promise { + const results: TestConnectionResult[] = []; + for (const connection of connections) { + const response = await client.testConnection( + routes.TestConnectionRequest.encode({ + id: linked.instance_id, + org_id: linked.org_id, + app_id: linked.project_id, + connection: connection as Parameters[0]['connection'] + }) + ); + results.push({ + connectionName: connection.name ?? 'unnamed', + response + }); + } + return results; +} + +/** Pretty-print test connection response for error output. */ +export function formatTestConnectionFailure(response: routes.TestConnectionResponse, connectionName: string): string { + const lines: string[] = [ + `Failed to test connection for connection "${connectionName}":`, + '', + ' Overall success: ' + String(response.success), + ' Error: ' + (response.error ?? '(none)'), + '', + ' Checks:', + ' • connection.success: ' + String(response.connection?.success ?? '—'), + ' • connection.reachable: ' + String(response.connection?.reachable ?? '—'), + ' • configuration.success: ' + String(response.configuration?.success ?? '—') + ]; + return lines.join('\n'); +} diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index e17910d..989037b 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -2,6 +2,7 @@ import type { RequiredCloudLinkConfig } from '@powersync/cli-schemas'; import { PowerSyncManagementClient } from '@powersync/management-client'; import { routes } from '@powersync/management-types'; import ora from 'ora'; +import { formatTestConnectionFailure, testCloudConnections } from '../api/cloud/test-connection.js'; import { CloudInstanceCommand } from '../command-types/CloudInstanceCommand.js'; const STATUS_POLL_INTERVAL_MS = 5000; @@ -29,22 +30,6 @@ async function waitForStatusChange( } } -/** Pretty-print test connection response for error output. Uses types from @powersync/management-types (BaseTestConnectionResponse). */ -function formatTestConnectionFailure(response: routes.TestConnectionResponse, connectionName: string): string { - const lines: string[] = [ - `Failed to test connection for connection "${connectionName}":`, - '', - ' Overall success: ' + String(response.success), - ' Error: ' + (response.error ?? '(none)'), - '', - ' Checks:', - ' • connection.success: ' + String(response.connection?.success ?? '—'), - ' • connection.reachable: ' + String(response.connection?.reachable ?? '—'), - ' • configuration.success: ' + String(response.configuration?.success ?? '—') - ]; - return lines.join('\n'); -} - export default class Deploy extends CloudInstanceCommand { static description = 'Deploys changes to the PowerSync management service. Cloud only.'; static summary = 'Deploy sync rules and configuration changes.'; @@ -114,22 +99,14 @@ export default class Deploy extends CloudInstanceCommand { { exit: 1 } ); } - for (const connection of config.replication?.connections ?? []) { - const response = await client - .testConnection( - routes.TestConnectionRequest.encode({ - // The instance ID allows secret_refs to be used - id: linked.instance_id, - org_id: linked.org_id, - app_id: linked.project_id, - connection - }) - ) - .catch((error) => { - this.error(`Failed to test connection for connection ${connection.name}: ${error}`, { exit: 1 }); - }); + const connectionResults = await testCloudConnections(client, linked, config.replication?.connections ?? []).catch( + (error) => { + this.error(`Failed to test connections: ${error}`, { exit: 1 }); + } + ); + for (const { connectionName, response } of connectionResults) { if (response.success !== true) { - this.error(formatTestConnectionFailure(response, connection.name ?? 'unnamed'), { exit: 1 }); + this.error(formatTestConnectionFailure(response, connectionName), { exit: 1 }); } } this.log('Connection test successful.'); diff --git a/packages/cli/src/commands/validate.ts b/packages/cli/src/commands/validate.ts index db5c40c..5e9e4a6 100644 --- a/packages/cli/src/commands/validate.ts +++ b/packages/cli/src/commands/validate.ts @@ -1,10 +1,212 @@ -import { Command } from '@oclif/core'; +import { Flags } from '@oclif/core'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { Document } from 'yaml'; +import { testCloudConnections } from '../api/cloud/test-connection.js'; +import { createCloudClient } from '../clients/CloudClient.js'; +import { createSelfHostedClient } from '../clients/SelfHostedClient.js'; +import { CloudProject } from '../command-types/CloudInstanceCommand.js'; +import { SelfHostedProject } from '../command-types/SelfHostedInstanceCommand.js'; +import { SharedInstanceCommand } from '../command-types/SharedInstanceCommand.js'; +import { loadServiceDocument, SERVICE_FILENAME, SYNC_FILENAME } from '../utils/project-config.js'; -export default class Validate extends Command { +type ValidationTestResult = { + name: string; + passed: boolean; + errors?: string[]; +}; + +type ValidationResult = { + passed: boolean; + tests: ValidationTestResult[]; +}; + +const INDENT = ' '; +const BULLET = '•'; + +function formatTestHuman(test: ValidationTestResult): string { + const status = test.passed ? '✓' : '✗'; + const name = `${status} ${test.name}`; + if (test.passed) return name; + const errorLines = (test.errors ?? []).map((e) => `${INDENT}${BULLET} ${e}`); + return [name, ...errorLines].join('\n'); +} + +function formatValidationHuman(result: ValidationResult): string { + const header = result.passed ? 'All validation tests passed.' : 'Some validation tests failed.'; + const lines = [header, '', ...result.tests.map(formatTestHuman)]; + return lines.join('\n'); +} + +function formatValidationJson(result: ValidationResult): string { + return JSON.stringify(result, null, 2); +} + +function formatValidationYaml(result: ValidationResult): string { + return new Document(result).toString(); +} + +async function runConfigTest(projectDir: string, isCloud: boolean): Promise { + const { CLICloudConfig, CLISelfHostedConfig } = await import('@powersync/cli-schemas'); + const servicePath = join(projectDir, SERVICE_FILENAME); + try { + const doc = loadServiceDocument(servicePath); + const raw = doc.contents?.toJSON(); + if (isCloud) { + CLICloudConfig.decode(raw); + } else { + CLISelfHostedConfig.decode(raw); + } + return { name: 'config_schema', passed: true }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { name: 'config_schema', passed: false, errors: [message] }; + } +} + +async function runConnectionTestCloud(project: CloudProject): Promise { + const client = await createCloudClient(); + const { CLICloudConfig } = await import('@powersync/cli-schemas'); + let config: { replication?: { connections?: Array> } }; + try { + const doc = loadServiceDocument(join(project.projectDirectory, SERVICE_FILENAME)); + config = CLICloudConfig.decode(doc.contents?.toJSON()); + } catch { + return { + name: 'connection', + passed: false, + errors: ['Could not parse config; run config schema test first.'] + }; + } + const connections = config.replication?.connections ?? []; + if (connections.length === 0) { + return { name: 'connection', passed: false, errors: ['No connections defined in config.'] }; + } + try { + const results = await testCloudConnections(client, project.linked, connections); + const failed = results.filter((r) => r.response.success !== true); + if (failed.length === 0) { + return { name: 'connection', passed: true }; + } + const errors = failed.map((f) => `${f.connectionName}: ${f.response.error ?? 'Connection test failed'}`); + return { name: 'connection', passed: false, errors }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { name: 'connection', passed: false, errors: [message] }; + } +} + +async function runSyncRulesTestCloud(project: CloudProject): Promise { + const syncRulesPath = join(project.projectDirectory, SYNC_FILENAME); + const syncRulesContent = + project.syncRulesContent ?? (existsSync(syncRulesPath) ? readFileSync(syncRulesPath, 'utf8') : undefined); + if (!syncRulesContent?.trim()) { + return { name: 'sync_rules', passed: false, errors: ['No sync.yaml found or empty.'] }; + } + const client = await createCloudClient(); + try { + const result = await client.validateSyncRules({ + id: project.linked.instance_id, + org_id: project.linked.org_id, + app_id: project.linked.project_id, + sync_rules: syncRulesContent + }); + const hasFatalErrors = (result.connections ?? []).some((c) => + (c.tables ?? []).some((t) => (t.errors ?? []).some((e) => e.level === 'fatal')) + ); + const passed = !hasFatalErrors; + const errors = (result.connections ?? []).flatMap((c) => + (c.tables ?? []).flatMap((t) => (t.errors ?? []).map((e) => `${t.schema}.${t.name}: [${e.level}] ${e.message}`)) + ); + return { + name: 'sync_rules', + passed, + errors: errors.length ? errors : undefined + }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { name: 'sync_rules', passed: false, errors: [message] }; + } +} + +async function runSyncRulesTestSelfHosted(project: SelfHostedProject): Promise { + const syncRulesPath = join(project.projectDirectory, SYNC_FILENAME); + const syncRulesContent = existsSync(syncRulesPath) ? readFileSync(syncRulesPath, 'utf8') : undefined; + if (!syncRulesContent?.trim()) { + return { name: 'sync_rules', passed: false, errors: ['No sync.yaml found or empty.'] }; + } + const client = createSelfHostedClient({ + apiUrl: project.linked.api_url, + apiKey: project.linked.api_key + }); + try { + const result = await client.validate({ sync_rules: syncRulesContent }); + const hasFatalErrors = (result.connections ?? []).some((c) => + (c.tables ?? []).some((t) => (t.errors ?? []).some((e) => e.level === 'fatal')) + ); + const passed = !hasFatalErrors; + const errors = (result.connections ?? []).flatMap((c) => + (c.tables ?? []).flatMap((t) => (t.errors ?? []).map((e) => `${t.schema}.${t.name}: [${e.level}] ${e.message}`)) + ); + return { + name: 'sync_rules', + passed, + errors: errors.length ? errors : undefined + }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { name: 'sync_rules', passed: false, errors: [message] }; + } +} + +export default class Validate extends SharedInstanceCommand { static description = 'Validates configuration. Supported for both Cloud and self-hosted.'; static summary = 'Validate configuration (sync rules, connection, etc.).'; + static flags = { + output: Flags.string({ + default: 'human', + description: 'Output format: human-readable, json, or yaml.', + options: ['human', 'json', 'yaml'] + }), + ...SharedInstanceCommand.flags + }; + async run(): Promise { - this.log('validate: not yet implemented'); + const { flags } = await this.parse(Validate); + + const project = this.loadProject(flags, { + configFileRequired: true, + linkingIsRequired: true + }); + + const isCloud = project.linked.type === 'cloud'; + const tests: ValidationTestResult[] = []; + + tests.push(await runConfigTest(project.projectDirectory, isCloud)); + + if (isCloud) { + tests.push(await runConnectionTestCloud(project as CloudProject)); + tests.push(await runSyncRulesTestCloud(project as CloudProject)); + } else { + tests.push(await runSyncRulesTestSelfHosted(project as SelfHostedProject)); + } + + const result: ValidationResult = { + passed: tests.every((t) => t.passed), + tests + }; + + if (flags.output === 'json') { + this.log(formatValidationJson(result)); + } else if (flags.output === 'yaml') { + this.log(formatValidationYaml(result)); + } else { + this.log(formatValidationHuman(result)); + } + + if (!result.passed) { + this.exit(1); + } } } From 5a916c185f16f7f258b70c682b39a50ede960801 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 13:06:53 +0200 Subject: [PATCH 015/141] update docs --- docs/usage.md | 199 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 188 insertions(+), 11 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index e944840..aa9c8e6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,17 +1,163 @@ -# Pulling an Existing Project For Config +# How the CLI Works + +The PowerSync CLI operates against **PowerSync instances**. How you point the CLI at instances depends on whether you intend to work with local config management or run one-off commands on an instance which's configuration is managed by other means - e.g. the PowerSync dashboard. + +## Local configuration + +It is possible to manage and deploy updates to instances entirely from the CLI. Local files are used to store the configuration state in a folder relative to your current working directory. By default this folder is `powersync/`. It holds schema, sync rules, and other YAML config. You can use a different folder via the `--directory` flag when supported. + +## Linking to a project + +You can **explicitly link** your local config to a cloud or self-hosted project. Running `powersync link [cloud|self-hosted]` creates a persisted **link file** (e.g. `powersync/link.yaml`) that stores the instance information. Once linked, cloud commands in that directory use this context so you don’t need to pass IDs every time. This is the usual workflow when you develop against a single instance and keep config on disk. + +## Supplying instance information without local config + +For commands that don’t require locally stored config (or when you don’t want to use it), you can supply **instance information** in either of these ways: + +- **Inline as flags** + - **Cloud:** `--instance-id`, `--org-id`, `--project-id` + - **Self-hosted:** `--api-url`, `--api-key` +- **Environment variables** + - **Cloud:** `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` + - **Self-hosted:** `API_URL`, `PS_TOKEN` (token used as API key) + +That lets you run one-off or scripted operations (e.g. generating a development token, generating client side schemas) without creating or using a `powersync/` folder or a link file. + +**Cloud and self-hosted:** These same patterns (local config folder, linking via a link file, and supplying instance information via flags or environment variables) apply to both PowerSync Cloud instances and self-hosted instances. Self-hosted instances use the same link file and resolution order; only the way you authenticate or target the instance may differ. + +## Configuring multiple instances (e.g. dev, staging, production) + +When you have development, staging, and production instances, you can structure your project in a few ways: + +**Multiple directories, each linked to one instance** + +Use separate config directories (e.g. `powersync`, `powersync-dev`, `powersync-staging`). Each directory has its own `link.yaml` pointing at a different instance. Use `--directory` to run commands against a specific environment: + +```bash +powersync deploy --directory=powersync # production (linked in powersync/link.yaml) +powersync deploy --directory=powersync-dev # dev (linked in powersync-dev/link.yaml) +powersync deploy --directory=powersync-staging # staging (linked in powersync-staging/link.yaml) +``` + +**Single directory and link file, with `!env` substitution** + +Use a single `powersync/` folder and a single `link.yaml`, and use the **`!env`** custom tag in your YAML to substitute values from the environment. That way you can keep one set of config files and one link file, while varying things like instance IDs, API URLs, or database URLs per environment (e.g. production database URL from an env var). Both the link file and the main config (e.g. `service.yaml`) can use `!env` so that the same repo works for dev, staging, and prod by changing only environment variables. + +Example in **link.yaml** (cloud — instance resolved from env): + +```yaml +type: cloud +instance_id: !env MY_INSTANCE_ID_VAR +org_id: !env MY_ORG_ID_VAR +project_id: !env MY_PROJECT_ID_VAR +``` + +Or for self-hosted: + +```yaml +type: self-hosted +api_url: !env API_URL +api_key: !env TOKEN +``` + +In **service.yaml** (or other config), use `!env` for secrets and environment-specific values such as database URLs: + +```yaml +# database connection example +# uri: !env PS_DATA_SOURCE_URI +# password: !env PS_DATABASE_PASSWORD +``` + +You can cast to number or boolean with `::number` or `::boolean`, e.g. `!env PS_PORT::number`. + +The sections below split usage by **Cloud** and **Self-hosted**, then provide reference for authentication and supplying instance information. + +--- + +# Cloud usage + +Authentication is usually the first step. Use `powersync login` to store a token in secure storage (e.g. macOS Keychain), or set the `PS_TOKEN` environment variable if you prefer not to persist the token. See [Authentication (Tokens)](#authentication-tokens) for details. + +There are three main ways to use the CLI with PowerSync Cloud: + +## 1. Executing commands on an existing instance (no local config management) + +You can run commands against an instance whose configuration is managed elsewhere (e.g. the PowerSync Dashboard). Link the instance once so the CLI knows which one to use, or pass instance identifiers via flags or environment variables each time. + +**Link an instance** (from a project directory, or create a `powersync/` folder first with `powersync init --type=cloud`): + +```bash +powersync login +powersync link cloud --instance-id= --org-id= --project-id= +``` + +Then run commands without passing IDs again, for example: + +```bash +# Generate client-side schema from the instance +powersync generate schema + +# Generate a development token for connecting clients +powersync generate token +``` + +You can also supply `--instance-id`, `--org-id`, and `--project-id` (or the corresponding environment variables) on individual commands if you don’t want to link. + +## 2. Pulling and managing existing config + +Pull the current instance config into local YAML files, edit them, then deploy changes back. Use this when you want to manage configuration and sync rules from the CLI. ```bash powersync login -# IDs taken from the PowerSync Dashboard URL -powersync pull config --org-id=5cc84a3ccudjfhgytw0c08b --project-id=6703fd8a3cfe3000hrydg463 --instance-id=688736sdfcfb46688f509bd0 +# IDs from the PowerSync Dashboard URL +# Pulling a config links a project (if not linked previously). +powersync pull config --org-id= --project-id= --instance-id= + +# Edit the YAML files in powersync/ as needed (schema, sync rules, etc.) -# Make any required changes to the YAML files in the powersync/ directory. +# Optionally validate before deploying +powersync validate # Deploy changes powersync deploy ``` +## 3. Creating a new instance from the CLI + +Use `powersync init` to copy a template config into your project. Edit the generated YAML files, then link, validate, and deploy. + +```bash +powersync init --type=cloud +# Edit powersync/*.yaml as needed +powersync link cloud --instance-id= --org-id= --project-id= +powersync validate +powersync deploy +``` + +> **TODO:** Instances still need to be created in the PowerSync Dashboard before you can link and deploy to them. Creating an instance from the CLI is planned for a future release. + +--- + +# Self-hosted usage + +Use `powersync init --type=self-hosted` to create a basic template for self-hosted configuration. The template is copied into your project directory (default `powersync/`). You need to **uncomment and specify your own config** (e.g. database connection, sync rules) in the generated YAML files. + +For deploying the service (e.g. to Docker or another hosting platform), see the [PowerSync self-hosting docs](https://docs.powersync.com/intro/self-hosting#self-hosting) and the [self-host-demo](https://github.com/powersync-ja/self-host-demo) repository for examples and patterns. We plan to support more of these actions from the CLI in the future. + +Once your self-hosted instance is deployed and reachable, you can **link** it and run supported commands against it. The **api-url** is the URL that the running PowerSync instance is exposed from; this is configured by your deployment (e.g. Docker, Coolify, or your hosting platform). + +```bash +powersync link self-hosted --api-url=https://your-powersync.example.com --api-key="!env YOUR_TOKEN_ENV_VAR" +powersync generate schema +powersync generate token +# ... other supported commands +``` + +Use `--api-url` and `--api-key` (or `API_URL` and `PS_TOKEN`) when you prefer not to link; see [Supplying linking information](#supplying-linking-information-for-cloud-and-self-hosted-commands) below. + +--- + # Authentication (Tokens) Cloud commands need an auth token (e.g. a PowerSync PAT). You can supply it in two ways; the CLI uses the first that is available: @@ -42,19 +188,25 @@ powersync fetch config Login is supported on macOS (other platforms coming soon). If you use another platform or prefer not to store the token, set `PS_TOKEN` in the environment instead. -# Supplying Linking Information for Cloud Commands +# Supplying Linking Information for Cloud and Self-Hosted Commands -Cloud commands (`deploy`, `destroy`, `stop`, `fetch config`, `pull config`) need instance, org, and project IDs. You can supply them in three ways; the CLI uses the first that is available: +Cloud and self-hosted commands (`deploy`, `destroy`, `stop`, `fetch config`, `pull config`, etc.) need instance (and for cloud, org and project) identifiers. The same three methods apply to both: the CLI uses the first that is available (flags override environment variables, environment variables override link file): -1. **Flags** — `--instance-id`, `--org-id`, `--project-id` on the command -2. **link.yaml** — a `powersync/link.yaml` file in the project (written by `powersync link cloud`) -3. **Environment variables** — `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` +1. **Flags** + - **Cloud:** `--instance-id`, `--org-id`, `--project-id` + - **Self-hosted:** `--api-url`, `--api-key` +2. **Environment variables** + - **Cloud:** `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` + - **Self-hosted:** `API_URL`, `PS_TOKEN` (API key) +3. **link.yaml** — a `powersync/link.yaml` file in the project (written by `powersync link cloud` or `powersync link self-hosted`) --- ## Method 1: Flags (one-off or override) -Pass the IDs on each command. Useful for one-off runs or to override the current context. +Pass the identifiers on each command. Useful for one-off runs or to override the current context. + +**Cloud:** ```bash powersync login @@ -66,10 +218,20 @@ powersync stop --confirm=yes \ --project-id=6703fd8a3cfe3000hrydg463 ``` +**Self-hosted:** + +```bash +powersync fetch config --api-url=https://powersync.example.com --api-key=your-token +``` + You can use a different project directory with `--directory`: ```bash +# Cloud powersync stop --confirm=yes --directory=my-powersync --instance-id=... --org-id=... --project-id=... + +# Self-hosted +powersync fetch config --directory=my-powersync --api-url=https://... --api-key=... ``` --- @@ -103,7 +265,9 @@ powersync stop --confirm=yes --directory=my-powersync ## Method 3: Environment variables -Set IDs in the environment when you don’t want to link the directory or pass flags every time (e.g. CI or scripts). +Set identifiers in the environment when you don’t want to link the directory or pass flags every time (e.g. CI or scripts). + +**Cloud:** ```bash export INSTANCE_ID=688736sdfcfb46688f509bd0 @@ -114,10 +278,23 @@ powersync stop --confirm=yes powersync fetch config --output=json ``` +**Self-hosted:** + +```bash +export API_URL=https://powersync.example.com +export PS_TOKEN=your-api-key + +powersync fetch config --output=json +``` + Inline for a single command: ```bash +# Cloud INSTANCE_ID=... ORG_ID=... PROJECT_ID=... powersync stop --confirm=yes + +# Self-hosted +API_URL=https://... PS_TOKEN=... powersync fetch config --output=json ``` **Note:** Environment variables are only used when neither flags nor `link.yaml` provide linking information. From 874e4d42e87a64700410df9a7be5d5342245fc8f Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 13:30:32 +0200 Subject: [PATCH 016/141] Support for naming and creating cloud instances --- docs/usage.md | 11 ++-- .../src/api/cloud/create-cloud-instance.ts | 30 +++++++++++ packages/cli/src/commands/deploy.ts | 2 + packages/cli/src/commands/init.ts | 4 +- packages/cli/src/commands/link/cloud.ts | 54 +++++++++++++++++-- .../templates/cloud/powersync/service.yaml | 1 + .../cli/test/utils/cloud-client-factory.ts | 3 +- packages/schemas/src/CLIConfig.ts | 4 +- 8 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 packages/cli/src/api/cloud/create-cloud-instance.ts diff --git a/docs/usage.md b/docs/usage.md index aa9c8e6..214c3c0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -125,17 +125,20 @@ powersync deploy ## 3. Creating a new instance from the CLI -Use `powersync init` to copy a template config into your project. Edit the generated YAML files, then link, validate, and deploy. +Use `powersync init` to copy a template config into your project. To **create a new Cloud instance** and link it, use `powersync link cloud --create` with `--org-id` and `--project-id` (do not pass `--instance-id`). The CLI creates the instance and writes the link file. + +The instance **name** and **region** are taken from your local config (`powersync/service.yaml`). Set or edit the `name` and `region` fields there before running `link cloud --create` if you want a specific display name and region. ```bash +powersync login powersync init --type=cloud -# Edit powersync/*.yaml as needed -powersync link cloud --instance-id= --org-id= --project-id= +# Edit powersync/service.yaml (name, region, connections, etc.) and other YAML as needed +powersync link cloud --create --org-id= --project-id= powersync validate powersync deploy ``` -> **TODO:** Instances still need to be created in the PowerSync Dashboard before you can link and deploy to them. Creating an instance from the CLI is planned for a future release. +To link to an **existing** instance instead, omit `--create` and supply `--instance-id` together with `--org-id` and `--project-id`. --- diff --git a/packages/cli/src/api/cloud/create-cloud-instance.ts b/packages/cli/src/api/cloud/create-cloud-instance.ts new file mode 100644 index 0000000..ff2e019 --- /dev/null +++ b/packages/cli/src/api/cloud/create-cloud-instance.ts @@ -0,0 +1,30 @@ +import type { PowerSyncManagementClient } from '@powersync/management-client'; + +export type CreateCloudInstanceOptions = { + orgId: string; + projectId: string; + name: string; + region: string; +}; + +export type CreateCloudInstanceResult = { + instanceId: string; +}; + +/** + * Creates a new PowerSync Cloud instance in the given org and project. + * Uses the management API (e.g. createInstance). Caller should handle errors. + */ +export async function createCloudInstance( + client: PowerSyncManagementClient, + options: CreateCloudInstanceOptions +): Promise { + const { orgId, projectId, name, region } = options; + const result = await client.createInstance({ + org_id: orgId, + app_id: projectId, + name, + region + }); + return { instanceId: result.id }; +} diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 989037b..5dcb068 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -125,6 +125,8 @@ export default class Deploy extends CloudInstanceCommand { // Spread the existing config like name, and program version contraints. // Should we allow specifying these in the config file? ...existingConfig, + // Allow updating the instance name + name: config.name, app_id: linked.project_id, config, sync_rules: syncRulesContent diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 7562820..56f8dfa 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -49,7 +49,9 @@ export default class Init extends PowerSyncCommand { mkdirSync(targetDir, { recursive: true }); cpSync(templatePath, targetDir, { recursive: true }); - const cloudInstructions = ['To deploy to PowerSync Cloud, run:', 'powersync link', 'powersync deploy'].join('\n'); + const cloudInstructions = ['To deploy to PowerSync Cloud, run:', 'powersync link cloud', 'powersync deploy'].join( + '\n' + ); const selfHostedInstructions = [ 'Self Hosted projects currently require external configuration for starting and deploying.', diff --git a/packages/cli/src/commands/link/cloud.ts b/packages/cli/src/commands/link/cloud.ts index 6d1e62a..7d5eac1 100644 --- a/packages/cli/src/commands/link/cloud.ts +++ b/packages/cli/src/commands/link/cloud.ts @@ -1,5 +1,6 @@ import { Flags } from '@oclif/core'; +import { createCloudInstance } from '../../api/cloud/create-cloud-instance.js'; import { writeCloudLink } from '../../api/cloud/write-cloud-link.js'; import { CloudInstanceCommand } from '../../command-types/CloudInstanceCommand.js'; import { InstanceCommand } from '../../command-types/InstanceCommand.js'; @@ -11,11 +12,15 @@ export default class LinkCloud extends CloudInstanceCommand { static description = 'Link this directory to a PowerSync Cloud instance.'; static summary = 'Link to PowerSync Cloud (instance ID, org, project).'; static flags = { - // These are required for the linking command + create: Flags.boolean({ + description: + 'Create a new Cloud instance in the given org and project, then link. Do not supply --instance-id when using --create.', + default: false + }), 'instance-id': Flags.string({ - description: 'PowerSync Cloud instance ID.', + description: 'PowerSync Cloud instance ID. Omit when using --create.', default: env.INSTANCE_ID, - required: true + required: false }), 'org-id': Flags.string({ description: 'Organization ID.', @@ -32,7 +37,48 @@ export default class LinkCloud extends CloudInstanceCommand { async run(): Promise { const { flags } = await this.parse(LinkCloud); - const { directory, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; + const { directory, create, 'instance-id': instanceId, 'org-id': orgId, 'project-id': projectId } = flags; + + const project = this.loadProject(flags, { configFileRequired: false, linkingIsRequired: false }); + if (create) { + if (instanceId) { + this.error('Do not supply --instance-id when using --create. The instance will be created and linked.', { + exit: 1 + }); + } + const config = this.parseConfig(project.projectDirectory); + const client = await this.getClient(); + let newInstanceId: string; + try { + const result = await createCloudInstance(client, { + orgId, + projectId, + name: config.name, + region: config.region + }); + newInstanceId = result.instanceId; + } catch (error) { + this.error(`Failed to create Cloud instance: ${error}`, { exit: 1 }); + } + const projectDir = this.ensureProjectDirExists({ directory }); + ensureServiceTypeMatches({ + command: this, + configRequired: false, + directoryLabel: directory, + expectedType: 'cloud', + projectDir + }); + writeCloudLink(projectDir, { instanceId: newInstanceId, orgId, projectId }); + this.log(`Created Cloud instance ${newInstanceId} and updated ${directory}/${LINK_FILENAME}.`); + return; + } + + if (!instanceId) { + this.error( + 'Linking requires an instance ID. Supply --instance-id (or use --create to create a new instance and link).', + { exit: 1 } + ); + } const projectDir = this.ensureProjectDirExists({ directory }); ensureServiceTypeMatches({ diff --git a/packages/cli/templates/cloud/powersync/service.yaml b/packages/cli/templates/cloud/powersync/service.yaml index a282fcc..1eb8158 100644 --- a/packages/cli/templates/cloud/powersync/service.yaml +++ b/packages/cli/templates/cloud/powersync/service.yaml @@ -11,6 +11,7 @@ # ----------------------------------------------------------------------------- _type: cloud +name: My instance # region (required): deployment region, e.g. us # Note: This cannot be changed after the initial deployment diff --git a/packages/cli/test/utils/cloud-client-factory.ts b/packages/cli/test/utils/cloud-client-factory.ts index 48aba5b..1600349 100644 --- a/packages/cli/test/utils/cloud-client-factory.ts +++ b/packages/cli/test/utils/cloud-client-factory.ts @@ -5,7 +5,8 @@ import { vi } from 'vitest'; const stub: PowerSyncManagementClient = { getInstanceConfig: vi.fn(), getInstanceDiagnostics: vi.fn(), - getInstanceStatus: vi.fn() + getInstanceStatus: vi.fn(), + createInstance: vi.fn() } as unknown as PowerSyncManagementClient; /** diff --git a/packages/schemas/src/CLIConfig.ts b/packages/schemas/src/CLIConfig.ts index b56ab4c..ff744f5 100644 --- a/packages/schemas/src/CLIConfig.ts +++ b/packages/schemas/src/CLIConfig.ts @@ -4,7 +4,9 @@ import * as t from 'ts-codec'; export const CLICloudConfig = t .object({ - _type: t.literal('cloud') + _type: t.literal('cloud'), + /** The instance name */ + name: t.string }) .and(BasePowerSyncHostedConfig); export type CLICloudConfig = t.Encoded; From 78fcb42ce42b69b5d156cec4697a84126871a2e7 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 13:51:40 +0200 Subject: [PATCH 017/141] cleanup token input --- docs/usage.md | 20 +++++++------ packages/cli/package.json | 1 + packages/cli/src/clients/CloudClient.ts | 2 +- .../SelfHostedInstanceCommand.ts | 27 +++++++---------- .../command-types/SharedInstanceCommand.ts | 9 +++--- packages/cli/src/commands/link/self-hosted.ts | 16 +++++----- packages/cli/src/commands/login.ts | 20 ++++++------- packages/cli/test/commands/link.test.ts | 29 +++++++++++-------- packages/cli/test/commands/login.test.ts | 28 +++++++++++++----- 9 files changed, 84 insertions(+), 68 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 214c3c0..5040f8b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -16,7 +16,7 @@ For commands that don’t require locally stored config (or when you don’t wan - **Inline as flags** - **Cloud:** `--instance-id`, `--org-id`, `--project-id` - - **Self-hosted:** `--api-url`, `--api-key` + - **Self-hosted:** `--api-url` (API key is not accepted via flags; use link command or `PS_TOKEN` env var) - **Environment variables** - **Cloud:** `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` - **Self-hosted:** `API_URL`, `PS_TOKEN` (token used as API key) @@ -151,13 +151,14 @@ For deploying the service (e.g. to Docker or another hosting platform), see the Once your self-hosted instance is deployed and reachable, you can **link** it and run supported commands against it. The **api-url** is the URL that the running PowerSync instance is exposed from; this is configured by your deployment (e.g. Docker, Coolify, or your hosting platform). ```bash -powersync link self-hosted --api-url=https://your-powersync.example.com --api-key="!env YOUR_TOKEN_ENV_VAR" +powersync link self-hosted --api-url=https://your-powersync.example.com +# You will be prompted for the API key, or set PS_TOKEN so the link file can use !env PS_TOKEN powersync generate schema powersync generate token # ... other supported commands ``` -Use `--api-url` and `--api-key` (or `API_URL` and `PS_TOKEN`) when you prefer not to link; see [Supplying linking information](#supplying-linking-information-for-cloud-and-self-hosted-commands) below. +Use `--api-url` with link file or `API_URL` and `PS_TOKEN` when you prefer not to link; see [Supplying linking information](#supplying-linking-information-for-cloud-and-self-hosted-commands) below. --- @@ -184,7 +185,8 @@ PS_TOKEN=your-token-here powersync fetch config --output=json **Stored via login** — convenient for local use; token is stored securely and reused: ```bash -powersync login --token=your-token-here +powersync login +# You will be prompted for your token (not shown in shell history) # Later commands use the stored token powersync fetch config ``` @@ -197,7 +199,7 @@ Cloud and self-hosted commands (`deploy`, `destroy`, `stop`, `fetch config`, `pu 1. **Flags** - **Cloud:** `--instance-id`, `--org-id`, `--project-id` - - **Self-hosted:** `--api-url`, `--api-key` + - **Self-hosted:** `--api-url` only (API key from env or link file only) 2. **Environment variables** - **Cloud:** `INSTANCE_ID`, `ORG_ID`, `PROJECT_ID` - **Self-hosted:** `API_URL`, `PS_TOKEN` (API key) @@ -221,10 +223,10 @@ powersync stop --confirm=yes \ --project-id=6703fd8a3cfe3000hrydg463 ``` -**Self-hosted:** +**Self-hosted:** Set `PS_TOKEN` (or use a linked project with API key in link.yaml), then: ```bash -powersync fetch config --api-url=https://powersync.example.com --api-key=your-token +powersync fetch config --api-url=https://powersync.example.com ``` You can use a different project directory with `--directory`: @@ -233,8 +235,8 @@ You can use a different project directory with `--directory`: # Cloud powersync stop --confirm=yes --directory=my-powersync --instance-id=... --org-id=... --project-id=... -# Self-hosted -powersync fetch config --directory=my-powersync --api-url=https://... --api-key=... +# Self-hosted (API key from PS_TOKEN or link.yaml) +powersync fetch config --directory=my-powersync --api-url=https://... ``` --- diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a55763..02eb72a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -8,6 +8,7 @@ }, "bugs": "https://github.com/powersync-ja/cli/issues", "dependencies": { + "@inquirer/prompts": "^7.2.0", "@journeyapps-labs/common-sdk": "1.0.2", "@oclif/core": "^4", "@oclif/plugin-help": "^6", diff --git a/packages/cli/src/clients/CloudClient.ts b/packages/cli/src/clients/CloudClient.ts index e5c9b89..4a3877c 100644 --- a/packages/cli/src/clients/CloudClient.ts +++ b/packages/cli/src/clients/CloudClient.ts @@ -12,7 +12,7 @@ export async function createCloudClient(): Promise { const token = env.PS_TOKEN || (await storage.getToken()); if (!token) { throw new Error( - 'Not logged in. Run `powersync login --token=` to authenticate. Login is supported on macOS (other platforms coming soon).' + 'Not logged in. Run `powersync login` to authenticate (you will be prompted for your token). Login is supported on macOS (other platforms coming soon).' ); } return new PowerSyncManagementClient({ diff --git a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts index 3844441..d8d3b67 100644 --- a/packages/cli/src/command-types/SelfHostedInstanceCommand.ts +++ b/packages/cli/src/command-types/SelfHostedInstanceCommand.ts @@ -4,7 +4,8 @@ import { existsSync } from 'node:fs'; import { join } from 'node:path'; import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; import { env } from '../utils/env.js'; -import { LINK_FILENAME, loadLinkDocument, loadServiceDocument, SERVICE_FILENAME } from '../utils/project-config.js'; +import { LINK_FILENAME, loadServiceDocument, SERVICE_FILENAME } from '../utils/project-config.js'; +import { parseYamlFile } from '../utils/yaml.js'; import { HelpGroup } from './HelpGroup.js'; import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; @@ -21,17 +22,16 @@ export type SelfHostedInstanceCommandFlags = Interfaces.InferredFlags< * Base command for operations that require a self-hosted PowerSync project (service.yaml _type: self-hosted). * * Instance context (api_url, api_key) is resolved in this order: - * 1. Command-line flags (--api-url, --api-key) - * 2. Environment variables (API_URL, PS_TOKEN) - * 3. Linked config from link.yaml + * 1. Environment variables (API_URL, PS_TOKEN) + * 2. Linked config from link.yaml + * + * API key is never accepted via command-line flags to avoid storing credentials in shell history. * * @example * # Use linked project (link.yaml) * pnpm exec powersync some-self-hosted-cmd * # Override with env * API_URL=... PS_TOKEN=... pnpm exec powersync some-self-hosted-cmd - * # Override with flags - * pnpm exec powersync some-self-hosted-cmd --api-url=https://... --api-key=... */ export abstract class SelfHostedInstanceCommand extends InstanceCommand { static flags = { @@ -40,11 +40,6 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { description: 'PowerSync API URL. Resolved: flag → API_URL → link.yaml.', required: false, helpGroup: HelpGroup.SELF_HOSTED_PROJECT - }), - 'api-key': Flags.string({ - description: 'PowerSync API key (self-hosted). Resolved: flag → PS_TOKEN → link.yaml.', - required: false, - helpGroup: HelpGroup.SELF_HOSTED_PROJECT }) }; @@ -63,16 +58,16 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { let rawLink: Record | null = null; if (existsSync(linkPath)) { try { - const doc = loadLinkDocument(linkPath); + const doc = parseYamlFile(linkPath); rawLink = doc.contents?.toJSON() as Record; } catch { rawLink = null; } } - // Resolved per field: flags → env → link file + // Resolved per field: flags (api-url only) → env → link file. API key from env or link file only (no flag). const api_url = flags['api-url'] ?? env.API_URL ?? (rawLink?.api_url as string | undefined); - const api_key = flags['api-key'] ?? env.PS_TOKEN ?? (rawLink?.api_key as string | undefined); + const api_key = env.PS_TOKEN ?? (rawLink?.api_key as string | undefined); let linked: RequiredSelfHostedLinkConfig | null = null; try { @@ -84,7 +79,7 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { } catch (error) { if (options?.linkingIsRequired) { this.error( - `Linking is required before using this command. Provide --api-url and --api-key, set API_URL and PS_TOKEN, or link the project first. ${error}`, + `Linking is required before using this command. Set API_URL and PS_TOKEN, or link the project first (link.yaml). ${error}`, { exit: 1 } ); } @@ -94,7 +89,7 @@ export abstract class SelfHostedInstanceCommand extends InstanceCommand { this.error( [ 'Linking is required before using this command.', - 'Provide --api-url and --api-key, set API_URL and PS_TOKEN, or link the project first.' + 'Set API_URL and PS_TOKEN, or link the project first (link.yaml).' ].join('\n'), { exit: 1 } ); diff --git a/packages/cli/src/command-types/SharedInstanceCommand.ts b/packages/cli/src/command-types/SharedInstanceCommand.ts index 8d9d034..fe5cb35 100644 --- a/packages/cli/src/command-types/SharedInstanceCommand.ts +++ b/packages/cli/src/command-types/SharedInstanceCommand.ts @@ -14,11 +14,11 @@ import { ensureServiceTypeMatches } from '../utils/ensureServiceType.js'; import { env } from '../utils/env.js'; import { LINK_FILENAME, - loadLinkDocument, loadServiceDocument, SERVICE_FILENAME, SYNC_FILENAME } from '../utils/project-config.js'; +import { parseYamlFile } from '../utils/yaml.js'; import { CloudProject } from './CloudInstanceCommand.js'; import { HelpGroup } from './HelpGroup.js'; import { EnsureConfigOptions, InstanceCommand } from './InstanceCommand.js'; @@ -39,7 +39,7 @@ export type SharedInstanceCommandFlags = Interfaces.InferredFlags< * - If neither set: type is taken from link.yaml (if present). * * 2. **Per-field values** (instance_id, org_id, project_id for cloud; api_url, api_key for self-hosted): - * - Flags (e.g. --instance-id, --api-url) → environment variables (INSTANCE_ID, API_URL, etc.) → link.yaml. + * - Cloud: flags → env → link.yaml. Self-hosted: api_url from flag → env → link.yaml; api_key from env → link.yaml only (no flag). * * @example * # Use linked project (link.yaml determines cloud vs self-hosted) @@ -98,9 +98,8 @@ export abstract class SharedInstanceCommand extends InstanceCommand { // If type not set by flags/env, use link file type (if present). let rawLinkConfig: LinkConfig | null = null; - // check if the link file exists if (existsSync(linkPath)) { - const doc = loadLinkDocument(linkPath); + const doc = parseYamlFile(linkPath); rawLinkConfig = LinkConfig.decode(doc.contents?.toJSON()); if (rawLinkConfig.type === 'self-hosted') { projectType = 'self-hosted'; @@ -126,7 +125,7 @@ export abstract class SharedInstanceCommand extends InstanceCommand { try { linkConfig = RequiredSelfHostedLinkConfig.decode({ ..._rawSelfHostedLinkConfig, - api_key: flags['api-key'] ?? env.PS_TOKEN ?? _rawSelfHostedLinkConfig.api_key!, + api_key: env.PS_TOKEN ?? _rawSelfHostedLinkConfig.api_key!, api_url: flags['api-url'] ?? env.API_URL ?? _rawSelfHostedLinkConfig.api_url! }); } catch (error) { diff --git a/packages/cli/src/commands/link/self-hosted.ts b/packages/cli/src/commands/link/self-hosted.ts index ecdc4ea..78d1a8b 100644 --- a/packages/cli/src/commands/link/self-hosted.ts +++ b/packages/cli/src/commands/link/self-hosted.ts @@ -1,3 +1,4 @@ +import { input } from '@inquirer/prompts'; import { Flags } from '@oclif/core'; import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; @@ -9,22 +10,18 @@ import { LINK_FILENAME, loadLinkDocument } from '../../utils/project-config.js'; export default class LinkSelfHosted extends SelfHostedInstanceCommand { static description = 'Link this directory to a self-hosted PowerSync instance.'; - static summary = 'Link to self-hosted PowerSync (API URL and token).'; + static summary = 'Link to self-hosted PowerSync (API URL; API key from PS_TOKEN env).'; static flags = { 'api-url': Flags.string({ description: 'Self-hosted PowerSync API base URL (e.g. https://powersync.example.com).', required: true }), - 'api-key': Flags.string({ - description: 'API key / token for the self-hosted instance.', - default: '!env POWERSYNC_API_KEY' - }), ...InstanceCommand.flags }; async run(): Promise { const { flags } = await this.parse(LinkSelfHosted); - const { directory, 'api-url': apiUrl, 'api-key': apiKey } = flags; + const { directory, 'api-url': apiUrl } = flags; const projectDir = this.ensureProjectDirExists(flags); ensureServiceTypeMatches({ @@ -35,11 +32,16 @@ export default class LinkSelfHosted extends SelfHostedInstanceCommand { projectDir }); + const apiKey = await input({ + message: 'API key (default: !env PS_TOKEN — read from PS_TOKEN when running commands):', + default: '!env PS_TOKEN' + }); + const linkPath = join(projectDir, LINK_FILENAME); const doc = loadLinkDocument(linkPath); doc.set('type', 'self-hosted'); doc.set('api_url', apiUrl); - doc.set('api_key', apiKey); + doc.set('api_key', apiKey.trim() || '!env PS_TOKEN'); writeFileSync(linkPath, doc.toString(), 'utf8'); this.log(`Updated ${directory}/${LINK_FILENAME} with self-hosted link.`); } diff --git a/packages/cli/src/commands/login.ts b/packages/cli/src/commands/login.ts index 8d9d9ae..9e55f7e 100644 --- a/packages/cli/src/commands/login.ts +++ b/packages/cli/src/commands/login.ts @@ -1,4 +1,5 @@ -import { Command, Flags } from '@oclif/core'; +import { password } from '@inquirer/prompts'; +import { Command } from '@oclif/core'; import { getSecureStorage } from '../services/SecureStorage.js'; @@ -6,17 +7,16 @@ export default class Login extends Command { static description = 'Authenticate the CLI with PowerSync (e.g. PAT token).'; static summary = 'Authenticate the CLI with PowerSync (e.g. PAT token).'; - static flags = { - token: Flags.string({ - description: 'PowerSync auth token (e.g. PAT). Stored securely in the system keychain on macOS.', - required: true - }) - }; - async run(): Promise { - const { flags } = await this.parse(Login); + const token = await password({ + message: 'Enter your API token (https://docs.powersync.com/usage/tools/cli#personal-access-token):', + mask: true + }); + if (!token?.trim()) { + this.error('Token is required.', { exit: 1 }); + } const storage = getSecureStorage(); - await storage.setToken(flags.token); + await storage.setToken(token.trim()); this.log('Token stored successfully.'); } } diff --git a/packages/cli/test/commands/link.test.ts b/packages/cli/test/commands/link.test.ts index 68a689c..d573237 100644 --- a/packages/cli/test/commands/link.test.ts +++ b/packages/cli/test/commands/link.test.ts @@ -104,20 +104,25 @@ type: cloud describe('self-hosted', () => { let tmpDir: string; let origCwd: string; + let origPsToken: string | undefined; beforeEach(() => { origCwd = process.cwd(); + origPsToken = process.env.PS_TOKEN; tmpDir = mkdtempSync(join(tmpdir(), 'link-test-')); process.chdir(tmpDir); }); afterEach(() => { process.chdir(origCwd); + if (origPsToken !== undefined) process.env.PS_TOKEN = origPsToken; + else delete process.env.PS_TOKEN; if (tmpDir && existsSync(tmpDir)) rmSync(tmpDir, { recursive: true }); }); it('errors when directory does not exist', async () => { - const result = await runCommand('link self-hosted --url=https://ps.example.com --api-key=secret', { root }); + process.env.PS_TOKEN = 'secret'; + const result = await runCommand('link self-hosted --api-url=https://ps.example.com', { root }); expect(result.error?.message).toMatch( new RegExp(`Directory "${PROJECT_DIR}" not found. Run \`powersync init\` first to create the project.`) ); @@ -128,7 +133,8 @@ type: cloud const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); writeServiceYaml(projectDir, 'cloud'); - const result = await runCommand('link self-hosted --url=https://x.com --api-key=k', { root }); + process.env.PS_TOKEN = 'k'; + const result = await runCommand('link self-hosted --api-url=https://x.com', { root }); expect(result.error?.message).toMatch(/has `_type: cloud` but this command requires `_type: self-hosted`/); expect(result.error?.oclif?.exit).toBe(1); }); @@ -137,16 +143,15 @@ type: cloud const projectDir = join(tmpDir, PROJECT_DIR); mkdirSync(projectDir, { recursive: true }); writeServiceYaml(projectDir, 'self-hosted'); - const { stdout } = await runCommand('link self-hosted --url=https://sync.example.com --api-key=my-token', { - root - }); + process.env.PS_TOKEN = 'my-token'; + const { stdout } = await runCommand('link self-hosted --api-url=https://sync.example.com', { root }); expect(stdout).toContain(`Updated ${PROJECT_DIR}/${LINK_FILENAME} with self-hosted link.`); const linkPath = join(tmpDir, PROJECT_DIR, LINK_FILENAME); expect(existsSync(linkPath)).toBe(true); const linkYaml = parseYaml(readFileSync(linkPath, 'utf8')); expect(linkYaml.type).toBe('self-hosted'); expect(linkYaml.api_url).toBe('https://sync.example.com'); - expect(linkYaml.api_key).toBe('my-token'); + expect(linkYaml.api_key).toBe('!env PS_TOKEN'); }); it('updates existing link.yaml and preserves comments', async () => { @@ -158,24 +163,24 @@ type: cloud type: self-hosted `; writeFileSync(linkPath, withComments, 'utf8'); - await runCommand('link self-hosted --url=https://new.example.com --api-key=new-key', { root }); + process.env.PS_TOKEN = 'new-key'; + await runCommand('link self-hosted --api-url=https://new.example.com', { root }); const content = readFileSync(linkPath, 'utf8'); expect(content).toContain('# Self-hosted config'); const linkYaml = parseYaml(content); expect(linkYaml.type).toBe('self-hosted'); expect(linkYaml.api_url).toBe('https://new.example.com'); - expect(linkYaml.api_key).toBe('new-key'); + expect(linkYaml.api_key).toBe('!env PS_TOKEN'); }); it('respects --directory flag', async () => { const customDir = 'my-powersync'; mkdirSync(join(tmpDir, customDir), { recursive: true }); writeServiceYaml(join(tmpDir, customDir), 'self-hosted'); + process.env.PS_TOKEN = 'k'; const { stdout } = await runCommand( - `link self-hosted --directory=${customDir} --url=https://example.com --api-key=k`, - { - root - } + `link self-hosted --directory=${customDir} --api-url=https://example.com`, + { root } ); expect(stdout).toContain(`Updated ${customDir}/${LINK_FILENAME}`); const linkYaml = parseYaml(readFileSync(join(tmpDir, customDir, LINK_FILENAME), 'utf8')); diff --git a/packages/cli/test/commands/login.test.ts b/packages/cli/test/commands/login.test.ts index 1b2f4bc..75e93fc 100644 --- a/packages/cli/test/commands/login.test.ts +++ b/packages/cli/test/commands/login.test.ts @@ -1,11 +1,23 @@ -import { runCommand } from '@oclif/test' -import { describe, expect, it } from 'vitest' +import { runCommand } from '@oclif/test'; +import { describe, expect, it, vi } from 'vitest'; -import { root } from '../helpers/root.js' +import { root } from '../helpers/root.js'; -describe('login', () => { - it('runs login cmd', async () => { - const { stdout } = await runCommand('login', { root }) - expect(stdout).toContain('login: not yet implemented') +vi.mock('@inquirer/prompts', () => ({ + password: vi.fn(() => Promise.resolve('test-token')) +})); + +vi.mock('../../src/services/SecureStorage.js', () => ({ + getSecureStorage: () => ({ + getToken: () => Promise.resolve(null), + setToken: () => Promise.resolve(), + deleteToken: () => Promise.resolve() }) -}) +})); + +describe('login', () => { + it('prompts for token and stores it', async () => { + const { stdout } = await runCommand('login', { root }); + expect(stdout).toContain('Token stored successfully.'); + }); +}); From 321591cf92249c0fa78f23a09b391d7d8a74e4b2 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Fri, 6 Feb 2026 13:59:58 +0200 Subject: [PATCH 018/141] update commands' descriptions --- packages/cli/README.md | 361 ++++++++++++++---- packages/cli/src/commands/deploy.ts | 5 +- packages/cli/src/commands/destroy.ts | 5 +- packages/cli/src/commands/fetch/config.ts | 5 +- packages/cli/src/commands/fetch/index.ts | 5 +- packages/cli/src/commands/fetch/instances.ts | 9 +- packages/cli/src/commands/fetch/status.ts | 4 +- packages/cli/src/commands/generate/index.ts | 11 +- packages/cli/src/commands/generate/schema.ts | 4 +- packages/cli/src/commands/generate/token.ts | 4 +- packages/cli/src/commands/init.ts | 6 +- packages/cli/src/commands/link/cloud.ts | 11 +- packages/cli/src/commands/link/index.ts | 4 +- packages/cli/src/commands/link/self-hosted.ts | 5 +- packages/cli/src/commands/login.ts | 5 +- packages/cli/src/commands/migrate.ts | 5 +- packages/cli/src/commands/pull/config.ts | 4 +- packages/cli/src/commands/pull/index.ts | 5 +- packages/cli/src/commands/stop.ts | 4 +- packages/cli/src/commands/validate.ts | 5 +- pnpm-lock.yaml | 7 +- 21 files changed, 357 insertions(+), 117 deletions(-) diff --git a/packages/cli/README.md b/packages/cli/README.md index 405acd7..eb9cc86 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -7,60 +7,60 @@ CLI for PowerSync [![Downloads/week](https://img.shields.io/npm/dw/@powersync/cli.svg)](https://npmjs.org/package/@powersync/cli) - -- [@powersync/cli](#powersynccli) -- [Usage](#usage) -- [Commands](#commands) +* [@powersync/cli](#powersynccli) +* [Usage](#usage) +* [Commands](#commands) # Usage - ```sh-session $ npm install -g @powersync/cli $ powersync COMMAND running command... $ powersync (--version) -@powersync/cli/0.0.0 darwin-arm64 node-v22.22.0 +@powersync/cli/0.0.0 darwin-arm64 node-v24.13.0 $ powersync --help [COMMAND] USAGE $ powersync COMMAND ... ``` - # Commands - -- [`powersync deploy`](#powersync-deploy) -- [`powersync destroy`](#powersync-destroy) -- [`powersync fetch`](#powersync-fetch) -- [`powersync fetch config`](#powersync-fetch-config) -- [`powersync fetch instances`](#powersync-fetch-instances) -- [`powersync fetch status`](#powersync-fetch-status) -- [`powersync generate`](#powersync-generate) -- [`powersync generate schema`](#powersync-generate-schema) -- [`powersync generate token`](#powersync-generate-token) -- [`powersync help [COMMAND]`](#powersync-help-command) -- [`powersync init`](#powersync-init) -- [`powersync link`](#powersync-link) -- [`powersync login`](#powersync-login) -- [`powersync migrate`](#powersync-migrate) -- [`powersync plugins`](#powersync-plugins) -- [`powersync plugins add PLUGIN`](#powersync-plugins-add-plugin) -- [`powersync plugins:inspect PLUGIN...`](#powersync-pluginsinspect-plugin) -- [`powersync plugins install PLUGIN`](#powersync-plugins-install-plugin) -- [`powersync plugins link PATH`](#powersync-plugins-link-path) -- [`powersync plugins remove [PLUGIN]`](#powersync-plugins-remove-plugin) -- [`powersync plugins reset`](#powersync-plugins-reset) -- [`powersync plugins uninstall [PLUGIN]`](#powersync-plugins-uninstall-plugin) -- [`powersync plugins unlink [PLUGIN]`](#powersync-plugins-unlink-plugin) -- [`powersync plugins update`](#powersync-plugins-update) -- [`powersync stop`](#powersync-stop) -- [`powersync validate`](#powersync-validate) +* [`powersync deploy`](#powersync-deploy) +* [`powersync destroy`](#powersync-destroy) +* [`powersync fetch`](#powersync-fetch) +* [`powersync fetch config`](#powersync-fetch-config) +* [`powersync fetch instances`](#powersync-fetch-instances) +* [`powersync fetch status`](#powersync-fetch-status) +* [`powersync generate`](#powersync-generate) +* [`powersync generate schema`](#powersync-generate-schema) +* [`powersync generate token`](#powersync-generate-token) +* [`powersync help [COMMAND]`](#powersync-help-command) +* [`powersync init`](#powersync-init) +* [`powersync link`](#powersync-link) +* [`powersync link cloud`](#powersync-link-cloud) +* [`powersync link self-hosted`](#powersync-link-self-hosted) +* [`powersync login`](#powersync-login) +* [`powersync migrate`](#powersync-migrate) +* [`powersync plugins`](#powersync-plugins) +* [`powersync plugins add PLUGIN`](#powersync-plugins-add-plugin) +* [`powersync plugins:inspect PLUGIN...`](#powersync-pluginsinspect-plugin) +* [`powersync plugins install PLUGIN`](#powersync-plugins-install-plugin) +* [`powersync plugins link PATH`](#powersync-plugins-link-path) +* [`powersync plugins remove [PLUGIN]`](#powersync-plugins-remove-plugin) +* [`powersync plugins reset`](#powersync-plugins-reset) +* [`powersync plugins uninstall [PLUGIN]`](#powersync-plugins-uninstall-plugin) +* [`powersync plugins unlink [PLUGIN]`](#powersync-plugins-unlink-plugin) +* [`powersync plugins update`](#powersync-plugins-update) +* [`powersync pull`](#powersync-pull) +* [`powersync pull config`](#powersync-pull-config) +* [`powersync stop`](#powersync-stop) +* [`powersync validate`](#powersync-validate) ## `powersync deploy` @@ -68,7 +68,15 @@ Deploy sync rules and configuration changes. ``` USAGE - $ powersync deploy + $ powersync deploy [--directory ] [--instance-id ] [--org-id ] [--project-id ] + +PROJECT FLAGS + --directory= [default: powersync] Directory containing PowerSync config (default: powersync). + +CLOUD_PROJECT FLAGS + --instance-id= PowerSync Cloud instance ID. Manually passed if the current context has not been linked. + --org-id= Organization ID. Manually passed if the current context has not been linked. + --project-id= Project ID. Manually passed if the current context has not been linked. DESCRIPTION Deploy sync rules and configuration changes. @@ -76,7 +84,7 @@ DESCRIPTION Deploys changes to the PowerSync management service. Cloud only. ``` -_See code: [src/commands/deploy.ts](https://github.com/powersync-ja/powersync-js/https://github.com/powersync-ja/cli/blob/v0.0.0/src/commands/deploy.ts)_ +_See code: [src/commands/deploy.ts](https://github.com/powersync-ja/powersync-js/blob/v0.0.0/src/commands/deploy.ts)_ ## `powersync destroy` @@ -84,7 +92,20 @@ Destroy a PowerSync instance. ``` USAGE - $ powersync destroy + $ powersync destroy [--confirm yes] [--directory ] [--instance-id ] [--org-id ] + [--project-id ] + +FLAGS + --confirm=