pax_global_header00006660000000000000000000000064147172204330014515gustar00rootroot0000000000000052 comment=ae6e364781fedc817b1a29eddf4e485ea437843f golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/000077500000000000000000000000001471722043300244575ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.eslintignore000066400000000000000000000005621471722043300271650ustar00rootroot00000000000000node_modules/ dist/ lib/ build/ eslint/plugin-fig-linter/ integrations/commander/test/fixtures/*/output.ts integrations/commander/test/fixtures/*/expected.ts merge/test/fixtures/ cli/tools-cli/generated/ cli/tools-cli/test/*/fixtures/ helpers/test/fixtures/**/spec cli/create-completion-spec/bin/ cli/create-completion-spec/boilerplate cli/publish-spec/test/fixtures/** golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.eslintrc.js000066400000000000000000000016341471722043300267220ustar00rootroot00000000000000module.exports = { root: true, env: { es2021: true, }, extends: [ "airbnb/base", "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:import/typescript", "prettier", ], parser: "@typescript-eslint/parser", parserOptions: { ecmaVersion: 12, sourceType: "module", }, plugins: ["@typescript-eslint", "prettier"], rules: { "prettier/prettier": "error", "no-restricted-syntax": "off", "no-continue": "off", "no-shadow": "off", "@typescript-eslint/no-shadow": ["error"], "no-console": "off", "no-use-before-define": "off", "@typescript-eslint/no-use-before-define": ["error"], "@typescript-eslint/ban-ts-comment": "off", "import/extensions": "off", "import/prefer-default-export": "off", "import/no-extraneous-dependencies": ["error", { devDependencies: ["**/test/*"] }], "no-nested-ternary": "off", }, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/000077500000000000000000000000001471722043300260175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/dependabot.yml000066400000000000000000000006401471722043300306470ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" open-pull-requests-limit: 100 - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 100 groups: typescript-eslint: patterns: - "@typescript-eslint/*" types: patterns: - "@types/*" golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflows/000077500000000000000000000000001471722043300300545ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflows/lint.yml000066400000000000000000000007271471722043300315530ustar00rootroot00000000000000name: Lint packages on: workflow_dispatch: push: pull_request: jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Use Node.js v20 uses: actions/setup-node@v4 with: node-version: 20 - uses: pnpm/action-setup@v4 - name: Install dependencies and build # build is a postinstall script run: pnpm install --frozen-lockfile - name: Lint packages run: pnpm lint golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflows/test.yml000066400000000000000000000011131471722043300315520ustar00rootroot00000000000000name: Test packages on: workflow_dispatch: push: pull_request: jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [18.x, 20.x, 21.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - uses: pnpm/action-setup@v4 - name: Install dependencies and build # build is a postinstall script run: pnpm install --frozen-lockfile - name: Test packages run: pnpm test update-autocomplete-tools-spec.yaml000066400000000000000000000013131471722043300367260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflowsname: 'Update @withfig/autocomplete-tools spec' on: push: tags: - '@withfig/autocomplete-tools@*' workflow_dispatch: jobs: push-to-fig-autocomplete: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - uses: pnpm/action-setup@v4 - run: | pnpm install pnpm run --filter ./cli/tools-cli generate-spec > generated.ts - name: 'Create Autocomplete PR' uses: withfig/push-to-fig-autocomplete-action@v2 with: token: ${{ secrets.FIG_BOT_TOKEN }} autocomplete-spec-name: '@withfig/autocomplete-tools' spec-path: generated.ts integration: commander update-create-completion-spec-spec.yaml000066400000000000000000000013111471722043300374270ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflowsname: 'Update create-completion-spec spec' on: push: tags: - 'create-completion-spec@*' workflow_dispatch: jobs: push-to-fig-autocomplete: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - uses: pnpm/action-setup@v4 - run: | pnpm install pnpm run --filter ./cli/create-completion-spec generate-spec > generated.ts - name: 'Create Autocomplete PR' uses: withfig/push-to-fig-autocomplete-action@v2 with: token: ${{ secrets.FIG_BOT_TOKEN }} autocomplete-spec-name: 'create-completion-spec' spec-path: generated.ts integration: commander update-docs.yaml000066400000000000000000000006461471722043300330770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflowsname: Update Docs & Website on: workflow_dispatch: push: paths: - "types/index.d.ts" jobs: update-docs: if: github.ref == 'refs/heads/main' runs-on: "ubuntu-latest" steps: - name: Repository Dispatch uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.FIG_BOT_TOKEN }} repository: withfig/public-site-nextjs event-type: autocomplete-docs update-publish-spec-to-team-spec.yaml000066400000000000000000000017151471722043300370370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.github/workflowsname: 'Update @fig/publish-spec spec' on: push: tags: - '@fig/publish-spec@*' workflow_dispatch: jobs: run-integration-tests: runs-on: ubuntu-latest steps: - name: Repository Dispatch uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.FIG_BOT_TOKEN }} repository: withfig/publish-spec-to-team event-type: dependency-update push-to-fig-autocomplete: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - uses: pnpm/action-setup@v4 - run: | pnpm install pnpm run --filter ./cli/publish-spec generate-spec > generated.ts - name: 'Create Autocomplete PR' uses: withfig/push-to-fig-autocomplete-action@v2 with: token: ${{ secrets.FIG_BOT_TOKEN }} autocomplete-spec-name: '@fig/publish-spec' spec-path: generated.ts integration: commander golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.gitignore000066400000000000000000000001671471722043300264530ustar00rootroot00000000000000node_modules .DS_Store dist dist-ssr /*.local .eslintcache .fig/ build/ *.log .python-version __pycache__/ *.egg-info/ golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.husky/000077500000000000000000000000001471722043300257005ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.husky/pre-commit000077500000000000000000000001051471722043300276760ustar00rootroot00000000000000#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" pnpm pre-commit golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.node-version000066400000000000000000000000021471722043300270600ustar00rootroot0000000000000020golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.prettierrc.js000066400000000000000000000002161471722043300272550ustar00rootroot00000000000000/** @type {import("prettier").Config} */ module.exports = { printWidth: 100, singleQuote: false, semi: true, trailingComma: "es5", }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.vscode/000077500000000000000000000000001471722043300260205ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.vscode/extensions.json000066400000000000000000000001161471722043300311100ustar00rootroot00000000000000{ "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/.vscode/settings.json000066400000000000000000000012171471722043300305540ustar00rootroot00000000000000{ "editor.defaultFormatter": null, "[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[jsonc]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[css]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[html]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/CONTRIBUTING.md000066400000000000000000000046101471722043300267110ustar00rootroot00000000000000# Contributing to some autocomplete package Hey there! We are glad you want to contribute to some autocomplete package, hereby are mentioned some generic instructions, but you should refer to each package CONTRIBUTING.md file to learn more. - [`create-completion-spec`](cli/create-completion-spec/CONTRIBUTING.md) - [`@fig/publish-spec`](cli/publih-spec-to-team/CONTRIBUTING.md) - [`@withfig/autocomplete-tools`](cli/tools-cli/CONTRIBUTING.md) - [`@fig/eslint-config-autocomplete`](eslint/config-autocomplete/CONTRIBUTING.md) - [`@withfig/eslint-plugin-fig-linter`](eslint/plugin-fig-linter/CONTRIBUTING.md) - [`@fig/autocomplete-generators`](generators/CONTRIBUTING.md) - [`@fig/autocomplete-helpers`](helpers/CONTRIBUTING.md) - [`argparse_complete_fig`](integrations/argparse/CONTRIBUTING.md) - [`cement_complete_fig`](integrations/cement/CONTRIBUTING.md) - [`clap_complete_fig`](integrations/clap/CONTRIBUTING.md) - [`click_complete_fig`](integrations/click/CONTRIBUTING.md) - [`cobracompletefig`](integrations/cobra/CONTRIBUTING.md) - [`@fig/complete-commander`](integrations/commander/CONTRIBUTING.md) - [`@fig/complete-oclif`](integrations/oclif/CONTRIBUTING.md) - [`swift-argument-parser`](integrations/swift-argument-parser/CONTRIBUTING.md) - [`@fig/autocomplete-merge`](merge/CONTRIBUTING.md) - [`@fig/autocomplete-shared`](shared/CONTRIBUTING.md) - [`@withfig/autocomplete-types`](types/CONTRIBUTING.md) ## Generic workflow 1. Open an issue to get some feedback from the Fig team on your problem so that you don't risk to waste hours of work 2. Once you got some feedback you can fork the repo and clone in on your machine 3. Run `pnpm install` in the root of the monorepo to get the deps installed 4. Work on the new feature/fix, be sure to follow conventions 5. Add tests for the edits done , (run all the tests from the root of the repo using `pnpm test` or from each specific package using `pnpm run --filter ./ test`) 6. Push to your fork 7. Open a PR 8. Enjoy the feat/fix live! ## Structure of the repo We are using pnpm workspaces in this repo. All CLIs are under the cli/ folder, while most of the other packages are in the root of the repo. Concerning `npm` commands there are some global ones available from the root of the monorepo and some other relative to the packages. ## What is a good PR? A good PR should have tests if applicable and some kind of description telling what changes were done.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/LICENSE000066400000000000000000000020711471722043300254640ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/README.md000066400000000000000000000074351471722043300257470ustar00rootroot00000000000000# Fig Autocomplete-Tooling Repo This repo contains the source for all of Fig tools related with [autocomplete](https://github.com/withfig/autocomplete). 1. You can see the list of Fig's packages on the NPM registry here: https://www.npmjs.com/~withfig 2. You can see the source code and related README for each package in the `./packages` folder ## Packages - [`create-completion-spec`](cli/create-completion-spec/README.md) - [`@fig/publish-spec`](cli/publih-spec-to-team/README.md) - [`@withfig/autocomplete-tools`](cli/tools-cli/README.md) - [`@fig/eslint-config-autocomplete`](eslint/config-autocomplete/README.md) - [`@withfig/eslint-plugin-fig-linter`](eslint/plugin-fig-linter/README.md) - [`@fig/autocomplete-generators`](generators/README.md) - [`@fig/autocomplete-hooks`](hooks/README.md) - [`@fig/autocomplete-helpers`](helpers/README.md) - [`argparse_complete_fig`](integrations/argparse/README.md) - [`cement_complete_fig`](integrations/cement/README.md) - [`clap_complete_fig`](integrations/clap/README.md) - [`click_complete_fig`](integrations/click/README.md) - [`cobracompletefig`](integrations/cobra/README.md) - [`@fig/complete-commander`](integrations/commander/README.md) - [`@fig/complete-oclif`](integrations/oclif/README.md) - [`swift-argument-parser`](integrations/swift-argument-parser/README.md) - [`@fig/autocomplete-merge`](merge/README.md) - [`@fig/autocomplete-shared`](shared/README.md) - [`@withfig/autocomplete-types`](types/README.md) ## To publish a package: 1) Update the `package.json` `version` propery 2) Commit the updated `package.json` file to the origin repo 3) Git tag the commit you have just made using the following format and push the tag to the origin repo - The git tag should be: `@` - Example: `git tag @fig/publish-spec@1.2.3` 4) Run `pnpm publish ./` > **IMPORTANT**: remember to tag the new package version following the current conventions (see the previous tags of a package) > this is important for some workflows we are running and to keep track of when releases were done. > **IMPORTANT**: all packages need to be git tagged, not only npm ones! e.g. ```bash pnpm publish ./types ``` > Note: `` is not the name of the folder, but the name specified inside the package.json of the package to publish. ## Conventions for new CLI integration ### Package (integration) name - If namespaced it SHOULD be `@fig/complete[-_]($FRAMEWORK_NAME)` - If not namespaced it SHOULD be `($FRAMEWORK_NAME)[-_]complete[-_]fig` According to language conventions you can use a dash or an underscore to separate the words. Examples: - `@fig/complete-commander` - `@fig/complete-oclif` - `clap_complete_fig` - `cobracompletefig` ### Name of the default subcommand added to the CLI Most of our CLI integration tools allow to set the name of the subcommand added to the CLI but we also provide a default value for that. That default name MUST be `generate-fig-spec` such that running `$CLI generate-fig-spec` prints the spec. ### Function that adds the command The functions exported from the integration can: - Create a new framework subcommand which will print the spec when invoked - Generate a spec and return it In all the cases the names are standardized and SHOULD be: - `addCompletionSpecCommand` or `createCompletionSpecCommand` for functions creating a new subcommand - `generateCompletionSpec` for functions that return the spec as a string According to language conventions these function names can be transformed to snake case, etc... If the CLI tool integration gets added directly to the module of the CLI tool itself and the CLI tool is configured using chained methods (e.g. yargs), then the chain method name SHOULD be: - `.figCompletion()` ### Docs on `public-site-nextjs` Docs MUST conform to the rules listed above too.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/000077500000000000000000000000001471722043300252265ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/000077500000000000000000000000001471722043300315705ustar00rootroot00000000000000.gitignore000066400000000000000000000000211471722043300334720ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-speclib/ node_modulesLICENSE000066400000000000000000000020441471722043300325160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-specMIT License Copyright (c) 2022 Fig Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. README.md000066400000000000000000000000001471722043300327560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-specboilerplate/000077500000000000000000000000001471722043300340135ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec.eslintrc.js000066400000000000000000000000701471722043300362470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplatemodule.exports = { extends: ["@fig/autocomplete"], }; .gitignore000066400000000000000000000000361471722043300360020ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplatebuild/ .DS_Store node_modules/package.json000066400000000000000000000034341471722043300363050ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplate{ "name": "boilerplate-fig-autocomplete", "version": "1.0.0", "description": "Boilerplate Fig autocomplete spec package", "scripts": { "dev": "npx @withfig/autocomplete-tools dev", "create-spec": "npx @withfig/autocomplete-tools create-spec", "publish-spec": "npx @fig/publish-spec -i", "test": "tsc --noEmit && echo 'All specs passed validation.'", "build": "npx @withfig/autocomplete-tools compile", "lint": "eslint '**/*.ts' && npx prettier --check '**/*.ts'", "lint:fix": "eslint '**/*.ts' --fix && npx prettier --write '**/*.ts'" }, "engines": { "node": ">=16" }, "fig": { "dev": { "description": "Watching and compile .ts files in ./src", "icon": "fig://template?badge=🛠", "priority": 100 }, "create-spec": { "description": "Create a new spec with the provided name in ./src" }, "publish-spec": { "description": "Publish a spec to Fig teams" }, "test": { "description": "Typecheck all .ts files in ./src" }, "build": { "description": "Compile all files in ./src" }, "lint": { "description": "Check for linting issues" }, "lint:fix": { "description": "Fix linting issues" } }, "prettier": { "trailingComma": "es5", "printWidth": 80 }, "lint-staged": { "*.ts": [ "eslint --fix", "pretty-quick --staged" ] }, "author": "", "license": "MIT", "devDependencies": { "@fig/eslint-config-autocomplete": "latest", "@fig/publish-spec": "^1.2.0", "@types/node": "^16.11.33", "@withfig/autocomplete-tools": "^2.7.2", "@withfig/autocomplete-types": "latest", "eslint": "^8.15.0", "lint-staged": "^12.4.1", "prettier": "^2.6.2", "pretty-quick": "^3.1.3", "typescript": "^5.2.0" } } src/000077500000000000000000000000001471722043300346025ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplateREADME.md000066400000000000000000000000671471722043300360640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplate/srcThis is the empty folder in which spec files are added.tsconfig.json000066400000000000000000000004441471722043300365240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/boilerplate{ "compilerOptions": { "moduleResolution": "node", "outDir": "./build", "target": "ESNext", "module": "ESNext", "lib": ["ESNext"], "noImplicitAny": false, "baseUrl": "./", "types": ["@withfig/autocomplete-types", "node"], }, "include": ["./src/**/*"], } generate-spec.ts000066400000000000000000000003541471722043300346050ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec// eslint-disable-next-line import/no-extraneous-dependencies import { addCompletionSpecCommand } from "@fig/complete-commander"; import { program } from "./src/program"; addCompletionSpecCommand(program); program.parse(process.argv); package.json000066400000000000000000000020351471722043300337770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec{ "name": "create-completion-spec", "version": "1.1.9", "description": "Initialize a Fig custom spec boilerplate in the current directory", "bin": "lib/bin.js", "main": "lib/index.js", "scripts": { "build": "tsc", "prepack": "pnpm build", "generate-spec": "tsx generate-spec.ts generate-fig-spec" }, "repository": { "type": "git", "url": "git+https://github.com/withfig/autocomplete-tools.git" }, "keywords": [ "fig", "spec", "completion" ], "files": [ "lib", "boilerplate" ], "author": "Federico Ciardi ", "license": "MIT", "bugs": { "url": "https://github.com/withfig/autocomplete-tools/issues" }, "homepage": "https://github.com/withfig/autocomplete-tools#readme", "dependencies": { "commander": "^11.1.0", "picocolors": "^1.1.0" }, "devDependencies": { "@fig/complete-commander": "workspace:^", "@types/node": "^22.5.2", "tsx": "^4.19.0", "typescript": "^5.5.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/src/000077500000000000000000000000001471722043300323575ustar00rootroot00000000000000bin.ts000066400000000000000000000001271471722043300334200ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/src#!/usr/bin/env node import { program } from "./program"; program.parse(process.argv); create-boilerplate.ts000066400000000000000000000024701471722043300364160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/srcimport path from "path"; import pc from "picocolors"; import fs from "fs"; import { execSync } from "child_process"; function rCopySync(from: string, to: string) { if (fs.existsSync(from)) { fs.mkdirSync(path.dirname(to), { recursive: true }); if (fs.statSync(from).isDirectory()) { const children = fs.readdirSync(from); for (const child of children) { rCopySync(path.resolve(from, child), path.resolve(to, child)); } } else { fs.copyFileSync(from, to); } } } export function createBoilerplateFolder() { const dir = path.join(process.cwd(), ".fig", "autocomplete"); if (!fs.existsSync(dir)) { const boilerplateDir = path.resolve(__dirname, "..", "boilerplate"); console.log(pc.yellow("Copying boilerplate directory...")); try { rCopySync(boilerplateDir, dir.replace(/(\s)/g, "\\$1")); } catch { throw new Error("An error occurred while copying the boilerplate directory"); } console.log(pc.green("Finished copying boilerplate directory")); console.log("----"); console.log(pc.yellow("Installing npm deps...")); try { execSync("npm i", { cwd: dir }); console.log(pc.green("Finished installing npm deps")); } catch { console.log(pc.red("Error installing npm deps, please install them manually")); } } } create-spec.ts000066400000000000000000000030471471722043300350470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/srcimport path from "path"; import fs from "fs"; import pc from "picocolors"; const fileContent = (name: string) => `const completionSpec: Fig.Spec = { name: "${name}", description: "", subcommands: [{ name: "my_subcommand", description: "Example subcommand", subcommands: [{ name: "my_nested_subcommand", description: "Nested subcommand, example usage: '${name} my_subcommand my_nested_subcommand'" }], }], options: [{ name: ["--help", "-h"], description: "Show help for ${name}", }], // Only uncomment if ${name} takes an argument // args: {} }; export default completionSpec;`; export function createCompletionSpec(specName: string, autocompleteFolder: string) { const sanitizedSpecName = specName.replace(" ", "-"); const filePath = path.join(autocompleteFolder, `${sanitizedSpecName}.ts`); const dirName = path.dirname(filePath); // we do not use parentDir directly cause specName may be nested e.g. `aws/spec` if (fs.existsSync(filePath)) { console.log(pc.red("This completion spec already exists")); console.log(pc.bold(`Start editing it from the src/${sanitizedSpecName}.ts now!`)); return; } try { fs.mkdirSync(dirName, { recursive: true }); fs.writeFileSync(filePath, fileContent(sanitizedSpecName)); console.log(pc.green(`Successfully created the new spec ${sanitizedSpecName}`)); console.log(`Start editing it at ${pc.bold(`src/${sanitizedSpecName}.ts`)}!`); } catch { throw new Error(`An error occurred while creating the new "${sanitizedSpecName}" spec.`); } } index.ts000066400000000000000000000001051471722043300337530ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/srcexport * from "./create-boilerplate"; export * from "./create-spec"; program.ts000066400000000000000000000016371471722043300343260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec/srcimport { Command } from "commander"; import path from "path"; import pc from "picocolors"; import { createBoilerplateFolder } from "./create-boilerplate"; import { createCompletionSpec } from "./create-spec"; interface Options { here?: boolean; } async function runProgram(specName: string, options: Options) { const { here } = options; try { if (!here) { createBoilerplateFolder(); console.log("----"); } createCompletionSpec( specName, here ? process.cwd() : path.resolve(process.cwd(), ".fig", "autocomplete", "src") ); } catch (error) { console.log(pc.red((error as Error).message)); process.exit(1); } } export const program = new Command("create-completion-spec") .description("Setup fig folder and create spec with the given name") .arguments("") .option("--here", "Set if the spec should be created in the current folder") .action(runProgram); tsconfig.json000066400000000000000000000005521471722043300342220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/create-completion-spec{ "compilerOptions": { "target": "es6", "outDir": "lib/", "rootDir": "src/", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": true, }, "exclude": ["test/", "node_modules/", "bin/", "lib/", "boilerplate/", "generate-spec.ts"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/000077500000000000000000000000001471722043300276245ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/.eslintrc.cjs000066400000000000000000000001111471722043300322170ustar00rootroot00000000000000module.exports = { rules: { "import/no-unresolved": "off", }, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/.gitignore000066400000000000000000000000701471722043300316110ustar00rootroot00000000000000.DS_Store node_modules/ lib/ test/fixtures/**/output.txtgolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/LICENSE000066400000000000000000000020441471722043300306310ustar00rootroot00000000000000MIT License Copyright (c) 2022 Fig Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/README.md000066400000000000000000000000001471722043300310710ustar00rootroot00000000000000generate-spec.ts000066400000000000000000000003571471722043300326440ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec// eslint-disable-next-line import/no-extraneous-dependencies import { addCompletionSpecCommand } from "@fig/complete-commander"; import { program } from "./src/program.js"; addCompletionSpecCommand(program); program.parse(process.argv); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/package.json000066400000000000000000000036211471722043300321140ustar00rootroot00000000000000{ "name": "@fig/publish-spec", "version": "1.2.3", "description": "Publish a spec to fig team", "bin": "./lib/bin.js", "main": "./lib/index.js", "type": "module", "scripts": { "run-script": "pnpm build && node ./lib/bin.js", "build": "tsc", "prepack": "pnpm build", "test:server": "TEST_PORT=3005 node --import tsx test/server.ts", "test:fixtures": "BASE_URL=http://localhost:3005 tsx test/index.ts", "test": "./test.sh", "test:overwrite": "OVERWRITE=true pnpm test", "generate-spec": "node --import tsx generate-spec.ts generate-fig-spec" }, "fig": { "test:server": "Start a mock server emulating the production one", "test:fixtures": "Run fixtures", "test": "Start test server, run fixtures then stop server", "test:overwrite": "Start test server, regenerate fixtures then stop server" }, "repository": { "type": "git", "url": "git+https://github.com/withfig/autocomplete-tools.git" }, "engines": { "node": ">= 14" }, "keywords": [ "fig", "team", "spec", "cicd", "cli", "completion" ], "files": [ "lib/" ], "author": "Federico Ciardi ", "license": "MIT", "bugs": { "url": "https://github.com/withfig/autocomplete-tools/issues" }, "homepage": "https://github.com/withfig/autocomplete-tools#readme", "dependencies": { "commander": "^11.1.0", "esbuild": "^0.23.1", "node-fetch": "^3.3.2", "prettier": "^3.3.3", "prompts": "^2.4.2" }, "devDependencies": { "@fig/complete-commander": "workspace:^", "@types/express": "^4.17.21", "@types/multer": "^1.4.12", "@types/node": "^22.5.2", "@types/node-fetch": "^2.6.11", "@types/prompts": "^2.4.9", "express": "^4.21.1", "multer": "1.4.5-lts.1", "picocolors": "^1.1.0", "tsx": "^4.19.0", "typescript": "^5.5.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/000077500000000000000000000000001471722043300304135ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/bin.ts000066400000000000000000000001321471722043300315270ustar00rootroot00000000000000#!/usr/bin/env node import { program } from "./program.js"; program.parse(process.argv); constants.ts000066400000000000000000000002331471722043300327160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/srcexport const API_BASE = process.env.BASE_URL || "https://api.fig.io"; export const DEFAULT_OPTIONS = { subcommandName: "generate-fig-spec", } as const; credentials.ts000066400000000000000000000031401471722043300331770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/srcimport os from "os"; import { readFile } from "fs/promises"; import path from "path"; import assert from "assert"; import { ValidationError, ValidationErrorEnum } from "./errors.js"; export async function tryParseTokenFromCredentials(): Promise { try { const kernel = os.type(); let config: string; const figCredentials = path.join("fig", "credentials.json"); if (kernel === "Darwin") { assert(process.env.HOME); config = await readFile( path.resolve(process.env.HOME, "Library", "Application Support", figCredentials), { encoding: "utf-8" } ); } else if (kernel === "Linux") { if (process.env.XDG_DATA_HOME) { config = await readFile(path.resolve(process.env.XDG_DATA_HOME, figCredentials), { encoding: "utf-8", }); } else { assert(process.env.HOME); config = await readFile(path.resolve(process.env.HOME, ".local", "share", figCredentials), { encoding: "utf-8", }); } } else { // Windows assert(process.env.APPDATA); config = await readFile(path.resolve(process.env.APPDATA, figCredentials), { encoding: "utf-8", }); } /* eslint-disable camelcase */ const { access_token, id_token } = JSON.parse(config); assert(access_token); assert(id_token); const token = Buffer.from( JSON.stringify({ accessToken: access_token, idToken: id_token }), "utf-8" ).toString("base64"); return token; /* eslint-enable camelcase */ } catch (error) { throw new ValidationError(ValidationErrorEnum.missingToken); } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/errors.ts000066400000000000000000000020061471722043300322750ustar00rootroot00000000000000export enum ValidationErrorEnum { nameWithSpace = "The `name` option must not contain spaces", missingToken = "We tried to search for a token in fig configs, but we found none. Use the `token` option to specify one", noSpecPassed = "No spec passed. Neither `spec-path` or `binary-path` options were defined", } export enum GenericErrorEnum { noSpecDataReceived = "No spec was received. The `spec-path` option was not defined and the binary did not send any completion spec to stdout", missingName = "Missing name. Either the `name` option or the `spec-path` option need to be passed to the program", } const createErrorClass = (name: string) => class extends Error { constructor(message: string) { super(message); this.name = name; } }; export const GenerationError = createErrorClass("GenerationError"); export const ValidationError = createErrorClass("ValidationError"); export const BuildError = createErrorClass("BuildError"); export const PublishError = createErrorClass("PublishError"); node-fetch.ts000066400000000000000000000007571471722043300327310ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/srcimport nodeFetch from "node-fetch"; export const fetch: typeof nodeFetch = async (...args) => { const response = await nodeFetch(...args); const { status, statusText, json } = response; if (status >= 400 && status < 600) { const baseError = `${status} ${statusText}`; try { const responseJSON = (await json()) as { error: string }; throw new Error(`${baseError}: ${responseJSON.error}`); } catch { throw new Error(baseError); } } return response; }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/package.ts000066400000000000000000000003261471722043300323570ustar00rootroot00000000000000import { createRequire } from "module"; const require = createRequire(import.meta.url); // eslint-disable-next-line @typescript-eslint/no-var-requires const pkg = require("../package.json"); export default pkg; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/program.ts000066400000000000000000000020141471722043300324270ustar00rootroot00000000000000import { Command } from "commander"; import { run } from "./run.js"; import packageJSON from "./package.js"; const program = new Command() .name(packageJSON.name) .version(packageJSON.version) .description("Publish a spec to fig teams"); program .option("-i, --interactive", "Publish a spec interactively") .option("-t, --token ", "A fig token") .option("--team ", "Set the namespace of the published spec") .option("-n, --name ", "Set the name of the published spec") .option("-p, --spec-path ", "The local path of the spec to publish") .option("-b, --binary-path ", "The path of the binary to run to generate the spec") .option( "-s, --subcommand-name ", "The subcommand of the binary used to generate the spec" ) .option( "--is-script", "The spec is a local script and will only be loaded when referenced in a fig/config.json file." ) .option("-f, --framework ", "Framework used to build the CLI") .action(run); export { program }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/run.ts000066400000000000000000000071141471722043300315720ustar00rootroot00000000000000import { FormData } from "node-fetch"; import path from "path"; import esbuild from "esbuild"; import { fetch } from "./node-fetch.js"; import { createFile, exec, createTempDir, createFileFrom } from "./utils.js"; import { API_BASE } from "./constants.js"; import { BuildError, GenerationError, GenericErrorEnum, PublishError, ValidationError, } from "./errors.js"; import testHelpers from "./test-helpers.js"; import type { RunOptions } from "./types.js"; import { validateToken, validateName, validateTeam, validateSpecData, validate, validateFramework, validateIsScript, } from "./validation/index.js"; export const run = async (options: RunOptions) => { // NOTE: Validate is used both to assert types of the input options AND to request users missing options when running in interactive mode // so remember to implement logic for interactive mode in validators! const { token, name, team, framework, specPath, command, isScript } = await validate(options) .validator(validateToken) .validator(validateName) .validator(validateTeam) .validator(validateFramework) .validator(validateSpecData) .validator(validateIsScript) .exec(); let specOutput: string | undefined; if (command) { try { specOutput = (await exec(command)).trim(); } catch (error) { const { message } = error as Error; throw new GenerationError(`"${command}" exited with errors.\n${message}`); } } const formData = new FormData(); if (specPath) { const tsSpecPath = path.resolve(specPath); const [tempDir, removeTempDir] = await createTempDir(path.dirname(tsSpecPath)); try { await esbuild.build({ entryPoints: { [name]: tsSpecPath, }, outdir: tempDir, bundle: true, format: "esm", minify: true, logLevel: "silent", }); const jsSpecPath = path.resolve(tempDir, `${name}.js`); formData.append("tsSpec", await createFileFrom(tsSpecPath, `${name}.ts`)); formData.append("jsSpec", await createFileFrom(jsSpecPath, `${name}.js`)); } catch (error) { throw new BuildError((error as Error).message); } finally { await removeTempDir(); } } else if (specOutput) { try { const builtSpec = await esbuild.transform(specOutput, { format: "esm", minify: true, logLevel: "silent", }); formData.append("jsSpec", createFile(builtSpec.code, `${name}.js`)); formData.append("tsSpec", createFile(specOutput, `${name}.ts`)); } catch (error) { throw new BuildError((error as Error).message); } } else { throw new ValidationError(GenericErrorEnum.noSpecDataReceived); } formData.append("name", name); if (framework) formData.append("framework", framework); if (team) formData.append("team", team); if (isScript) formData.append("isScript", "true"); try { // This fetch method is a wrapper over the node-fetch function // See node-fetch.ts const response = await fetch(`${API_BASE}/completions`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", ...testHelpers.getAssertDataHeader(), }, method: "PUT", body: formData, }); try { const { namespace, name: specName } = (await response.json()) as { namespace: string; name: string; }; console.log(`Successfully published ${specName} to ${namespace}`); } catch (error) { console.log("The spec was successfully published."); } } catch (error) { throw new PublishError((error as Error).message); } }; test-helpers.ts000066400000000000000000000001341471722043300333210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/srcfunction getAssertDataHeader() { return {}; } export default { getAssertDataHeader, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/types.ts000066400000000000000000000003401471722043300321240ustar00rootroot00000000000000export interface RunOptions { name?: string; team?: string; token?: string; specPath?: string; binaryPath?: string; isScript?: boolean; subcommandName?: string; framework?: string; interactive?: boolean; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/utils.ts000066400000000000000000000031711471722043300321250ustar00rootroot00000000000000import { randomUUID } from "crypto"; import fs from "fs"; import { mkdir, rm } from "fs/promises"; import path from "path"; import { exec as execCallback } from "child_process"; import { File, Blob } from "node-fetch"; import { ValidationError, ValidationErrorEnum } from "./errors.js"; export async function exec(cmd: string): Promise { return new Promise((resolve, reject) => { execCallback(cmd, (error, stdout, stderr) => { if (error) { reject(error); } resolve(stdout || stderr); }); }); } export function validateSpecName(name: string) { if (name.includes(" ")) { throw new ValidationError(ValidationErrorEnum.nameWithSpace); } } export function createFile(content: string, name: string) { const blob = new Blob([content]); return new File([blob], name); } export async function createFileFrom(filePath: string, name: string) { return new Promise((resolve, reject) => { const bytes: BlobPart[] = []; fs.createReadStream(filePath) .on("data", (byte) => bytes.push(byte)) .once("end", () => { const blob = new Blob(bytes); resolve(new File([blob], name)); }) .once("error", reject); }); } type CreateTempDirResult = [tempDirPath: string, cleanTempDirFn: () => Promise]; export async function createTempDir(rootDir: string): Promise { const dir = path.resolve(rootDir, randomUUID()); if (!fs.existsSync(dir)) { await mkdir(dir, { recursive: true }); } const removeFn = async () => { if (fs.existsSync(dir)) { await rm(dir, { recursive: true }); } }; return [dir, removeFn]; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/000077500000000000000000000000001471722043300325455ustar00rootroot00000000000000index.ts000066400000000000000000000031161471722043300341460ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validationimport prompts from "prompts"; import type { RunOptions } from "../types"; import type { Validator } from "./types"; export * from "./validators/index.js"; interface Chainable> { validator(val: Validator): Chainable; exec(): Promise; } /** * `Validate` performs some validation logic sequencially each time returning the validated and sanitized option * If interactive mode is run validate also creates a prompt queue that will get executed to ask options to the user in real time * > NOTE: Order of validators in the chain matters! */ export function validate(options: RunOptions): Chainable { // eslint-disable-next-line @typescript-eslint/no-explicit-any const validators: Validator[] = []; // eslint-disable-next-line @typescript-eslint/no-explicit-any async function exec(): Promise { const interactiveQuestions: prompts.PromptObject[] = []; const validatedOptions = {}; const validated = await Promise.all(validators.map((v) => v(options))); for (const item of validated) { const [d, q] = item; if (q) { interactiveQuestions.push(...q); } else { Object.assign(validatedOptions, d); } } if (interactiveQuestions.length > 0) { const questionsResponse = await prompts(interactiveQuestions); Object.assign(validatedOptions, questionsResponse); } return validatedOptions; } function validator(val: Validator) { validators.push(val); return { validator, exec, }; } return { validator, exec, }; } types.ts000066400000000000000000000011371471722043300342040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validationimport type prompts from "prompts"; import type { RunOptions } from "../types"; export type SingleOrArray = T | T[]; export type PromptsName = prompts.PromptObject & string>; // when a value is returned export type ValueValidationResult = [value: Q, questions: undefined]; // when questions are returned export type QuestionsValidationResult = [value: undefined, questions: PromptsName[]]; export type ValidationResult = ValueValidationResult | QuestionsValidationResult; export type Validator = (options: RunOptions) => Promise>; validators/000077500000000000000000000000001471722043300346365ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validationframework.ts000066400000000000000000000010631471722043300372030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport type { Validator } from "../types"; import type { RunOptions } from "../../types"; import { value, questions } from "./helpers.js"; interface FrameworkValidation { framework?: string; } export const validateFramework: Validator = async (options: RunOptions) => { const { framework, interactive } = options; if (framework || !interactive) return value({ framework }); return questions({ type: "text", name: "framework", message: "What integration was/is being used to generate the spec? (enter to skip)", }); }; helpers.ts000066400000000000000000000005421471722043300366510ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport type { ValueValidationResult, QuestionsValidationResult, SingleOrArray, PromptsName, } from "../types"; export function value(v: T): ValueValidationResult { return [v, undefined]; } export function questions(q: SingleOrArray>): QuestionsValidationResult { return [undefined, Array.isArray(q) ? q : [q]]; } index.ts000066400000000000000000000004321471722043300363140ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsexport { validateName } from "./name.js"; export { validateToken } from "./token.js"; export { validateFramework } from "./framework.js"; export { validateTeam } from "./team.js"; export { validateSpecData } from "./spec-data.js"; export { validateIsScript } from "./is-script.js"; is-script.ts000066400000000000000000000013101471722043300371160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport { questions, value } from "./helpers.js"; import type { RunOptions } from "../../types"; import type { Validator } from "../types"; interface RestValidation { isScript: boolean; } export const validateIsScript: Validator = async (options: RunOptions) => { const { isScript, interactive } = options; if (isScript || !interactive) return value({ isScript: Boolean(isScript) }); return questions({ type: "select", name: "isScript", message: "Is this spec adding completions to a local script (eg. ./scripts/my-script.sh)", choices: [ { title: "No", value: false, selected: true, description: "(default)" }, { title: "Yes", value: true }, ], }); }; name.ts000066400000000000000000000023601471722043300361270ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport path from "path"; import { ValidationError, GenericErrorEnum, ValidationErrorEnum } from "../../errors.js"; import { validateSpecName } from "../../utils.js"; import { value, questions } from "./helpers.js"; import type { RunOptions } from "../../types"; import type { Validator } from "../types"; interface NameValidation { name: string; } export const validateName: Validator = async (options: RunOptions) => { const { name: optionalName, specPath, interactive } = options; let name = optionalName; try { if (!name) { if (specPath) { // if name is missing we extract it from the optional spec-name // NOTE: this won't work correctly for spec names that require being nested under a subfolder // e.g. `@withfig/autocomplete-tools.ts` name = path.basename(specPath, ".ts"); } else { throw new ValidationError(GenericErrorEnum.missingName); } } validateSpecName(name); return value({ name }); } catch (error) { if (!interactive) throw error; return questions({ type: "text", message: "Choose a name for the spec:", name: "name", validate: (v: string) => !v.includes(" ") ?? ValidationErrorEnum.nameWithSpace, }); } }; spec-data.ts000066400000000000000000000036041471722043300370520ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport type { Validator } from "../types"; import type { RunOptions } from "../../types"; import { value, questions } from "./helpers.js"; import { ValidationError, ValidationErrorEnum } from "../../errors.js"; import { DEFAULT_OPTIONS } from "../../constants.js"; interface SpecDataValidation { mode?: "command" | "filepath"; specPath?: string; command?: string; } export const validateSpecData: Validator = async (options: RunOptions) => { const { binaryPath, specPath, interactive, framework, subcommandName } = options; if (!binaryPath && !specPath) { if (interactive) { return questions([ { name: "mode", message: "Do you want to generate the spec now from a command or add a path to a local spec TypeScript file?", type: "select", choices: [ { title: "I want to generate the spec", value: "command", }, { title: "I want to specify a path to a file", value: "filepath", }, ], }, { type: (_, prevValues) => (prevValues.mode === "filepath" ? "text" : null), name: "specPath", // TODO(fedeci): add TIP about passing this option via the flag and also using interactive mode message: "Add the path to a local spec:", }, { type: (_, prevValues) => (prevValues.mode === "command" ? "text" : null), name: "command", message: "Add the path to a local spec:", }, ]); } throw new ValidationError(ValidationErrorEnum.noSpecPassed); } if (binaryPath) { return value({ command: framework || subcommandName ? `${binaryPath} ${subcommandName ?? DEFAULT_OPTIONS.subcommandName}` : binaryPath, specPath, }); } return value({ specPath }); }; team.ts000066400000000000000000000023731471722043300361410ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport type prompts from "prompts"; import type { Validator } from "../types"; import type { RunOptions } from "../../types"; import { value, questions } from "./helpers.js"; import { exec } from "../../utils.js"; interface TeamValidation { team?: string; teamScopeInfo?: "p" | "t"; } export const validateTeam: Validator = async (options: RunOptions) => { const { team, interactive } = options; if (team || !interactive) return value({ team }); try { const availableTeams: prompts.Choice[] = (await exec("fig team --list")) .trim() .split("\n") .map((name) => ({ title: name, value: name, })); return questions([ { type: "select", message: "Would you like to publish the spec:", choices: [ { title: "For personal use", value: "p", }, { title: "For a team", value: "t", }, ], name: "teamScopeInfo", }, { type: (prev: string) => (prev === "t" ? "select" : false), message: "Choose a team to publish the spec to:", name: "team", choices: availableTeams, }, ]); } catch { return value({ team: "" }); } }; token.ts000066400000000000000000000017201471722043300363260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/src/validation/validatorsimport { tryParseTokenFromCredentials } from "../../credentials.js"; import type { Validator } from "../types"; import type { RunOptions } from "../../types"; import { value, questions } from "./helpers.js"; interface TokenValidation { token: string; } export const validateToken: Validator = async (options: RunOptions) => { const { token, interactive } = options; if (token) return value({ token }); if (process.env.FIG_API_TOKEN) return value({ token: process.env.FIG_API_TOKEN }); // try to read the token from the config file try { return value({ token: await tryParseTokenFromCredentials() }); } catch (error) { if (!interactive) throw error; return questions({ type: "password", message: "A Fig API token to push a spec to a team but none was found, please insert one manually:", name: "token", validate: (v: string) => !!v ?? "A Token is required to push the spec to a team", }); } }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test.sh000077500000000000000000000005551471722043300311470ustar00rootroot00000000000000#!/usr/bin/env bash set -e # We had to extract this script to a file because pnpm crashes when it finds a `!` in an npm script # We are using npm here because the pid returned by pnpm is wrong and would not shut down the server TEST_PORT=3005 "$(pnpm bin)/tsx" test/server.ts & SERVER_PID=$! && sleep 2 && # Arbitrary time npm run test:fixtures kill $SERVER_PIDgolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/000077500000000000000000000000001471722043300306035ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/000077500000000000000000000000001471722043300324545ustar00rootroot00000000000000config.schema.json000066400000000000000000000052461471722043300360030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Config", "description": "Config for publish-spec tests", "type": "object", "definitions": { "assert:test-file": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the file passed in" }, "content": { "type": "string", "description": "The content of the file passed in" } } } }, "properties": { "options": { "type": "object", "additionalProperties": false, "properties": { "token": { "description": "A fig API token", "type": "string" }, "team": { "description": "The name of the team", "type": "string" }, "name": { "description": "The name of the spec", "type": "string" }, "specPath": { "description": "The local path of the spec relative to the fixture directory", "type": "string" }, "binaryPath": { "description": "The local path of the binary used to output the spec relative to the fixture directory", "type": "string" }, "subcommandName": { "description": "The name of the subcommand to append to the binary when executing it", "type": "string" }, "framework": { "description": "The framework used to build the CLI", "type": "string" } } }, "assert": { "description": "A list of options to assert server side", "type": "object", "properties": { "name": { "type": "string", "description": "Assert the passed in `name` is correct" }, "team": { "type": "string", "description": "Assert the passed in `team` is correct" }, "files": { "type": "object", "properties": { "jsSpec": { "$ref": "#/definitions/assert:test-file" } } } }, "additionalProperties": false }, "env": { "description": "Add environment variables to the context", "properties": { "FIG_API_TOKEN": { "type": "string", "description": "Token saved as env variable" }, "HOME": { "enum": ["__CWD", ""], "description": "Darwin home directory" }, "APPDATA": { "enum": ["__CWD", ""], "description": "Windows home directory" }, "XDG_DATA_HOME": { "enum": ["__CWD", ""], "description": "Linux add data directory" } } }, "os": { "description": "OS type", "enum": ["MacOS", "Linux", "Windows"] } } }generated-spec-build-error/000077500000000000000000000000001471722043300375075ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturescli.sh000077500000000000000000000001611471722043300406130ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-build-error#!/bin/bash if [ $1 == "generate-fig-spec" ]; then echo "const completion = {}[]; export default completion" ficonfig.json000066400000000000000000000002451471722043300416500ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-build-error{ "$schema": "../config.schema.json", "options": { "token": "data", "name": "some-spec", "binaryPath": "./cli.sh", "framework": "commander" } }expected.txt000066400000000000000000000001161471722043300420470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-build-errorBuildError: Transform failed with 1 error: :1:22: ERROR: Unexpected "]"generated-spec-cli-errored/000077500000000000000000000000001471722043300374705ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturescli.sh000077500000000000000000000001671471722043300406020ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-cli-errored#!/bin/bash if [ $1 == "generate-fig-spec" ]; then echo "const completion = {}; export default completion" fi exit 1config.json000066400000000000000000000002451471722043300416310ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-cli-errored{ "$schema": "../config.schema.json", "options": { "token": "data", "name": "some-spec", "binaryPath": "./cli.sh", "framework": "commander" } }expected.txt000066400000000000000000000001651471722043300420340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-cli-erroredGenerationError: some kind of generation error was produced, run the tests with VERBOSE=true env variable to see moregenerated-spec-missing-name/000077500000000000000000000000001471722043300376505ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturescli.sh000077500000000000000000000001041471722043300407510ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-missing-name#!/bin/bash echo "const completion = {}; export default completion"config.json000066400000000000000000000001561471722043300420120ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-missing-name{ "$schema": "../config.schema.json", "options": { "token": "data", "binaryPath": "./cli.sh" } }expected.txt000066400000000000000000000001621471722043300422110ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-missing-nameValidationError: Missing name. Either the `name` option or the `spec-path` option need to be passed to the programgenerated-spec-wrong-subcommand/000077500000000000000000000000001471722043300405435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturescli.sh000077500000000000000000000001541471722043300416510ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-wrong-subcommand#!/bin/bash if [ $1 == "generate-spec" ]; then echo "const completion = {}; export default completion" fi config.json000066400000000000000000000002621471722043300427030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-wrong-subcommand{ "$schema": "../config.schema.json", "options": { "token": "data", "name": "some-spec", "subcommandName": "generate-fig-spec", "binaryPath": "./cli.sh" } }expected.txt000066400000000000000000000002071471722043300431040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec-wrong-subcommandValidationError: No spec was received. The `spec-path` option was not defined and the binary did not send any completion spec to stdoutgenerated-spec/000077500000000000000000000000001471722043300352635ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturescli.sh000077500000000000000000000001601471722043300363660ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec#!/bin/bash if [ $1 == "generate-fig-spec" ]; then echo "const completion = {}; export default completion" fi config.json000066400000000000000000000011151471722043300374210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-spec{ "$schema": "../config.schema.json", "options": { "token": "some-other-data", "name": "some-spec", "subcommandName": "generate-fig-spec", "binaryPath": "./cli.sh", "framework": "commander", "team": "test-team" }, "assert": { "token": "Bearer some-other-data", "name": "some-spec", "framework": "commander", "team": "test-team", "files": { "tsSpec": { "name": "some-spec.ts", "content": "const completion = {}; export default completion" }, "jsSpec": { "name": "some-spec.js" } } } }expected.txt000066400000000000000000000000561471722043300376260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/generated-specSuccessfully published some-spec to test-team local-spec-build-error/000077500000000000000000000000001471722043300366435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000002131471722043300407770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-build-error{ "$schema": "../config.schema.json", "options": { "token": "some-data", "name": "some-spec", "specPath": "./spec.ts" } }expected.txt000066400000000000000000000001561471722043300412070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-build-errorBuildError: Build failed with 1 error: test/fixtures/local-spec-build-error/spec.ts:3:2: ERROR: Unexpected "]"spec.ts000066400000000000000000000001031471722043300401370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-build-errorconst completion = { name: "spec", }[] export default completionlocal-spec-nested-assign-name/000077500000000000000000000000001471722043300400775ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000003501471722043300422350ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-nested-assign-name{ "$schema": "../config.schema.json", "options": { "token": "data", "specPath": "folder/spec.ts", "framework": "cobra" }, "assert": { "token": "Bearer data", "name": "spec", "framework": "cobra" } }expected.txt000066400000000000000000000000471471722043300424420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-nested-assign-nameSuccessfully published spec to default folder/000077500000000000000000000000001471722043300413525ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-nested-assign-namespec.ts000066400000000000000000000001001471722043300426430ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec-nested-assign-name/folderconst completion = { name: "spec" } export default completionlocal-spec/000077500000000000000000000000001471722043300344175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000006461471722043300365650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-spec{ "$schema": "../config.schema.json", "options": { "token": "data", "name": "spec", "specPath": "spec.ts", "team": "team-name", "framework": "cobra" }, "assert": { "token": "Bearer data", "name": "spec", "team": "team-name", "framework": "cobra", "files": { "tsSpec": { "name": "spec.ts" }, "jsSpec": { "name": "spec.js" } } } }expected.txt000066400000000000000000000000511471722043300367550ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-specSuccessfully published spec to team-name spec.ts000066400000000000000000000001001471722043300357100ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/local-specconst completion = { name: "spec" } export default completionmissing-token/000077500000000000000000000000001471722043300351645ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000002721471722043300373250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/missing-token{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "env": { "APPDATA": "", "FIG_API_TOKEN": "", "XDG_DATA_HOME": "", "HOME": "" } }expected.txt000066400000000000000000000001701471722043300375240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/missing-tokenValidationError: We tried to search for a token in fig configs, but we found none. Use the `token` option to specify onespec.ts000066400000000000000000000001001471722043300364550ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/missing-tokenconst completion = { name: "spec" } export default completionname-with-spaces/000077500000000000000000000000001471722043300355425ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000002351471722043300377020ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/name-with-spaces{ "$schema": "../config.schema.json", "options": { "token": "data", "name": "fig teams", "specPath": "spec.ts", "team": "team-name" } }expected.txt000066400000000000000000000000721471722043300401030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/name-with-spacesValidationError: The `name` option must not contain spacesspec.ts000066400000000000000000000001001471722043300370330ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/name-with-spacesconst completion = { name: "spec" } export default completiontoken-in-credentials-file-darwin/000077500000000000000000000000001471722043300406135ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesLibrary/000077500000000000000000000000001471722043300422175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwinApplication Support/000077500000000000000000000000001471722043300461175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwin/LibraryApplication Support/fig/000077500000000000000000000000001471722043300466645ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwin/LibraryApplication Support/fig/credentials.json000066400000000000000000000000661471722043300520560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwin/Library{ "access_token": "data-1", "id_token": "data-2" }config.json000066400000000000000000000004731471722043300427570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwin{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "assert": { "token": "Bearer eyJhY2Nlc3NUb2tlbiI6ImRhdGEtMSIsImlkVG9rZW4iOiJkYXRhLTIifQ==", "name": "spec" }, "env": { "HOME": "__CWD", "APPDATA": "__CWD", "XDG_DATA_HOME": "__CWD" }, "os": "MacOS" }expected.txt000066400000000000000000000000471471722043300431560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwinSuccessfully published spec to default spec.ts000066400000000000000000000001001471722043300421040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-darwinconst completion = { name: "spec" } export default completiontoken-in-credentials-file-linux-home/000077500000000000000000000000001471722043300414145ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures.local/000077500000000000000000000000001471722043300425645ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-homeshare/000077500000000000000000000000001471722043300436665ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-home/.localfig/000077500000000000000000000000001471722043300444335ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-home/.local/sharecredentials.json000066400000000000000000000000661471722043300476250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-home/.local/share/fig{ "access_token": "data-1", "id_token": "data-2" }config.json000066400000000000000000000004351471722043300435560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-home{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "assert": { "token": "Bearer eyJhY2Nlc3NUb2tlbiI6ImRhdGEtMSIsImlkVG9rZW4iOiJkYXRhLTIifQ==", "name": "spec" }, "env": { "HOME": "__CWD", "APPDATA": "__CWD" }, "os": "Linux" }expected.txt000066400000000000000000000000471471722043300437570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-homeSuccessfully published spec to default spec.ts000066400000000000000000000001001471722043300427050ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-homeconst completion = { name: "spec" } export default completiontoken-in-credentials-file-linux-xdg-home/000077500000000000000000000000001471722043300421745ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000004731471722043300443400ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-xdg-home{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "assert": { "token": "Bearer eyJhY2Nlc3NUb2tlbiI6ImRhdGEtMyIsImlkVG9rZW4iOiJkYXRhLTQifQ==", "name": "spec" }, "env": { "XDG_DATA_HOME": "__CWD", "APPDATA": "__CWD", "HOME": "__CWD" }, "os": "Linux" }expected.txt000066400000000000000000000000471471722043300445370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-xdg-homeSuccessfully published spec to default fig/000077500000000000000000000000001471722043300427415ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-xdg-homecredentials.json000066400000000000000000000000661471722043300461330ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-xdg-home/fig{ "access_token": "data-3", "id_token": "data-4" }spec.ts000066400000000000000000000001001471722043300434650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-linux-xdg-homeconst completion = { name: "spec" } export default completiontoken-in-credentials-file-windows/000077500000000000000000000000001471722043300410215ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000004751471722043300431670ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-windows{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "assert": { "token": "Bearer eyJhY2Nlc3NUb2tlbiI6ImRhdGEtMSIsImlkVG9rZW4iOiJkYXRhLTIifQ==", "name": "spec" }, "env": { "APPDATA": "__CWD", "HOME": "__CWD", "XDG_DATA_HOME": "__CWD" }, "os": "Windows" }expected.txt000066400000000000000000000000471471722043300433640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-windowsSuccessfully published spec to default fig/000077500000000000000000000000001471722043300415665ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-windowscredentials.json000066400000000000000000000000661471722043300447600ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-windows/fig{ "access_token": "data-1", "id_token": "data-2" }spec.ts000066400000000000000000000001001471722043300423120ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-credentials-file-windowsconst completion = { name: "spec" } export default completiontoken-in-env-variable/000077500000000000000000000000001471722043300364725ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixturesconfig.json000066400000000000000000000003201471722043300406250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-env-variable{ "$schema": "../config.schema.json", "options": { "specPath": "spec.ts" }, "assert": { "token": "Bearer some-token", "name": "spec" }, "env": { "FIG_API_TOKEN": "some-token" } }expected.txt000066400000000000000000000000471471722043300410350ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-env-variableSuccessfully published spec to default spec.ts000066400000000000000000000001001471722043300377630ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/fixtures/token-in-env-variableconst completion = { name: "spec" } export default completiongolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/index.ts000066400000000000000000000071431471722043300322670ustar00rootroot00000000000000/* eslint-disable no-await-in-loop */ import nodeOS from "os"; import fs from "fs"; import path from "path"; import pc from "picocolors"; import { fileURLToPath } from "url"; import util from "util"; import { GenerationError } from "../src/errors.js"; import { run } from "../src/run.js"; import { Config } from "./types.js"; import testHelpers from "../src/test-helpers.js"; import { envReplacingCwdValues } from "./utils.js"; const dirname = path.dirname(fileURLToPath(import.meta.url)); const fixturesPath = path.join(dirname, "fixtures"); const dirs = fs .readdirSync(fixturesPath, { withFileTypes: true }) .filter((file) => file.isDirectory() && file.name !== ".DS_Store"); const originalOSTypeMethod = nodeOS.type; const originalProcessEnv = process.env; const originalgetAssertDataHeader = testHelpers.getAssertDataHeader; const originalConsoleLog = console.log; async function runFixtures() { let hadErrors = false; for (const dir of dirs) { const fixtureDirPath = path.join(fixturesPath, dir.name); const outputPath = path.join(fixtureDirPath, "output.txt"); // gitignored const expectedPath = path.join(fixtureDirPath, "expected.txt"); const configPath = path.join(fixtureDirPath, "config.json"); // If assert is undefined it means that the request should never touch the server const { options, assert, os, env }: Config = JSON.parse( fs.readFileSync(configPath, { encoding: "utf-8" }) ); if (options.specPath) options.specPath = path.resolve(fixtureDirPath, options.specPath); if (options.binaryPath) options.binaryPath = path.resolve(fixtureDirPath, options.binaryPath); // Mock Functions and assign env variables const encodedAssertData = Buffer.from(JSON.stringify(assert ?? "{}")).toString("base64"); testHelpers.getAssertDataHeader = () => encodedAssertData ? { "assert-data": encodedAssertData } : {}; if (env) { process.env = { ...process.env, ...envReplacingCwdValues(env, fixtureDirPath) }; } if (os) { nodeOS.type = () => (os === "Linux" ? "Linux" : os === "MacOS" ? "Darwin" : "Windows_NT"); } let out = ""; try { console.log = (...args) => { out += `${util.format(...args)}\n`; }; await run(options); } catch (error) { const { name, message } = error as Error; if (error instanceof GenerationError) { out = "GenerationError: some kind of generation error was produced, run the tests with VERBOSE=true env variable to see more"; } else { out = `${name}: ${message}`; } if (process.env.VERBOSE) { console.error(error); } } finally { console.log = originalConsoleLog; } // Unmock Functions and assign env variables process.env = originalProcessEnv; nodeOS.type = originalOSTypeMethod; testHelpers.getAssertDataHeader = originalgetAssertDataHeader; fs.writeFileSync(outputPath, out); if (process.env.OVERWRITE || !fs.existsSync(expectedPath)) { fs.copyFileSync(outputPath, expectedPath); console.log(pc.yellow(`Fixture "${dir.name}" was regenerated`)); } else { const expected = fs.readFileSync(expectedPath); if (!Buffer.from(out).equals(expected)) { hadErrors = true; console.log("\n"); console.log(pc.red(`Fixture "${dir.name}" is failing:`)); console.log(pc.red(`- ${expected.toString("utf-8")}`)); console.log(pc.green(`+ ${out}`)); } else { console.log(pc.green(`Fixture "${dir.name}" is passing`)); } } console.log(pc.bold("\n-----")); } if (hadErrors) { process.exit(1); } } await runFixtures(); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/server.ts000066400000000000000000000062761471722043300324740ustar00rootroot00000000000000/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import assert from "assert"; import express from "express"; import multer from "multer"; import pc from "picocolors"; import type { AssertFileData, AssertRequest } from "./types"; const PORT = process.env.TEST_PORT || 3005; const app = express(); const upload = multer({ storage: multer.memoryStorage() }); app.use(express.urlencoded({ extended: false })); function isObject(object: any) { return object != null && typeof object === "object"; } function deepEqual(object1: Record, object2: Record) { const keys1 = Object.keys(object1); const keys2 = Object.keys(object2); if (keys1.length !== keys2.length) { return false; } for (const key of keys1) { const val1 = object1[key]; const val2 = object2[key]; const areObjects = isObject(val1) && isObject(val2); if ((areObjects && !deepEqual(val1, val2)) || (!areObjects && val1 !== val2)) { return false; } } return true; } app.put( "/completions", upload.fields([ { name: "tsSpec", maxCount: 1, }, { name: "jsSpec", maxCount: 1, }, ]), async (req, res) => { const token = req.headers.authorization!; const encodedAssertData = req.headers["assert-data"]!; assert(!Array.isArray(encodedAssertData)); const { files, ...rest }: AssertRequest = JSON.parse( Buffer.from(encodedAssertData, "base64").toString("utf-8") ); const errors: string[] = []; // expect ...rest to be exactly equal to body; if (!deepEqual(rest, { token, ...req.body })) { errors.push("Received data and assert do not match"); } assert(req.files && !Array.isArray(req.files)); if (files) { // expect files content to be exactly the same as the passed in files const specFieldIndexes = ["tsSpec", "jsSpec"] as (keyof typeof files)[]; for (const specFieldIndex of specFieldIndexes) { const assertFileData: AssertFileData | undefined = files[specFieldIndex]; if (assertFileData) { const { name, content } = assertFileData; const multerFile = req.files[specFieldIndex][0] as Express.Multer.File; if (name && name !== multerFile.originalname) { errors.push( `Expected filename "${multerFile.originalname}" for "${specFieldIndex}" and instead received "${name}"` ); } if (content && !multerFile.buffer.equals(Buffer.from(content))) { errors.push( `Received content was different from the expected one for "${specFieldIndex}` ); } } } } if (errors.length) { return res.status(400).json({ error: errors.join("\n") }); } return res.status(200).json({ name: req.body.name, namespace: req.body.team || "default" }); } ); const server = app.listen(PORT, () => { console.log(pc.yellow(`Started listening on ${PORT}`)); }); process.on("SIGTERM", () => { console.log(pc.yellow(`Stopped listening on ${PORT}`)); server.close(); }); process.on("SIGINT", () => { console.log(pc.yellow(`Stopped listening on ${PORT}`)); server.close(); }); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/types.ts000066400000000000000000000007551471722043300323260ustar00rootroot00000000000000import type { RunOptions } from "../src/types"; export interface AssertFileData { name?: string; content?: string; } export interface AssertRequest extends Record { files?: { jsSpec?: AssertFileData; tsSpec?: AssertFileData; }; } export interface Config { options: RunOptions; assert?: AssertRequest; os?: "Linux" | "Windows" | "MacOS"; env?: { APPDATA?: string; FIG_API_TOKEN?: string; XDG_DATA_HOME?: string; HOME?: string; }; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/test/utils.ts000066400000000000000000000005501471722043300323130ustar00rootroot00000000000000import assert from "assert"; import type { Config } from "./types"; export function envReplacingCwdValues(env: Config["env"], dir: string) { assert(env); const newEnv = { ...env }; for (const key of Object.keys(newEnv) as (keyof typeof newEnv)[]) { if (newEnv[key] && newEnv[key] === "__CWD") { newEnv[key] = dir; } } return newEnv; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/publish-spec/tsconfig.json000066400000000000000000000007201471722043300323320ustar00rootroot00000000000000{ "compilerOptions": { "target": "es6", "outDir": "lib/", "rootDir": "src/", "module": "esnext", "moduleResolution": "node", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": false, }, "ts-node": { "esm": true, "compilerOptions": { "target": "ES2017" }, }, "exclude": ["test/", "node_modules/", "lib/", "generate-spec.ts"], } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/000077500000000000000000000000001471722043300271335ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/.gitignore000066400000000000000000000001061471722043300311200ustar00rootroot00000000000000build/ node_modules/ .fig/ generated/ test/*/fixtures/*/updated-spec/*golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/LICENSE000066400000000000000000000020711471722043300301400ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/MIGRATION.md000066400000000000000000000010251471722043300310040ustar00rootroot00000000000000# Migration from `@withfig/autocomplete-tools@1` to `@withfig/autocomplete-tools@2` In v2 we moved our types to a separate package called `@withfig/autocomplete-types`. The transition is as simple as installing the new package and changing an entry in your `tsconfig.json`: ```json { "compilerOptions": { // you may get some typecheck errors if you are using some node packages like "fs" // just include "node" in the below array. Same for "jest", "chai"...and so on "types": ["@withfig/autocomplete-types"] }, } ```golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/README.md000066400000000000000000000054401471722043300304150ustar00rootroot00000000000000

--- ![os](https://img.shields.io/badge/os-%20macOS-light) [![Signup](https://img.shields.io/badge/signup-private%20beta-blueviolet)](https://fig.io?ref=github_autocomplete) [![Documentation](https://img.shields.io/badge/documentation-black)](https://fig.io/docs/) [![Discord](https://img.shields.io/discord/837809111248535583?color=768ad4&label=discord)](https://fig.io/community) [![Twitter](https://img.shields.io/twitter/follow/fig.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=fig) # Fig Autocomplete Boilerplate Repo Looking to build [Fig](https://fig.io) autocomplete for private CLI tools, scripts, or NPM packages? This npx module makes it easy to **build** [Fig autocomplete specs](https://fig.io/docs) and **share** them specs with your team. This repo is similar to a minimal version of our public specs repo, [withfig/autocomplete](https://github.com/withfig/autocomplete), except with an empty `src/` folder. ## Usage ### Init the .fig folder Go to the directory that contains your CLI tool, script, or NPM package and run the following ```bash npx @withfig/autocomplete-tools init ``` This will create initialise a `.fig/` folder in your current working directory like the following ```bash cli/ ├── .fig/ │   └── autocomplete/ │   ├── src/ # where you edit your completion specs │   ├── build/ # where your specs compile to │   ├── .eslintrc.js │   ├── README.md │   ├── package-lock.json │   ├── package.json │   └── tsconfig.json ├── node_mod/ └── my_cli_tool.sh ``` ### Create, test, and compile specs `cd` into the `.fig/autocomplete/` folder and run the remaining commands as package.json scripts ```bash # Make a new empty completion spec object in src/ npm run create-spec # Start dev mode to see live updates to your spec in your terminal as you edit. npm run dev # Compile your specs from the src/ folder to build/ npm run build ``` ### Push Specs to Fig's Cloud Coming soon ## Documentation - [Building your first autocomplete spec](https://fig.io/docs/) - [Personal shortcut autocomplete](https://fig.io/docs/tutorials/visual-shortcuts) - [Autocomplete for teams / internal CLI tools](https://fig.io/docs/tutorials/building-internal-clis) - [Autocomplete for local scripts](https://fig.io/docs/tutorials/autocomplete-for-internal-scripts) ## 😊 Need Help? Email [hello@fig.io](mailto:hello@fig.io)

Join our community

golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/docs/000077500000000000000000000000001471722043300300635ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/docs/merge.md000066400000000000000000000062401471722043300315060ustar00rootroot00000000000000# Merge tool docs The merge tool is an handy tool that helps to merge an old version of a spec in a new one. ## Usage ```sh npx @withfig/autocomplete-tools@latest merge [-p, --presets ] [--ignore-command-props ] [--ignore-option-props ] [--ignore-arg-props ] ``` ## How it works Basically it keeps everything from the old spec (which must be the one that has some manually added properties, generators...) and overrides the properties that are specified in the [options](#further-customization) or in the [preset](#presets). ## Presets We provide some presets to be used along with our [integrations](https://fig.io/docs/guides/autocomplete-for-teams#next-steps). For example if you regenerated a spec after an update to your CLI structure you can easily pass the `--preset ` option to the merge tool and it will merge the two specs like magic keeping the options you customized in the old one but also adding, removing and updating everything new. ``` npx @withfig/autocomplete-tools@latest merge old-spec.ts new-spec.ts --preset commander ``` > See a live example directly in this repo [package.json](https://github.com/withfig/autocomplete-tools/blob/262cc31134e95e50ee546c67d343ea6661e17592/packages/autocomplete-tools/package.json#L11). ## Further customization If you are not using any of our integrations because you built some custom generator for your specs, then you can customize how the merge tool behaves through some options: - `--ignore-command-props `: the **command** props that should always be overridden - `--ignore-option-props `: the **option** props that should always be overridden - `--ignore-arg-props `: the **arg** props that should always be overridden There is also another option that allows to specify some kind of props that should always be overridden in each of the contexts specified above: - `-i, --ignore-props `: the props that should always be overridden ### How all these options will help me? Well, if you built a custom spec generation tool you are probably generating only some of the several props that Fig's Autocomplete allows you to add to a spec, and maybe you are adding some props manually after the generation. With the options mentioned above you can tell the merge tool which are the properties that you are autogenerating so that it keeps those always updated while still maintaining your manual edits. ### Example Your custom generation tool creates specs that only contain subcommand `name` and `description`, no args and no options. The resulting spec may look something like this: ```ts /* new spec autogenerated */ const completionSpec: Fig.Spec = { name: "my-cli", description: "Some description", subcommands: [{ name: "my-cli-subcommand", description: "Some subcommand description" }] // missing options and args that have probably been manually added in the old spec } ``` So you will call the merge tool with the following options: ```sh npx @withfig/autocomplete-tools@latest merge --ignore-command-props=name,description,subcommands ``` > **NOTE**: we are explicitly adding `subcommands` prop to the command ignored props. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/generate-spec.ts000066400000000000000000000003441471722043300322260ustar00rootroot00000000000000// eslint-disable-next-line import/no-extraneous-dependencies import { addCompletionSpecCommand } from "@fig/complete-commander"; import { program } from "./src"; addCompletionSpecCommand(program); program.parse(process.argv); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/package.json000066400000000000000000000032041471722043300314200ustar00rootroot00000000000000{ "name": "@withfig/autocomplete-tools", "version": "2.10.0", "description": "Command line tools for working with fig autocomplete specs", "author": "The Fig Team", "scripts": { "build": "rm -rf build/ && pnpm run build:bin && pnpm run build:lib", "build:bin": "esbuild src/bin.ts --bundle --platform=node --packages=external --outdir=build --minify", "build:lib": "tsc", "test": "tsx test/index.ts", "test:overwrite": "OVERWRITE=true pnpm test", "prepack": "pnpm build", "generate-spec": "tsx generate-spec.ts generate-fig-spec" }, "license": "MIT", "bin": "./build/bin.js", "main": "./build/index.js", "types": "./build/index.d.ts", "files": [ "build/" ], "dependencies": { "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@fig/autocomplete-helpers": "workspace:^", "@fig/autocomplete-merge": "workspace:^", "@types/semver": "^7.5.8", "chalk": "^4.1.2", "chokidar": "^4.0.1", "commander": "^11.1.0", "create-completion-spec": "workspace:^", "esbuild": "^0.23.1", "fast-glob": "^3.3.2", "module-from-string": "^3.3.1", "prettier": "^3.3.3", "semver": "^7.6.3", "typescript": "^5.5.4" }, "devDependencies": { "@fig/complete-commander": "workspace:^", "@types/node": "^22.5.2", "@withfig/autocomplete-types": "workspace:^", "tsx": "^4.19.0" }, "fig": { "build": { "description": "Typecheck and build the project", "icon": "🛠" }, "prepack": { "description": "Run build before packing the package for publishing", "icon": "🛠" } }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/000077500000000000000000000000001471722043300277225ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/bin.ts000066400000000000000000000001171471722043300310410ustar00rootroot00000000000000#!/usr/bin/env node import { program } from "."; program.parse(process.argv); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/index.ts000066400000000000000000000011711471722043300314010ustar00rootroot00000000000000#!/usr/bin/env node import { Command } from "commander"; import merge from "./scripts/merge"; import dev from "./scripts/dev"; import createSpec from "./scripts/create-spec"; import compile from "./scripts/compile"; import init from "./scripts/init"; import version from "./scripts/version"; const program = new Command(); program .name("@withfig/autocomplete-tools") .description("Dev tools for fig's autocomplete") .version("1.0.0"); program.addCommand(init); program.addCommand(createSpec); program.addCommand(compile); program.addCommand(dev); program.addCommand(merge); program.addCommand(version); export { program }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scripts/000077500000000000000000000000001471722043300314115ustar00rootroot00000000000000compile.ts000066400000000000000000000066001471722043300333340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { build } from "esbuild"; import { NodeModulesPolyfillPlugin } from "@esbuild-plugins/node-modules-polyfill"; import chokidar from "chokidar"; import { Command } from "commander"; import glob from "fast-glob"; import fs from "node:fs/promises"; import path from "node:path"; import SpecLogger, { Level } from "./log"; import { setSetting } from "./settings"; // Folder names const SOURCE_FOLDER_NAME = "src"; const DEFAULT_DESTINATION_FOLDER_NAME = "build"; function invalidateCache() { setSetting("autocomplete.developerModeNPMInvalidateCache", true); } /** * Generate index files for spec build */ async function generateIndex(outdir: string, files: string[]) { const parsedFiles = files.map(path.parse); const diffVersionedSpecNames = parsedFiles .filter(({ base }) => base === "index.ts") .map(({ dir }) => dir.replace(/^src\//, "")); diffVersionedSpecNames.sort(); const specNames = parsedFiles .filter(({ base, ext }) => base !== "index.ts" && ext === ".ts") .map((p) => `${p.dir}/${p.name}`.replace(/^src\//, "")) .concat(diffVersionedSpecNames); specNames.sort(); await fs.mkdir(outdir, { recursive: true }); Promise.all([ // index.js await fs.writeFile( path.join(outdir, "index.js"), `var e=${JSON.stringify(specNames)},diffVersionedCompletions=${JSON.stringify( diffVersionedSpecNames )};export{e as default,diffVersionedCompletions};` ), // index.json fs.writeFile( path.join(outdir, "index.json"), JSON.stringify({ completions: specNames, diffVersionedCompletions: diffVersionedSpecNames, }) ), // index.d.ts fs.writeFile( path.join(outdir, "index.d.ts"), `declare const completions: string[] declare const diffVersionedCompletions: string[] export { completions as default, diffVersionedCompletions } ` ), ]); } /** * Transpiles all passed files and prints the progress * @param specs Array of filepaths */ async function processFiles(files: string[], isDev?: boolean, outdir?: string) { const fileName = files.length === 1 ? files[0] : `${files.length} specs`; await Promise.all([ build({ entryPoints: files, outdir: outdir ?? DEFAULT_DESTINATION_FOLDER_NAME, bundle: true, outbase: "src", format: "esm", minify: true, plugins: [NodeModulesPolyfillPlugin()], ...(isDev && { sourcemap: "inline" }), }).catch((e) => SpecLogger.log(`Error building ${fileName}: ${e.message}`, Level.ERROR)), generateIndex(outdir ?? DEFAULT_DESTINATION_FOLDER_NAME, files), ]); SpecLogger.log(`Built ${fileName}`); invalidateCache(); } export async function runCompiler({ watch, outdir }: { watch: boolean; outdir?: string }) { const SOURCE_FILE_GLOB = `${SOURCE_FOLDER_NAME}/**/*.ts`; const files = await glob(SOURCE_FILE_GLOB); await processFiles(files, undefined, outdir); if (watch) { const watcher = chokidar.watch(SOURCE_FILE_GLOB, { ignoreInitial: true }); // Process the changed file watcher.on("change", (file) => processFiles([file], true, outdir)); watcher.on("add", (file) => processFiles([file], true, outdir)); } } const program = new Command("compile") .description("compile specs in the current directory") .option("-w, --watch", "Watch files and re-compile on change") .option("-o, --outdir ", "Output directory") .action(runCompiler); export default program; create-spec.ts000066400000000000000000000020561471722043300341000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { createCompletionSpec } from "create-completion-spec"; import { Command } from "commander"; import readline from "readline"; import path from "path"; import chalk from "chalk"; const program = new Command("create-spec") .description("create spec with given name") .arguments("[name]") .action((specName) => { const autocompleteFolder = path.resolve(process.cwd(), "src"); if (!specName) { const rInterface = readline.createInterface({ input: process.stdin, output: process.stdout, }); rInterface.question( "What's the name of the CLI tool you want to create an autocomplete spec for: ", async (answer) => { try { createCompletionSpec(answer, autocompleteFolder); } catch (error) { console.log(chalk.red((error as Error).message)); process.exit(1); } finally { rInterface.close(); } } ); } else { createCompletionSpec(specName, autocompleteFolder); } }); export default program; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scripts/dev.ts000066400000000000000000000076571471722043300325560ustar00rootroot00000000000000import os from "os"; import fs from "fs"; import path from "path"; import chalk from "chalk"; import { Command } from "commander"; import { runCompiler } from "./compile"; import { isQInstalled, setSetting } from "./settings"; const AUTOCOMPLETE_LOG_FILE = path.join(os.homedir(), ".fig", "logs", "specs.log"); function disableDevMode() { console.log("\n\nFig dev mode disabled\n"); setSetting("autocomplete.developerMode", false); setSetting("autocomplete.developerModeNPM", false); setSetting("autocomplete.developerModeNPMInvalidateCache", true); process.exit(0); } function cleanup() { disableDevMode(); fs.unwatchFile(AUTOCOMPLETE_LOG_FILE); } async function runProgram({ outdir }: { outdir?: string }) { console.clear(); if (os.type() === "Darwin") { const globalFigAppPath = "/Applications/Fig.app"; const localFigAppPath = path.join(os.homedir(), "Applications/Fig.app"); const globalQAppPath = "/Applications/Amazon Q.app"; const localQAppPath = path.join(os.homedir(), "Applications/Amazon Q.app"); if ( !fs.existsSync(globalFigAppPath) && !fs.existsSync(localFigAppPath) && !fs.existsSync(globalQAppPath) && !fs.existsSync(localQAppPath) ) { console.log( "\n******\n\n", chalk.bold(chalk.yellow(" WARNING: Amazon Q for command line app is not installed")), "\n\n", chalk.bold(chalk.cyan(" Download Amazon Q for command line at:")), "\n https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-getting-started-installing.html", "\n\n******\n" ); } } else if (os.type() === "Linux") { console.log( "\n******\n\n", chalk.bold(chalk.yellow(" WARNING: Amazon Q for command line on Linux is not supported yet")), "\n\n" ); } else if (!isQInstalled()) { console.log( "\n******\n\n", chalk.bold(chalk.yellow(" WARNING: Amazon Q for command line is not installed")), "\n\n", chalk.bold(chalk.cyan(" Download Amazon Q for command line at:")), "\n https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-getting-started-installing.html", "\n\n******\n" ); } console.log( `Welcome to ${chalk.magenta("Fig Dev Mode")}!\n\n`, `All completions will be loaded from ${chalk.bold( `${process.cwd()}/${outdir ?? "build"}` )}. (Note: other completions won't work while in dev mode).\n\n`, `1. Edit your spec(s) in the ${chalk.bold("src/")} directory.\n`, `2. Test changes ${chalk.bold("instantly")} on save in your terminal.\n`, `3. Exit developer mode with ${chalk.bold("ctrl + c")}.\n\n`, `${chalk.bold("Other Notes:")}\n`, `- Generators run on every keystroke\n` ); // We are on macos and the fig script exists process.addListener("SIGTERM", cleanup); process.addListener("SIGINT", cleanup); process.addListener("SIGQUIT", cleanup); setSetting("autocomplete.developerModeNPM", true); setSetting( "autocomplete.devCompletionsFolder", path.join(process.cwd(), outdir ?? "build").replace(/(\s)/g, "\\$1") ); if (!fs.existsSync(path.dirname(AUTOCOMPLETE_LOG_FILE))) { fs.mkdirSync(path.dirname(AUTOCOMPLETE_LOG_FILE), { recursive: true }); } fs.writeFileSync(AUTOCOMPLETE_LOG_FILE, "", { encoding: "utf8" }); let previousLogContent = ""; fs.watch(AUTOCOMPLETE_LOG_FILE, (event) => { if (event === "change") { const currentContent = fs.readFileSync(AUTOCOMPLETE_LOG_FILE, { encoding: "utf8" }).trim(); const message = previousLogContent ? currentContent.split("\n").slice(previousLogContent.split("\n").length).join("\n") : currentContent; console.log(chalk.yellow(message)); previousLogContent = currentContent; } }); await runCompiler({ watch: true, outdir }); } const program = new Command("dev") .description("watch for changes and compile specs") .option("-o, --outdir ", "Output directory") .action(runProgram); export default program; init.ts000066400000000000000000000004271471722043300326500ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { createBoilerplateFolder } from "create-completion-spec"; import { Command } from "commander"; const program = new Command("init") .description("initialize fig custom spec boilerplate in current directory") .action(createBoilerplateFolder); export default program; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scripts/log.ts000066400000000000000000000010601471722043300325370ustar00rootroot00000000000000import chalk from "chalk"; // An enum representing the log level and the color to use // in chalk to render this level. // eslint-disable-next-line no-shadow export enum Level { INFO = "blue", ERROR = "red", SUCCESS = "green", } /** * Log a message in the console. Can specify a Level, which * will be INFO by default. * * @param message The message to log * @param level The level to log */ export default abstract class SpecLogger { static log(message: string, level: Level = Level.INFO): void { console.log(chalk[level](message)); } } merge.ts000066400000000000000000000036251471722043300330070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport fs from "fs"; import { Command, Option } from "commander"; import { merge, presets, PresetName } from "@fig/autocomplete-merge"; async function runProgram( oldSpecPath: string, newSpecPath: string, options: { ignoreProps: string[]; ignoreCommandProps: string[]; ignoreOptionProps: string[]; ignoreArgProps: string[]; newFile: string; preset: PresetName; } ) { const { ignoreProps = [], ignoreCommandProps = [], ignoreOptionProps = [], ignoreArgProps = [], newFile: updatedSpecPath, preset, } = options; const output = await merge( fs.readFileSync(oldSpecPath, { encoding: "utf8" }), fs.readFileSync(newSpecPath, { encoding: "utf8" }), { preset, ignore: { commonProps: ignoreProps, commandProps: ignoreCommandProps, optionProps: ignoreOptionProps, argProps: ignoreArgProps, }, } ); fs.writeFileSync(updatedSpecPath || oldSpecPath, output); } const program = new Command("merge") .arguments(" ") .description("deep merge new spec into old spec") .option("-n, --new-file ", "Create a new spec file instead of updating the old one") .option("-i, --ignore-props ", "The props that should always be overridden.", (value) => value.split(",") ) .option( "--ignore-command-props ", "The command props that should always be overridden.", (value) => value.split(",") ) .option( "--ignore-option-props ", "The option props that should always be overridden.", (value) => value.split(",") ) .option( "--ignore-arg-props ", "The arg props that should always be overridden.", (value) => value.split(",") ); const presetOption = new Option("-p, --preset ", "Use a preset").choices( Object.keys(presets) ); program.addOption(presetOption); program.action(runProgram); export default program; settings.ts000066400000000000000000000023041471722043300335410ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { execFileSync } from "node:child_process"; export function commandStatus(command: string, args: string[]): boolean { try { execFileSync(command, args); return true; } catch { return false; } } let IS_FIG_INSTALLED: boolean | undefined; export function isFigInstalled(): boolean { if (IS_FIG_INSTALLED === undefined) { IS_FIG_INSTALLED = commandStatus("fig", ["--version"]); } return IS_FIG_INSTALLED; } let IS_CW_INSTALLED: boolean | undefined; export function isCwInstalled(): boolean { if (IS_CW_INSTALLED === undefined) { IS_CW_INSTALLED = commandStatus("cw", ["--version"]); } return IS_CW_INSTALLED; } let IS_Q_INSTALLED: boolean | undefined; export function isQInstalled(): boolean { if (IS_Q_INSTALLED === undefined) { IS_Q_INSTALLED = commandStatus("q", ["--version"]); } return IS_Q_INSTALLED; } export function setSetting(key: string, value: unknown) { if (isQInstalled()) { commandStatus("q", ["settings", key, JSON.stringify(value)]); } else if (isCwInstalled()) { commandStatus("cw", ["settings", key, JSON.stringify(value)]); } else if (isFigInstalled()) { commandStatus("fig", ["settings", key, JSON.stringify(value)]); } } transformer.ts000066400000000000000000000031641471722043300342500ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { factory, isVariableStatement, Node, SyntaxKind, TransformerFactory, VariableStatement, visitEachChild, visitNode, } from "typescript"; // The name of the spec variable const SPEC_NAME = "completionSpec"; const EXPORT_KEYWORD = SyntaxKind.ExportKeyword; /** * The TypeScript transformer to rename the export spec variable name to SPEC_NAME, * and remove the export keyword. * * @param context The current context */ export const specTransformer: TransformerFactory = (context) => (sourceFile) => { let updated = false; const visitor = (node: Node): Node => { if (!updated && isVariableStatement(node)) { const { declarationList, modifiers } = node as VariableStatement; // Only process if there is a modifier, and if this modifier // is an export. if (modifiers && modifiers.length === 1 && modifiers[0].kind === EXPORT_KEYWORD) { const variableNode = declarationList.declarations[0]; updated = true; // Update the variable name to SPEC_NAME const newVariableNode = factory.updateVariableDeclaration( variableNode, factory.createIdentifier(SPEC_NAME), variableNode.exclamationToken, variableNode.type, variableNode.initializer ); const newDeclarationlist = factory.updateVariableDeclarationList(declarationList, [ newVariableNode, ]); // Remove the export keyword return factory.updateVariableStatement(node, [], newDeclarationlist); } } return visitEachChild(node, visitor, context); }; return visitNode(sourceFile, visitor); }; version.ts000066400000000000000000000215031471722043300333700ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/src/scriptsimport { Command } from "commander"; import semver from "semver"; import { applySpecDiff, diffSpecs } from "@fig/autocomplete-helpers"; import { importFromStringSync } from "module-from-string"; import prettier from "prettier"; import fs from "fs"; import ts from "typescript"; import { build } from "esbuild"; import path from "path"; export const copyDirectorySync = (oldPath: string, newPath: string) => { if (!fs.existsSync(newPath)) { fs.mkdirSync(newPath, { recursive: true }); } for (const dirent of fs.readdirSync(oldPath, { withFileTypes: true })) { if (dirent.isDirectory()) { copyDirectorySync(path.resolve(oldPath, dirent.name), path.resolve(newPath, dirent.name)); } else if (dirent.isFile()) { fs.writeFileSync( path.resolve(newPath, dirent.name), fs.readFileSync(path.resolve(oldPath, dirent.name)), { encoding: "utf8" } ); } } }; const visitFileNodes = (source: ts.SourceFile, visitor: ts.Visitor): ts.Node => ts.transform(source, [ (context: ts.TransformationContext) => (rootNode: ts.Node) => { const visit = (node: ts.Node): ts.VisitResult => visitor(ts.visitEachChild(node, visit, context)) as ts.VisitResult; return ts.visitNode(rootNode, visit); }, ]).transformed[0]; const findInFile = (source: ts.SourceFile, predicate: (node: ts.Node) => T | null): T[] => { const matches: T[] = []; visitFileNodes(source, (node: ts.Node) => { // Find a node like "export { versions };" const match = predicate(node); if (match !== null) { matches.push(match); } return node; }); return matches; }; const formatSource = (source: string | string[]) => prettier.format(Array.isArray(source) ? source.join("\n") : source, { parser: "typescript", }); const loadTypescriptModule = async (modulePath: string) => { const jsString = ( await build({ entryPoints: [modulePath], bundle: true, write: false, sourcemap: false, loader: { ".ts": "ts" }, keepNames: true, target: "esnext", minify: false, format: "esm", }) ).outputFiles[0].text; return importFromStringSync(jsString, { dirname: process.cwd(), }); }; const loadVersionedSpec = async ( specPath: string, defaultSpec: Fig.Subcommand ): Promise<{ source: string; spec: Fig.Subcommand; versions: Fig.VersionDiffMap; }> => { if (!fs.existsSync(specPath)) { // TODO: change the way the spec is printed, currently it won't support js variables return { source: await formatSource([ `const completion: Fig.Subcommand = ${JSON.stringify(defaultSpec, null, 4)}\n`, `const versions: Fig.VersionDiffMap = {};\n`, `export { versions };`, `export default completion`, ]), spec: defaultSpec, versions: {}, }; } const imports = await loadTypescriptModule(specPath); if (!imports.versions) { throw new Error("Path does not contain versioned spec"); } return { source: fs.readFileSync(specPath).toString(), spec: imports.default, versions: imports.versions, }; }; async function addVersionToIndex(sourcePath: string, version: string) { const source = fs.readFileSync(sourcePath).toString(); let didUpdate = false; const sourceFile = ts.createSourceFile(sourcePath, source, ts.ScriptTarget.ES2015, true); const newSource = visitFileNodes(sourceFile, (node: ts.Node): ts.Node => { if ( ts.isArrayLiteralExpression(node) && ts.isVariableDeclaration(node.parent) && ts.isIdentifier(node.parent.name) && node.parent.name.escapedText === "versionFiles" ) { didUpdate = true; return ts.factory.updateArrayLiteralExpression(node, [ ...node.elements, ts.factory.createStringLiteral(version), ]); } return node; }); if (!didUpdate) { throw new Error("Failed to add version to index"); } const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); const result = printer.printNode(ts.EmitHint.Unspecified, newSource, sourceFile); fs.writeFileSync(sourcePath, await formatSource(result)); } const cleanPath = (p: string) => p.replace(/[^a-zA-Z0-9_\-/.]/, ""); async function initVersionedSpec(specName: string, options: { cwd?: string }) { const cleanedSpecName = cleanPath(specName); const rootSpecPath = path.resolve(options.cwd ?? process.cwd(), specName); fs.mkdirSync(rootSpecPath, { recursive: true }); fs.writeFileSync( `${rootSpecPath}/index.ts`, await formatSource( [ `import { createVersionedSpec } from "@fig/autocomplete-helpers";\n`, `const versionFiles = [];\n`, `export default createVersionedSpec("${cleanedSpecName}", versionFiles);\n`, ].join("\n") ) ); } async function addDiffAction( specName: string, newSpecPath: string, diffVersion: string, options: { newPath?: string; useMinorBase?: boolean; cwd?: string } ) { let folderSpecPath = path.resolve(options.cwd ?? process.cwd(), specName); if (options.newPath) { const newPath = path.resolve(options.newPath, specName); if (fs.existsSync(folderSpecPath)) { // check that the new path is not a child of the old const relative = path.relative(folderSpecPath, newPath); const isSubdirectory = relative && !relative.startsWith("..") && !path.isAbsolute(relative); if (isSubdirectory) throw new Error("'--new-path' must not be a sub-directory of the old spec directory"); copyDirectorySync(folderSpecPath, newPath); } else { await initVersionedSpec(specName, { cwd: options.newPath }); } folderSpecPath = newPath; } else if (!fs.existsSync(folderSpecPath)) { await initVersionedSpec(specName, { cwd: options.cwd }); } const version = semver.parse(diffVersion); let versionFileName: string; if (version === null) { versionFileName = diffVersion; } else { versionFileName = options.useMinorBase ? `${version.major}.${version.minor}.0` : `${version.major}.0.0`; } const currentSpecPath = path.resolve(folderSpecPath, `${versionFileName}.ts`); const newSpec = (await loadTypescriptModule(newSpecPath)).default as Fig.Subcommand; const { source, spec, versions } = await loadVersionedSpec(currentSpecPath, newSpec); const versionNames = Object.keys(versions).sort(semver.compare); const lastVersion = versionNames[versionNames.length - 1]; if (lastVersion && semver.compare(diffVersion, lastVersion) <= 0) { throw new Error( `Cannot publish version ${diffVersion}, later version ${lastVersion} already exists` ); } const latestSpec = versionNames.map((name) => versions[name]).reduce(applySpecDiff, spec); const diff = diffSpecs(latestSpec, newSpec) ?? {}; const versionExports = findInFile( ts.createSourceFile(currentSpecPath, source, ts.ScriptTarget.ES2015, true), (node: ts.Node) => { if (ts.isExportSpecifier(node) && node.name.escapedText === "versions") { return node.parent.parent; } return null; } ); if (versionExports.length === 0) { throw new Error("No version export found"); } const insertIdx = versionExports[versionExports.length - 1].getStart(); if (!fs.existsSync(currentSpecPath)) { addVersionToIndex(path.resolve(folderSpecPath, "index.ts"), versionFileName); } fs.writeFileSync( currentSpecPath, await formatSource([ source.slice(0, insertIdx), `\nversions["${diffVersion}"] = ${JSON.stringify(diff, null, 4)}\n`, source.slice(insertIdx), ]) ); } // eslint-disable-next-line @typescript-eslint/no-unused-vars async function precomputeAction(files: string[]) { /* for (let file in files) { // For each spec file, check if it is versioned and if so precompute // spec files for each version. } */ throw new Error("Unimplemented"); } export default new Command("version") .addCommand( new Command("add-diff") .arguments(" ") .description("generate version diff from new spec and add into old spec") .option( "-n, --new-path ", "The root folder where the updated spec will be saved. Note: this must NOT include the folder spec name" ) .option("--cwd ", "Resolve the spec name relative to this directory") .option("--use-minor-base", "Create a new version file per minor version") .action(addDiffAction) ) .addCommand( new Command("init-spec") .arguments("") .option("--cwd ", "Generate the spec relative to this directory") .description("Generate versioned spec in folder specified by path") .action(initVersionedSpec) ) .addCommand( new Command("precompute-specs") .arguments("") .description( "[Unimplemented] Precompute versioned specs before publishing the specs repo (unimplemented)" ) .action(precomputeAction) ); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/000077500000000000000000000000001471722043300301125ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/index.ts000066400000000000000000000001371471722043300315720ustar00rootroot00000000000000import { runFixtures as runVersioningFixtures } from "./versioning"; runVersioningFixtures(); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/000077500000000000000000000000001471722043300322755ustar00rootroot00000000000000fixtures/000077500000000000000000000000001471722043300340675ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioningcase-1/000077500000000000000000000000001471722043300351405ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixturesconfig.json000066400000000000000000000000341471722043300372750ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1{ "newVersion": "1.1.0" }expected-spec/000077500000000000000000000000001471722043300376715ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1old-spec/000077500000000000000000000000001471722043300413775ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1/expected-spec1.0.0.ts000066400000000000000000000007071471722043300424070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1/expected-spec/old-specconst completion: Fig.Subcommand = { name: "fig", description: "Description", subcommands: [ { name: "remove", args: { name: "name" }, }, ], }; const versions: Fig.VersionDiffMap = {}; versions["1.0.0"] = {}; versions["1.1.0"] = { description: "Updated description", subcommands: [ { name: "update", description: "New command description", }, ], }; export { versions }; export default completion; index.ts000066400000000000000000000002271471722043300430570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1/expected-spec/old-specimport { createVersionedSpec } from '@fig/autocomplete-helpers' const versionFiles = ['1.0.0'] export default createVersionedSpec('cli', versionFiles) new-spec.ts000066400000000000000000000003651471722043300372350ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1const completionSpec: Fig.completionSpec = { name: "fig", description: "Updated description", subcommands: [{ name: "update", description: "New command description", }, { name: "remove", }], } export default completionSpecold-spec/000077500000000000000000000000001471722043300366465ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-11.0.0.ts000066400000000000000000000004331471722043300376520ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1/old-specconst completion: Fig.Subcommand = { name: 'fig', description: 'Description', subcommands: [ { name: 'remove', args: { name: "name" }, }, ], } const versions: Fig.VersionDiffMap = {} versions['1.0.0'] = {} export { versions } export default completion index.ts000066400000000000000000000002271471722043300403260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-1/old-specimport { createVersionedSpec } from '@fig/autocomplete-helpers' const versionFiles = ['1.0.0'] export default createVersionedSpec('cli', versionFiles) case-2/000077500000000000000000000000001471722043300351415ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixturesconfig.json000066400000000000000000000000341471722043300372760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2{ "newVersion": "1.1.0" }expected-spec/000077500000000000000000000000001471722043300376725ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2old-spec/000077500000000000000000000000001471722043300414005ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/expected-spec1.0.0.ts000066400000000000000000000010131471722043300423770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/expected-spec/old-specimport { generator } from "./generators"; const completion: Fig.Subcommand = { name: "fig", description: "Description", subcommands: [ { name: "remove", args: { name: "name", generators: [generator] }, }, ], }; const versions: Fig.VersionDiffMap = {}; versions["1.0.0"] = {}; versions["1.1.0"] = { description: "Updated description", subcommands: [ { name: "update", description: "New command description", }, ], }; export { versions }; export default completion; generators.ts000066400000000000000000000000761471722043300441240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/expected-spec/old-specexport const generator = () => { return ["hello", "world"] }index.ts000066400000000000000000000002271471722043300430600ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/expected-spec/old-specimport { createVersionedSpec } from '@fig/autocomplete-helpers' const versionFiles = ['1.0.0'] export default createVersionedSpec('cli', versionFiles) new-spec.ts000066400000000000000000000003651471722043300372360ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2const completionSpec: Fig.completionSpec = { name: "fig", description: "Updated description", subcommands: [{ name: "update", description: "New command description", }, { name: "remove", }], } export default completionSpecold-spec/000077500000000000000000000000001471722043300366475ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-21.0.0.ts000066400000000000000000000005361471722043300376570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/old-specimport { generator } from './generators' const completion: Fig.Subcommand = { name: 'fig', description: 'Description', subcommands: [ { name: 'remove', args: { name: "name", generators: [generator] }, }, ], } const versions: Fig.VersionDiffMap = {} versions['1.0.0'] = {} export { versions } export default completion generators.ts000066400000000000000000000000761471722043300413730ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/old-specexport const generator = () => { return ["hello", "world"] }index.ts000066400000000000000000000002271471722043300403270ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-2/old-specimport { createVersionedSpec } from '@fig/autocomplete-helpers' const versionFiles = ['1.0.0'] export default createVersionedSpec('cli', versionFiles) case-3/000077500000000000000000000000001471722043300351425ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixturesconfig.json000066400000000000000000000000341471722043300372770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3{ "newVersion": "1.1.0" }expected-spec/000077500000000000000000000000001471722043300376735ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3old-spec/000077500000000000000000000000001471722043300414015ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3/expected-spec1.0.0.ts000066400000000000000000000005331471722043300424060ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3/expected-spec/old-specconst completion: Fig.Subcommand = { name: "fig", description: "Updated description", subcommands: [ { name: "update", description: "New command description", }, { name: "remove", }, ], }; const versions: Fig.VersionDiffMap = {}; versions["1.1.0"] = {}; export { versions }; export default completion; index.ts000066400000000000000000000002371471722043300430620ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3/expected-spec/old-specimport { createVersionedSpec } from "@fig/autocomplete-helpers"; const versionFiles = ["1.0.0"]; export default createVersionedSpec("old-spec", versionFiles); new-spec.ts000066400000000000000000000003651471722043300372370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-3const completionSpec: Fig.completionSpec = { name: "fig", description: "Updated description", subcommands: [{ name: "update", description: "New command description", }, { name: "remove", }], } export default completionSpeccase-4/000077500000000000000000000000001471722043300351435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixturesconfig.json000066400000000000000000000000341471722043300373000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4{ "newVersion": "2.8.0" }expected-spec/000077500000000000000000000000001471722043300376745ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4old-spec/000077500000000000000000000000001471722043300414025ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/expected-spec1.0.0.ts000066400000000000000000003070741471722043300424210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/expected-spec/old-specimport { settingsSpecGenerator, subsystemsGenerator, themesGenerator, pluginsGenerator, tokensGenerators, invitationsGenerators, membersGenerators, teamsGenerators, workflowsSpecGenerator, sshHostsGenerator, sshIdentityGenerator, userGenerator, } from "./shared"; const completion: Fig.Subcommand = { name: "fig", description: "The CLI for Fig", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal psudo-terminal path", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session-id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ], }, { name: "event", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "event-name", }, }, { name: "hide", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "integration-ready", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app-identifier", }, { name: "focused-session-id", }, ], }, { name: "pre-exec", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "prompt", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "ssh", options: [ { name: "--version", description: "Print version information", }, { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control-path", }, { name: "remote-dest", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch build", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "build", suggestions: ["dev", "prod", "staging"], }, }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isOptional: true, generators: subsystemsGenerator, }, }, { name: "ime", description: "Fig input method editor", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", suggestions: [ "install", "uninstall", "select", "deselect", "enable", "disable", "status", "register", ], }, }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "unix-socket", description: "Debug fig unix sockets", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "shell-integrations", description: "Toggle shell integrations", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: ["refresh", "reset", "prompt", "open", "status"], }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", filterStrategy: "fuzzy", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-d", "--delete"], description: "Delete", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], generateSpec: settingsSpecGenerator, }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: ["-y", "--no-confirm"], description: "Force update", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: ["pre", "post"], }, ], hidden: true, }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, generators: themesGenerator, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], icon: "fig://icon?type=twitter", }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isOptional: true, }, icon: "fig://icon?type=github", }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Manually refresh the auth token", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Details about the current user", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell compleations", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: "--version", description: "Print version information", }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "callback", description: "Callback used for the internal psudoterminal", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler-id", }, { name: "filename", isOptional: true, }, { name: "exit-code", isOptional: true, }, ], }, { name: "install", description: "Install fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--binary", description: "Uninstall only the binary", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "warn-user-when-uninstalling-incorrectly", description: "Notify the user that they are uninstalling incorrectly", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "animation", options: [ { name: ["-f", "--filename"], args: { name: "filename", isOptional: true, }, }, { name: ["-r", "--rate"], args: { name: "rate", isOptional: true, }, }, { name: ["-b", "--before-text"], args: { name: "before-text", isOptional: true, }, }, { name: ["-a", "--after-text"], args: { name: "after-text", isOptional: true, }, }, { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "alpha", description: "(LEGACY) Old way to launch mission control", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: false }), }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: true }), }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: ["-f", "--format"], description: "The output format", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; const versions: Fig.VersionDiffMap = {}; versions["1.3.0"] = {}; versions["1.3.1"] = { subcommands: [ { name: "debug", subcommands: [ { name: "shell-integrations", remove: true, }, ], }, { name: "settings", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", subcommands: [ { name: "enable", description: "Enable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "init", options: [ { name: "--rcfile", args: { name: "rcfile", isOptional: true, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "local-state", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "uninstall", options: [ { name: "--ssh", description: "Uninstall only the ssh integration", }, ], }, ], }, { name: "plugins", subcommands: [ { name: "list", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isOptional: true, }, }, ], }; versions["1.4.0"] = { subcommands: [ { name: "app", subcommands: [ { name: "uninstall", options: [ { name: "--user-data", description: "Remove configuration and data files", }, { name: "--app-bundle", description: "Remove executable and", }, { name: "--input-method", description: "Remove input method", }, { name: "--terminal-integrations", description: "Remove terminal integrations (i.e. VSCode, iTerm2, etc.)", }, { name: "--daemon", description: "Remove Fig daemon", }, { name: "--dotfiles", description: "Remove dotfile shell integration", }, { name: "--ssh", description: "Remove SSH integration", }, { name: "--no-open", description: "Do not open the uninstallation page", }, ], }, ], }, { name: "debug", subcommands: [ { name: "dotfiles", description: "Debug dotfiles", options: [ { name: "--version", description: "Print version information", }, { name: "--disable", description: "Disable debug mode", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, { name: "user", subcommands: [ { name: "login", description: "Login to Fig", options: [ { name: "--version", description: "Print version information", }, { name: ["-r", "--refresh"], description: "Manually refresh the auth token", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "logout", description: "Logout of Fig", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "whoami", options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-e", "--only-email"], description: "Only print the user's email address, this is quicker since it doesn't require a network request", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", description: "The expiration date of the token in RFC3339 format", exclusiveOn: ["--expires-in"], args: { name: "expires-date", isOptional: true, }, }, { name: "--expires-in", description: 'The time till the token expires (e.g. "90d")', exclusiveOn: ["--expires-date"], args: { name: "expires-in", isOptional: true, }, }, { name: ["-t", "--team"], description: "The team namespace to create the token for", args: { name: "team", generators: teamsGenerators, }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], args: { name: "name", }, }, { name: "list", options: [ { name: ["-t", "--team"], description: "The team namespace to list the tokens for", exclusiveOn: ["-p", "--personal"], args: { name: "team", generators: teamsGenerators, }, }, { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, { name: ["-p", "--personal"], description: "Only list tokens owned by the current user", exclusiveOn: ["-t", "--team"], }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], description: "The team namespace to revoke the token for", args: { name: "team", generators: teamsGenerators, }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], args: { name: "name", generators: tokensGenerators, }, }, ], options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], }, { name: "team", args: { name: "team", generators: teamsGenerators, isOptional: true, loadSpec: { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: membersGenerators, }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: invitationsGenerators, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], }, }, options: [ { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--list", exclusiveOn: ["--new", "--delete"], }, { name: "--new", exclusiveOn: ["--list", "--delete"], }, { name: "--delete", exclusiveOn: ["--list", "--new"], }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["internal", "_"], subcommands: [ { name: "hostname", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, ], }; versions["1.4.1"] = { subcommands: [ { name: "app", subcommands: [ { name: "install", options: [ { name: "--version", remove: true, }, ], }, { name: "onboarding", options: [ { name: "--version", remove: true, }, ], }, { name: "running", options: [ { name: "--version", remove: true, }, ], }, { name: "launch", options: [ { name: "--version", remove: true, }, ], }, { name: "restart", options: [ { name: "--version", remove: true, }, ], }, { name: "quit", options: [ { name: "--version", remove: true, }, ], }, { name: "set-path", options: [ { name: "--version", remove: true, }, ], }, { name: "uninstall", options: [ { name: "--user-data", isRepeatable: true, }, { name: "--app-bundle", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--terminal-integrations", isRepeatable: true, }, { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--no-open", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "prompts", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "hook", subcommands: [ { name: "editbuffer", options: [ { name: "--version", remove: true, }, ], }, { name: "hide", options: [ { name: "--version", remove: true, }, ], }, { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "integration-ready", options: [ { name: "--version", remove: true, }, ], }, { name: "keyboard-focus-changed", options: [ { name: "--version", remove: true, }, ], }, { name: "pre-exec", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt", options: [ { name: "--version", remove: true, }, ], }, { name: "ssh", options: [ { name: "--prompt", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "event", remove: true, }, ], }, { name: "debug", subcommands: [ { name: "app", options: [ { name: "--version", remove: true, }, ], }, { name: "dotfiles", options: [ { name: "--disable", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "build", options: [ { name: "--version", remove: true, }, ], }, { name: "autocomplete-window", options: [ { name: "--version", remove: true, }, ], }, { name: "logs", options: [ { name: "--version", remove: true, }, ], args: { isVariadic: true, }, }, { name: "ime", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt-accessibility", options: [ { name: "--version", remove: true, }, ], }, { name: "sample", options: [ { name: "--version", remove: true, }, ], }, { name: "unix-socket", options: [ { name: "--version", remove: true, }, ], }, { name: "verify-codesign", options: [ { name: "--version", remove: true, }, ], }, { name: "accessibility", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "settings", subcommands: [ { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "docs", options: [ { name: "--version", remove: true, }, ], }, { name: "open", options: [ { name: "--version", remove: true, }, ], }, { name: "sync", options: [ { name: "--version", remove: true, }, ], }, { name: "all", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-r", "--remote"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-d", "--delete"], isRepeatable: true, }, ], }, { name: "tips", subcommands: [ { name: "enable", options: [ { name: "--version", remove: true, }, ], }, { name: "disable", options: [ { name: "--version", remove: true, }, ], }, { name: "reset", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "install", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--no-confirm", isRepeatable: true, }, { name: "--force", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, ], }, { name: "ssh", subcommands: [ { name: "enable", options: [ { name: "--version", remove: true, }, ], }, { name: "disable", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "update", options: [ { name: ["-y", "--no-confirm"], isRepeatable: true, }, ], }, { name: "diagnostic", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--force", isRepeatable: true, }, ], }, { name: "init", options: [ { name: "--rcfile", isRepeatable: true, }, ], }, { name: "theme", options: [ { name: "--list", exclusiveOn: ["--folder"], isRepeatable: true, }, { name: "--folder", exclusiveOn: ["--list"], isRepeatable: true, }, ], }, { name: "issue", options: [ { name: ["-f", "--force"], isRepeatable: true, }, ], args: { isVariadic: true, }, }, { name: "login", options: [ { name: ["-r", "--refresh"], isRepeatable: true, }, { name: "--hard-refresh", description: "Manually refresh the auth token", isRepeatable: true, }, ], }, { name: "user", subcommands: [ { name: "login", options: [ { name: ["-r", "--refresh"], isRepeatable: true, }, { name: "--hard-refresh", description: "Manually refresh the auth token", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "logout", options: [ { name: "--version", remove: true, }, ], }, { name: "whoami", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-e", "--only-email"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", isRepeatable: true, }, { name: "--expires-in", isRepeatable: true, }, { name: ["-t", "--team"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "list", options: [ { name: ["-t", "--team"], isRepeatable: true, }, { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-p", "--personal"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "validate", description: "Validate a token is valid", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "token", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "team", subcommands: [ { name: "members", options: [ { name: "--version", remove: true, }, ], }, { name: "remove", options: [ { name: "--version", remove: true, }, ], }, { name: "add", options: [ { name: "--role", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "invitations", options: [ { name: "--version", remove: true, }, ], }, { name: "revoke", options: [ { name: "--version", remove: true, }, ], }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--list", isRepeatable: true, }, { name: "--new", isRepeatable: true, }, { name: "--delete", isRepeatable: true, }, ], }, { name: "doctor", options: [ { name: "--verbose", isRepeatable: true, }, { name: "--strict", isRepeatable: true, }, ], }, { name: "completion", args: { suggestions: [ { name: "bash", description: "Bash shell completions", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], subcommands: [ { name: "prompt-dotfiles-changed", options: [ { name: "--version", remove: true, }, ], }, { name: "local-state", subcommands: [ { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "open", options: [ { name: "--version", remove: true, }, ], }, { name: "all", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-d", "--delete"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "callback", options: [ { name: "--version", remove: true, }, ], }, { name: "install", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--no-confirm", isRepeatable: true, }, { name: "--force", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "install-ibus", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "fig-ibus-engine-location", }, }, { name: "uninstall", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--binary", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "get-shell", options: [ { name: "--version", remove: true, }, ], }, { name: "hostname", options: [ { name: "--version", remove: true, }, ], }, { name: "should-figterm-launch", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "event", options: [ { name: "--name", description: "Name of the event", isRepeatable: true, args: { name: "name", }, }, { name: "--payload", description: "Payload of the event as a JSON string", isRepeatable: true, args: { name: "payload", isOptional: true, }, }, { name: "--apps", description: "Apps to send the event to", isRepeatable: true, args: { name: "apps", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "auth-token", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "request", options: [ { name: "--route", isRepeatable: true, args: { name: "route", }, }, { name: "--method", isRepeatable: true, args: { name: "method", }, }, { name: "--body", isRepeatable: true, args: { name: "body", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "warn-user-when-uninstalling-incorrectly", remove: true, }, { name: "animation", remove: true, }, ], }, { name: "plugins", subcommands: [ { name: "sync", options: [ { name: "--version", remove: true, }, ], }, { name: "update", options: [ { name: "--version", remove: true, }, ], }, { name: "add", options: [ { name: "--version", remove: true, }, ], }, { name: "remove", options: [ { name: "--version", remove: true, }, ], }, { name: "list", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-i", "--installed"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, ], }, { name: "man", args: { isVariadic: true, }, }, { name: ["run", "r", "workflow", "workflows", "flow", "flows"], description: "Search for and execute workflows", filterStrategy: "fuzzy", options: [ { name: ["-h", "--help"], priority: 20, description: "Print help information", }, ], generateSpec: workflowsSpecGenerator, }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, ], }; versions["1.4.3"] = { subcommands: [ { name: "ssh", subcommands: [ { name: "enable", remove: true }, { name: "disable", remove: true }, { name: "help", remove: true }, ], options: [ { name: ["-a", "--auth"], description: "Identity to connect with", args: { name: "auth", generators: sshIdentityGenerator, }, }, ], args: { name: "host", filterStrategy: "fuzzy", generators: sshHostsGenerator, }, }, { name: "login", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, ], }, { name: "user", subcommands: [ { name: "login", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, ], }, { name: "tokens", subcommands: [ { name: "list", options: [ { name: ["-p", "--personal"], remove: true, }, ], }, ], }, ], }, { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "request", options: [ { name: "--method", args: { isOptional: true, suggestions: [ "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ], }, }, ], }, { name: "ipc", options: [ { name: "--figterm", isRepeatable: true, args: { name: "figterm", isOptional: true, }, }, { name: "--json", isRepeatable: true, args: { name: "json", }, }, { name: "--app", }, { name: "--daemon", }, { name: "--recv", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, { name: "onboarding", hidden: true, }, { name: "plugins", subcommands: [ { name: "list", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, ], }, { name: "info", description: "Info about a specific plugin", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "configure", description: "Configure a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "plugin", isOptional: true, }, { name: "config", isOptional: true, }, ], }, ], }, { name: [ "workflow", "run", "r", "workflows", "snippet", "snippets", "flow", "flows", ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: "integrations", description: "Managed system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "alpha", remove: true, }, ], }; versions["1.4.7"] = { subcommands: [ { name: "ssh", options: [ { name: "--get-identities", }, ], }, { name: ["internal", "_"], subcommands: [ { name: "request", options: [ { name: "--namespace", isRepeatable: true, args: { name: "namespace", isOptional: true, }, }, ], }, ], }, { name: "integrations", description: "Manage system integrations", }, ], }; versions["1.4.10"] = { subcommands: [ { name: "ssh", options: [ { name: ["-a", "--auth"], args: { isOptional: true, }, }, ], }, { name: "login", options: [ { name: "--switchable", hidden: true, }, ], args: { name: "email", isOptional: true, }, }, { name: "user", subcommands: [ { name: "login", options: [ { name: "--switchable", hidden: true, }, ], args: { name: "email", isOptional: true, }, }, { name: "tokens", description: "Subcommand for dealing with tokens", }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "switch", description: "Switch to a switchable account", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: userGenerator, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "fig-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "figterm-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "session-id", }, }, ], }, { name: "ai", description: "English -> Bash translation", options: [ { name: ["-n", "--n"], description: "Number of completions to generate (must be <=5)", hidden: true, args: { name: "n", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "input", isVariadic: true, isOptional: true, }, }, { name: "pro", description: "Fig Pro", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }; export { versions }; export default completion; 2.0.0.ts000066400000000000000000003651471471722043300424270ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/expected-spec/old-specimport { settingsSpecGenerator, subsystemsGenerator, themesGenerator, pluginsGenerator, tokensGenerators, invitationsGenerators, membersGenerators, teamsGenerators, workflowsSpecGenerator, sshHostsGenerator, sshIdentityGenerator, userGenerator, } from "./shared"; const completion: Fig.Subcommand = { name: "fig", description: "Top level cli commands", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal pseudo-terminal path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--app-bundle", description: "Remove executable and user data", }, { name: "--input-method", description: "Remove input method", }, { name: "--daemon", description: "Remove Fig daemon", }, { name: "--dotfiles", description: "Remove dotfile shell integration", }, { name: "--ssh", description: "Remove SSH integration", }, { name: "--no-open", description: "Do not open the uninstallation page", }, { name: "--only-open", description: "Only open the uninstallation page", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session_id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ], }, { name: "hide", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "integration-ready", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app_identifier", }, { name: "focused_session_id", }, ], }, { name: "pre-exec", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "prompt", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "ssh", options: [ { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control_path", }, { name: "remote_dest", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dotfiles", description: "Debug dotfiles", options: [ { name: "--disable", description: "Disable debug mode", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch build", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "build", suggestions: ["dev", "prod", "staging"], }, }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--level", isRepeatable: true, args: { name: "level", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isVariadic: true, isOptional: true, generators: subsystemsGenerator, }, }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "unix-socket", description: "Debug fig unix sockets", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "accessibility", description: "Accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: ["refresh", "reset", "prompt", "open", "status"], }, }, { name: "key-tester", description: "Key Tester", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostics", description: "Watches diagnostics", options: [ { name: "--rate", isRepeatable: true, args: { name: "rate", isOptional: true, }, }, { name: "--watch", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", options: [ { name: ["-c", "--channel"], isRepeatable: true, args: { name: "channel", }, }, { name: ["-k", "--kind"], isRepeatable: true, args: { name: "kind", }, }, { name: ["-v", "--variant"], isRepeatable: true, args: { name: "variant", }, }, { name: ["-e", "--version"], isRepeatable: true, args: { name: "version", }, }, { name: ["-a", "--architecture"], isRepeatable: true, args: { name: "architecture", }, }, { name: ["-t", "--override-threshold"], isRepeatable: true, args: { name: "override_threshold", isOptional: true, }, }, { name: ["-r", "--enable-rollout"], }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "devtools", description: "Open up the devtools of a specific webview", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "window", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch build", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "unix-socket", description: "Debug fig unix sockets", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], generateSpec: settingsSpecGenerator, }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", options: [ { name: ["-a", "--auth"], description: "Identity to connect with", isRepeatable: true, args: { name: "auth", isOptional: true, generators: sshIdentityGenerator, }, }, { name: "--get-identities", }, { name: "--ignore-saved", description: "Ignore saved identities", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "host", isOptional: true, generators: sshHostsGenerator, }, }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-y", "--no-confirm"], description: "Force uninstall", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: "--no-confirm", description: "(deprecated) Use --non-interactive instead", }, { name: ["-y", "--non-interactive"], description: "Don't prompt for confirmation", }, { name: "--relaunch-dashboard", description: "Relaunch into dashboard after update (false will launch in background)", }, { name: "--rollout", description: "Uses rollout", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["diagnostic", "diagnostics"], description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: "--rcfile", isRepeatable: true, args: { name: "rcfile", isOptional: true, }, }, { name: "--skip-dotfiles", description: "Whether to skip loading dotfiles", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: ["pre", "post"], }, ], }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: "--list", exclusiveOn: ["--folder"], }, { name: "--folder", exclusiveOn: ["--list"], }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, generators: themesGenerator, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isVariadic: true, isOptional: true, }, }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: 'Add a "not now" option to the choicer', }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: 'Add a "not now" option to the choicer', }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", description: "The expiration date of the token in RFC3339 format", exclusiveOn: ["--expires-in"], isRepeatable: true, args: { name: "expires_date", isOptional: true, }, }, { name: "--expires-in", description: 'The time till the token expires (e.g. "90d")', exclusiveOn: ["--expires-date"], isRepeatable: true, args: { name: "expires_in", isOptional: true, }, }, { name: ["-t", "--team"], description: "The team namespace to create the token for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", }, }, { name: "list", options: [ { name: ["-t", "--team"], description: "The team namespace to list the tokens for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], description: "The team namespace to revoke the token for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", generators: tokensGenerators, }, }, { name: "validate", description: "Validate a token is valid", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "token", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "whoami", description: "Prints details about the current user", options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-e", "--only-email"], description: "Only print the user's email address, this is quicker since it doesn't require a network request", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "plan", description: "Prints details about the user's plan", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "switch", description: "Switch to a switchable account", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: userGenerator, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "team", description: "Manage your fig team", args: { name: "team", generators: teamsGenerators, isOptional: true, loadSpec: { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: membersGenerators, }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", isRepeatable: true, args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: invitationsGenerators, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], }, }, options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--list", exclusiveOn: ["--new", "--delete"], }, { name: "--new", exclusiveOn: ["--list", "--delete"], }, { name: "--delete", exclusiveOn: ["--list", "--new"], }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell completions", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler_id", }, { name: "filename", isOptional: true, }, { name: "exit_code", isOptional: true, }, ], }, { name: "install", description: "Install fig cli", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--input-method", description: "Uninstall only the input method", }, { name: "--binary", description: "Uninstall only the binary", }, { name: "--ssh", description: "Uninstall only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hostname", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "should-figterm-launch", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "event", options: [ { name: "--name", description: "Name of the event", isRepeatable: true, args: { name: "name", }, }, { name: "--payload", description: "Payload of the event as a JSON string", isRepeatable: true, args: { name: "payload", isOptional: true, }, }, { name: "--apps", description: "Apps to send the event to", isRepeatable: true, args: { name: "apps", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "auth-token", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "request", options: [ { name: "--route", isRepeatable: true, args: { name: "route", }, }, { name: "--method", isRepeatable: true, args: { name: "method", isOptional: true, suggestions: [ "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ], }, }, { name: "--body", isRepeatable: true, args: { name: "body", isOptional: true, }, }, { name: "--namespace", isRepeatable: true, args: { name: "namespace", isOptional: true, }, }, { name: "--release", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sockets-dir", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "stream-from-socket", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "figterm-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "session_id", }, }, { name: "ipc", options: [ { name: "--figterm", isRepeatable: true, args: { name: "figterm", isOptional: true, }, }, { name: "--json", isRepeatable: true, args: { name: "json", }, }, { name: "--app", }, { name: "--daemon", }, { name: "--recv", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall-for-all-users", description: "Linux only", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uuidgen", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ibus-bootstrap", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "detect-sandbox", description: "Checks for sandboxing", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open-uninstall-page", options: [ { name: "--verbose", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "remote_dest", }, }, { name: "dump-state", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "component", suggestions: ["figterm"], }, }, { name: "finish-update", options: [ { name: "--relaunch-dashboard", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "remote_username", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "ibus-bootstrap", }, { name: "detect-sandbox", description: "Checks for sandboxing", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "dump-state", }, { name: "finish-update", }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: false }), }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: true }), }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "info", description: "Info about a specific plugin", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "plugin", }, }, { name: "configure", description: "Configure a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "plugin", isOptional: true, }, { name: "config", isOptional: true, }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isVariadic: true, isOptional: true, }, }, { name: ["run", "r", "workflows"], description: "Fig Workflows", options: [ { name: ["-h", "--help"], priority: 20, description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, generateSpec: workflowsSpecGenerator, filterStrategy: "fuzzy", }, { name: ["integrations", "integration"], description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ai", description: "English -> Bash translation", options: [ { name: ["-n", "--n"], description: "Number of completions to generate (must be <=5)", hidden: true, isRepeatable: true, args: { name: "n", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "input", isVariadic: true, isOptional: true, }, }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pro", description: "Fig Pro", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "version", description: "Version", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help-all", description: "Print help for all subcommands", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dashboard", description: "Open the fig dashboard", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch build", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "unix-socket", description: "Debug fig unix sockets", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, ], }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, ], }, { name: "install", description: "Install fig cli components", }, { name: "ssh", description: "Enable/disable fig SSH integration", }, { name: "uninstall", description: "Uninstall fig", hidden: true, }, { name: "update", description: "Update dotfiles", }, { name: "daemon", description: "Run the daemon", hidden: true, }, { name: "diagnostic", description: "Run diagnostic tests", }, { name: "init", description: "Generate the dotfiles for the given shell", }, { name: "source", description: "Sync your latest dotfiles", }, { name: "theme", description: "Get or set theme", }, { name: "invite", description: "Invite friends to Fig", }, { name: "tweet", description: "Tweet about Fig", }, { name: "issue", description: "Create a new Github issue", }, { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, ], }, { name: "team", description: "Manage your fig team", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, ], }, { name: "doctor", description: "Check Fig is properly configured", }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, }, { name: "internal", description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "ibus-bootstrap", }, { name: "detect-sandbox", description: "Checks for sandboxing", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "dump-state", }, { name: "finish-update", }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", }, ], }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, ], }, { name: "man", description: "Open manual page", }, { name: "workflow", description: "Fig Workflows", }, { name: "integrations", description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, ], }, { name: "ai", description: "English -> Bash translation", }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, ], }, { name: "pro", description: "Fig Pro", }, { name: "version", description: "Version", }, { name: "help-all", description: "Print help for all subcommands", }, { name: "dashboard", description: "Open the fig dashboard", }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; const versions: Fig.VersionDiffMap = {}; versions["2.7.5"] = {}; versions["2.8.0"] = { subcommands: [ { name: "debug", subcommands: [ { name: "build", description: "Switch to another branch of a Fig.js app", args: [ { name: "app", suggestions: ["dashboard", "autocomplete"], }, { name: "build", suggestions: ["production", "staging", "develop"], }, ], }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "uninstall", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "list", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "source", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "bundle_identifier", }, { name: "action", suggestions: ["enable", "disable", "select", "deselect"], }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "devtools", args: [ { name: "app", suggestions: ["dashboard", "autocomplete"], }, ], }, { name: "get-index", description: "Displays remote index", options: [ { name: ["-d", "--debug"], description: "Display using debug formatting", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "channel", }, }, { name: "help", subcommands: [ { name: "build", description: "Switch to another branch of a Fig.js app", }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, ], }, { name: "get-index", description: "Displays remote index", }, { name: "unix-socket", remove: true, }, ], }, { name: "unix-socket", remove: true, }, ], }, { name: "ssh", options: [ { name: "--ignore-default-identity", description: "Ignore saved identities", }, { name: "--remove-default-identity", }, { name: "--ignore-saved", remove: true, }, ], }, { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", isRepeatable: true, args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], }, { name: ["internal", "_"], subcommands: [ { name: "attempt-to-finish-input-method-installation", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "swap-files", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "from", template: "filepaths", }, { name: "to", template: "filepaths", }, ], }, { name: "check-ssh", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "brew-uninstall", options: [ { name: "--zap", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "generate-ssh", description: "Generates an SSH configuration file", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "remote_username", }, }, { name: "help", subcommands: [ { name: "attempt-to-finish-input-method-installation", }, { name: "swap-files", }, { name: "check-ssh", hidden: true, }, { name: "brew-uninstall", }, { name: "generate-ssh", description: "Generates an SSH configuration file", }, { name: "ibus-bootstrap", remove: true, }, { name: "detect-sandbox", remove: true, }, ], }, { name: "ibus-bootstrap", remove: true, }, { name: "detect-sandbox", remove: true, }, ], }, { name: ["run", "r"], description: "Fig Scripts", }, { name: ["integrations", "integration"], subcommands: [ { name: "reinstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", subcommands: [ { name: "reinstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, ], }, ], }, { name: "help", subcommands: [ { name: "debug", subcommands: [ { name: "build", description: "Switch to another branch of a Fig.js app", }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, ], }, { name: "get-index", description: "Displays remote index", }, { name: "unix-socket", remove: true, }, ], }, { name: "internal", subcommands: [ { name: "attempt-to-finish-input-method-installation", }, { name: "swap-files", }, { name: "check-ssh", hidden: true, }, { name: "brew-uninstall", }, { name: "generate-ssh", description: "Generates an SSH configuration file", }, { name: "ibus-bootstrap", remove: true, }, { name: "detect-sandbox", remove: true, }, ], }, { name: "run", description: "Fig Scripts", }, { name: "integrations", subcommands: [ { name: "reinstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, ], }, { name: "workflow", remove: true, }, ], }, ], }; export { versions }; export default completion; index.ts000066400000000000000000000006111471722043300430570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/expected-spec/old-specimport { createVersionedSpec } from "@fig/autocomplete-helpers"; const versionFiles = ["1.0.0", "2.0.0"]; export const getVersionCommand: Fig.GetVersionCommand = async (executeCommand) => { const { stdout } = await executeCommand({ command: "fig", args: ["--version"], }); return stdout.slice(stdout.indexOf(" ") + 1); }; export default createVersionedSpec("fig", versionFiles); shared.ts000066400000000000000000000260641471722043300432300ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/expected-spec/old-specconst SETTINGS_PATH = "~/.fig/tools/all-settings.json"; const ACTIONS_PATH = "~/.fig/apps/autocomplete/actions.json"; interface Setting { settingName: string; description: string; type: "boolean" | "text" | "single_select" | "multiselect"; options?: Array; default?: string; } interface Action { identifier: string; name: string; description: string; availability: string; defaultBindings: string[]; } const devCompletionsFolderGenerator: Fig.Generator = { script: '\\ls -d -1 "$PWD/"**/', postProcess: (out) => out.split("\n").map((folder) => { const paths = folder.split("/"); paths.pop(); return { name: paths.pop(), insertValue: folder, icon: `fig://${folder}`, }; }), }; const disableForCommandsGenerator: Fig.Generator = { script: "fig settings autocomplete.disableForCommands", postProcess: (out) => { const existing = out.split("\n").filter((item) => item.length > 0); const append: Fig.Suggestion = { name: "Disable new CLI...", description: `You must pass a valid JSON array of CLI tools contained within single quotes. e.g. '["npm","cd","ls"]'`, icon: "fig://icon?type=box", insertValue: JSON.stringify(existing.concat(["{cursor}"])), }; const enabledAll: Fig.Suggestion = { name: "Enable all commands", icon: "fig://icon?type=box", insertValue: "'[]'", }; return [append, enabledAll].concat( existing.map((disabledCommand) => { return { name: `Enable ${disabledCommand}`, icon: "fig://icon?type=box", insertValue: JSON.stringify( existing.filter((cmd) => cmd != disabledCommand) ), }; }) ); }, }; export const themesGenerator: Fig.Generator = { script: "fig theme --list", postProcess: (output) => { const builtinThemes = [ { name: "system", icon: "💻", priority: 51, }, { name: "light", icon: "fig://template?color=ffffff&badge=☀️", priority: 51, }, { name: "dark", icon: "fig://template?color=000000&badge=🌙", priority: 51, }, ]; return output .split("\n") .map((theme) => ({ name: theme.replace(".json", "") })) .concat(builtinThemes); }, }; export const SETTINGS_GENERATOR: Record = { "autocomplete.devCompletionsFolder": devCompletionsFolderGenerator, "autocomplete.disableForCommands": disableForCommandsGenerator, "autocomplete.theme": themesGenerator, }; export const subsystemsGenerator: Fig.Generator = { script: "\\ls ~/.fig/logs", trigger: (curr, prev) => { // trigger on new token return curr.length === 0 && prev.length > 0; }, postProcess: (out, tokens) => { const insertedLogFiles = new Set(tokens.slice(0, -1)); return out .split("\n") .map((name) => name.replace(".log", "")) .concat("figterm") .map((name) => ({ name, icon: "🪵" })) .filter((suggestion) => !insertedLogFiles.has(suggestion.name)); }, }; export const settingsSpecGenerator: Fig.Subcommand["generateSpec"] = async ( _, executeShellCommand ) => { const text = await executeShellCommand( "fig _ request --method GET --route '/settings/all'" ); const { settings, actions } = JSON.parse(text) as { settings: Setting[]; actions: Action[]; }; const actionSuggestions: Fig.Suggestion[] = actions.map((action) => ({ name: action.identifier.startsWith("autocomplete.") ? action.identifier.slice(13) : action.identifier, description: action.description, icon: "⚡️", })); return { name: "settings", subcommands: settings.map( ({ settingName: name, description, type, options, default: defaultValue, }) => { const suggestions = type === "boolean" ? ["true", "false"] : name.startsWith("autocomplete.keybindings.") ? actionSuggestions : options?.map((option) => ({ name: option["name"] || option, description: option["description"] || "", })); // const insertValue = // type === "multiselect" ? `${name} '{cursor}'` : undefined; const generators = SETTINGS_GENERATOR[name]; return { name, description, icon: "fig://icon?type=commandkey", // insertValue, args: { name: type, default: defaultValue, suggestions: generators ? [] : suggestions, generators, }, }; } ), }; }; interface Plugin { name: string; icon: string; description: string; } export const pluginsGenerator = (init: { installed: boolean; }): Fig.Generator => ({ cache: { strategy: "stale-while-revalidate", }, custom: async (_tokens, executeShellCommand) => { const script = init.installed ? "fig plugins list --format json --installed" : "fig plugins list --format json"; const out = await executeShellCommand(script); const json = JSON.parse(out) as Plugin[]; return json.map((plugin) => ({ name: plugin.name, icon: !plugin.icon?.startsWith("https://") ? plugin.icon : "📦", description: plugin.description, })); }, }); /** * Fig team */ // For insertions like `fig user tokens --team ` export const tokensGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", }, custom: async (tokens, executeShellCommand) => { const teamOptionIndex = tokens.findIndex((value) => value.startsWith("--team") ); if (teamOptionIndex === -1) return []; let teamName: string; if (tokens[teamOptionIndex].includes("=")) { teamName = tokens[teamOptionIndex + 1].split("=")[1]; } else { teamName = tokens[teamOptionIndex + 1]; } const out = JSON.parse( await executeShellCommand( `fig user tokens list --team ${teamName} --format json` ) ) as { createdAt: string; description?: string; expiresAt?: string; lastUsedAt: string; name: string; namespace: { username: string }; }[]; return out.map((token) => { return { name: token.name, description: `Team: ${token.namespace.username}.${ token.description ? " " + token.description : "" }`, }; }); }, }; export const teamsGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", }, script: "fig team --list --format json", postProcess: (out) => { return ( JSON.parse(out) as { id: number; name: string; specs: string[] }[] ).map((team) => ({ name: team.name, priority: 75 })); }, }; // For insertions like `fig teams ` export const membersGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", ttl: 1000 * 60, }, custom: async (tokens, executeShellCommand) => { const teamName = tokens.at(-3); const out = JSON.parse( await executeShellCommand(`fig team --format json ${teamName} members`) ) as { email: string; role: string }[]; return out.map((member) => { return { name: member.email, description: `Role: ${member.role}`, }; }); }, }; // For insertions like `fig teams ` export const invitationsGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", ttl: 1000 * 60, }, custom: async (tokens, executeShellCommand) => { const teamName = tokens.at(-3); const out = JSON.parse( await executeShellCommand( `fig team --format json ${teamName} invitations` ) ) as { email: string; role: string }[]; return out.map((invitation) => { return { name: invitation.email, description: `Role: ${invitation.role}`, }; }); }, }; /** * Fig workflows */ export const workflowsSpecGenerator: Fig.Subcommand["generateSpec"] = async ( _, exec ) => { const response = await exec( "fig _ request --route '/workflows' --method GET" ); const workflows = JSON.parse(response); const subcommands = workflows.map((workflow) => { const displayName = `${workflow.displayName ?? workflow.name} | @${ workflow.namespace }`; const options = workflow.parameters.map((param) => { const option: Fig.Option = { name: `--${param.name}`, description: param.description, }; switch (param.type) { case "text": option.args = { name: param.name, }; case "selector": let generators: Fig.Generator[] = []; if (param.typeData.generators) { generators = param.typeData.generators .filter((generator) => generator.type === "script") .map((generator) => ({ script: generator.script, splitOn: "\n", })); } option.args = { name: param.name, suggestions: param.typeData.suggestions, generators, }; } return option; }); // Add @namespace/name and name (if this workflow is associated with user's namespace) const name = [`@${workflow.namespace}/${workflow.name}`]; if (workflow.isOwnedByUser) { name.push(workflow.name); } return { displayName, icon: workflow.icon ?? "⚡️", name, insertValue: workflow.isOwnedByUser ? workflow.name : name[0], description: workflow.description, options, }; }); return { name: "run", subcommands, filterStrategy: "fuzzy", }; }; export const sshHostsGenerator: Fig.Generator = { script: "fig _ request --method GET --route /access/hosts/all", cache: { strategy: "stale-while-revalidate", }, postProcess: (out) => { return ( JSON.parse(out) as { nickName: string; namespace: string; description: string; }[] ).map((host) => ({ insertValue: `@${host.namespace}/${host.nickName}`, displayName: `${host.nickName} (@${host.namespace})`, name: `@${host.namespace}/${host.nickName}`, description: host.description, })); }, }; export const sshIdentityGenerator: Fig.Generator = { custom: async (tokens, executeShellCommand) => { const host = tokens.slice(2).find((value) => !value.startsWith("-")); if (host === undefined) { return []; } const hosts = JSON.parse( await executeShellCommand(`fig ssh ${host} --get-identities`) ) as { displayName: string; username: string }[]; return hosts.map((host) => ({ name: host.displayName, })); }, }; export const userGenerator: Fig.Generator = { script: "fig user list-accounts", postProcess: (out) => { if (out.startsWith("error: ")) { return []; } return out .trim() .split("\n") .map((name) => ({ name, icon: "👤" })); }, }; export default {}; new-spec.ts000066400000000000000000003427071471722043300372510ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4const completion: Fig.Spec = { name: "fig_cli", description: "Top level cli commands", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal pseudo-terminal path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--app-bundle", description: "Remove executable and user data", }, { name: "--input-method", description: "Remove input method", }, { name: "--daemon", description: "Remove Fig daemon", }, { name: "--dotfiles", description: "Remove dotfile shell integration", }, { name: "--ssh", description: "Remove SSH integration", }, { name: "--no-open", description: "Do not open the uninstallation page", }, { name: "--only-open", description: "Only open the uninstallation page", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session_id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ] }, { name: "hide", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ] }, { name: "integration-ready", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app_identifier", }, { name: "focused_session_id", }, ] }, { name: "pre-exec", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ] }, { name: "prompt", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ] }, { name: "ssh", options: [ { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control_path", }, { name: "remote_dest", }, ] }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dotfiles", description: "Debug dotfiles", options: [ { name: "--disable", description: "Disable debug mode", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch to another branch of a Fig.js app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app", suggestions: [ "dashboard", "autocomplete", ], }, { name: "build", suggestions: [ "production", "staging", "develop", ], }, ] }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: [ "on", "off", ], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--level", isRepeatable: true, args: { name: "level", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isVariadic: true, isOptional: true, }, }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "uninstall", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "list", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "source", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "bundle_identifier", }, { name: "action", suggestions: [ "enable", "disable", "select", "deselect", ], }, ] }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "accessibility", description: "Accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: [ "refresh", "reset", "prompt", "open", "status", ], }, }, { name: "key-tester", description: "Key Tester", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostics", description: "Watches diagnostics", options: [ { name: "--rate", isRepeatable: true, args: { name: "rate", isOptional: true, }, }, { name: "--watch", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", options: [ { name: ["-c", "--channel"], isRepeatable: true, args: { name: "channel", }, }, { name: ["-k", "--kind"], isRepeatable: true, args: { name: "kind", }, }, { name: ["-v", "--variant"], isRepeatable: true, args: { name: "variant", }, }, { name: ["-e", "--version"], isRepeatable: true, args: { name: "version", }, }, { name: ["-a", "--architecture"], isRepeatable: true, args: { name: "architecture", }, }, { name: ["-t", "--override-threshold"], isRepeatable: true, args: { name: "override_threshold", isOptional: true, }, }, { name: ["-r", "--enable-rollout"], }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "devtools", description: "Open up the devtools of a specific webview", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "app", suggestions: [ "dashboard", "autocomplete", ], }, }, { name: "get-index", description: "Displays remote index", options: [ { name: ["-d", "--debug"], description: "Display using debug formatting", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "channel", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch to another branch of a Fig.js app", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, ], }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, { name: "get-index", description: "Displays remote index", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ] }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", options: [ { name: ["-a", "--auth"], description: "Identity to connect with", isRepeatable: true, args: { name: "auth", isOptional: true, }, }, { name: "--get-identities", }, { name: "--ignore-default-identity", description: "Ignore saved identities", }, { name: "--remove-default-identity", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "host", isOptional: true, }, }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-y", "--no-confirm"], description: "Force uninstall", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: "--no-confirm", description: "(deprecated) Use --non-interactive instead", }, { name: ["-y", "--non-interactive"], description: "Don't prompt for confirmation", }, { name: "--relaunch-dashboard", description: "Relaunch into dashboard after update (false will launch in background)", }, { name: "--rollout", description: "Uses rollout", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["diagnostic", "diagnostics"], description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: "--rcfile", isRepeatable: true, args: { name: "rcfile", isOptional: true, }, }, { name: "--skip-dotfiles", description: "Whether to skip loading dotfiles", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: [ "pre", "post", ], }, ] }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: "--list", exclusiveOn: [ "--folder", ], }, { name: "--folder", exclusiveOn: [ "--list", ], }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isVariadic: true, isOptional: true, }, }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: "Add a \"not now\" option to the choicer", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: "Add a \"not now\" option to the choicer", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", description: "The expiration date of the token in RFC3339 format", exclusiveOn: [ "--expires-in", ], isRepeatable: true, args: { name: "expires_date", isOptional: true, }, }, { name: "--expires-in", description: "The time till the token expires (e.g. \"90d\")", exclusiveOn: [ "--expires-date", ], isRepeatable: true, args: { name: "expires_in", isOptional: true, }, }, { name: ["-t", "--team"], description: "The team namespace to create the token for", isRepeatable: true, args: { name: "team", }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", }, }, { name: "list", options: [ { name: ["-t", "--team"], description: "The team namespace to list the tokens for", isRepeatable: true, args: { name: "team", }, }, { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], description: "The team namespace to revoke the token for", isRepeatable: true, args: { name: "team", }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", }, }, { name: "validate", description: "Validate a token is valid", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "token", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "whoami", description: "Prints details about the current user", options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-e", "--only-email"], description: "Only print the user's email address, this is quicker since it doesn't require a network request", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "plan", description: "Prints details about the user's plan", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "switch", description: "Switch to a switchable account", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "team", description: "Manage your fig team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", isRepeatable: true, args: { name: "role", isOptional: true, suggestions: [ "owner", "admin", "member", ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--list", exclusiveOn: [ "--new", "--delete", ], }, { name: "--new", exclusiveOn: [ "--list", "--delete", ], }, { name: "--delete", exclusiveOn: [ "--list", "--new", ], }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "team", isOptional: true, }, }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell completions", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ] }, { name: "callback", description: "Callback used for the internal pseudoterminal", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler_id", }, { name: "filename", isOptional: true, }, { name: "exit_code", isOptional: true, }, ] }, { name: "install", description: "Install fig cli", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--input-method", description: "Uninstall only the input method", }, { name: "--binary", description: "Uninstall only the binary", }, { name: "--ssh", description: "Uninstall only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hostname", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "should-figterm-launch", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "event", options: [ { name: "--name", description: "Name of the event", isRepeatable: true, args: { name: "name", }, }, { name: "--payload", description: "Payload of the event as a JSON string", isRepeatable: true, args: { name: "payload", isOptional: true, }, }, { name: "--apps", description: "Apps to send the event to", isRepeatable: true, args: { name: "apps", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "auth-token", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "request", options: [ { name: "--route", isRepeatable: true, args: { name: "route", }, }, { name: "--method", isRepeatable: true, args: { name: "method", isOptional: true, suggestions: [ "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ], }, }, { name: "--body", isRepeatable: true, args: { name: "body", isOptional: true, }, }, { name: "--namespace", isRepeatable: true, args: { name: "namespace", isOptional: true, }, }, { name: "--release", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sockets-dir", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "stream-from-socket", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "figterm-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "session_id", }, }, { name: "ipc", options: [ { name: "--figterm", isRepeatable: true, args: { name: "figterm", isOptional: true, }, }, { name: "--json", isRepeatable: true, args: { name: "json", }, }, { name: "--app", }, { name: "--daemon", }, { name: "--recv", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall-for-all-users", description: "Linux only", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uuidgen", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open-uninstall-page", options: [ { name: "--verbose", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "remote_dest", }, }, { name: "attempt-to-finish-input-method-installation", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "bundle_path", isOptional: true, template: "filepaths", }, }, { name: "dump-state", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "component", suggestions: [ "figterm", ], }, }, { name: "finish-update", options: [ { name: "--relaunch-dashboard", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "swap-files", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "from", template: "filepaths", }, { name: "to", template: "filepaths", }, ] }, { name: "check-ssh", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "remote_username", }, }, { name: "brew-uninstall", options: [ { name: "--zap", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "generate-ssh", description: "Generates an SSH configuration file", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "remote_username", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "attempt-to-finish-input-method-installation", }, { name: "dump-state", }, { name: "finish-update", }, { name: "swap-files", }, { name: "check-ssh", hidden: true, }, { name: "brew-uninstall", }, { name: "generate-ssh", description: "Generates an SSH configuration file", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "info", description: "Info about a specific plugin", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "plugin", }, }, { name: "configure", description: "Configure a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "plugin", isOptional: true, }, { name: "config", isOptional: true, }, ] }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isVariadic: true, isOptional: true, }, }, { name: ["run", "r"], description: "Fig Scripts", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: ["integrations", "integration"], description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reinstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "reinstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ai", description: "English -> Bash translation", options: [ { name: ["-n", "--n"], description: "Number of completions to generate (must be <=5)", hidden: true, isRepeatable: true, args: { name: "n", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "input", isVariadic: true, isOptional: true, }, }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pro", description: "Fig Pro", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "version", description: "Version", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help-all", description: "Print help for all subcommands", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dashboard", description: "Open the fig dashboard", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch to another branch of a Fig.js app", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "input-method", description: "Fig input method editor", subcommands: [ { name: "install", }, { name: "uninstall", }, { name: "list", }, { name: "status", }, { name: "source", }, ], }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, { name: "get-index", description: "Displays remote index", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, ], }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, ], }, { name: "install", description: "Install fig cli components", }, { name: "ssh", description: "Enable/disable fig SSH integration", }, { name: "uninstall", description: "Uninstall fig", hidden: true, }, { name: "update", description: "Update dotfiles", }, { name: "daemon", description: "Run the daemon", hidden: true, }, { name: "diagnostic", description: "Run diagnostic tests", }, { name: "init", description: "Generate the dotfiles for the given shell", }, { name: "source", description: "Sync your latest dotfiles", }, { name: "theme", description: "Get or set theme", }, { name: "invite", description: "Invite friends to Fig", }, { name: "tweet", description: "Tweet about Fig", }, { name: "issue", description: "Create a new Github issue", }, { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, ], }, { name: "team", description: "Manage your fig team", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, ], }, { name: "doctor", description: "Check Fig is properly configured", }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, }, { name: "internal", description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "attempt-to-finish-input-method-installation", }, { name: "dump-state", }, { name: "finish-update", }, { name: "swap-files", }, { name: "check-ssh", hidden: true, }, { name: "brew-uninstall", }, { name: "generate-ssh", description: "Generates an SSH configuration file", }, ], }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, ], }, { name: "man", description: "Open manual page", }, { name: "run", description: "Fig Scripts", }, { name: "integrations", description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "reinstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, ], }, { name: "ai", description: "English -> Bash translation", }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, ], }, { name: "pro", description: "Fig Pro", }, { name: "version", description: "Version", }, { name: "help-all", description: "Print help for all subcommands", }, { name: "dashboard", description: "Open the fig dashboard", }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; export default completion; old-spec/000077500000000000000000000000001471722043300366515ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-41.0.0.ts000066400000000000000000003070741471722043300376700ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/old-specimport { settingsSpecGenerator, subsystemsGenerator, themesGenerator, pluginsGenerator, tokensGenerators, invitationsGenerators, membersGenerators, teamsGenerators, workflowsSpecGenerator, sshHostsGenerator, sshIdentityGenerator, userGenerator, } from "./shared"; const completion: Fig.Subcommand = { name: "fig", description: "The CLI for Fig", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal psudo-terminal path", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session-id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ], }, { name: "event", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "event-name", }, }, { name: "hide", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "integration-ready", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app-identifier", }, { name: "focused-session-id", }, ], }, { name: "pre-exec", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "prompt", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "ssh", options: [ { name: "--version", description: "Print version information", }, { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control-path", }, { name: "remote-dest", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch build", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "build", suggestions: ["dev", "prod", "staging"], }, }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isOptional: true, generators: subsystemsGenerator, }, }, { name: "ime", description: "Fig input method editor", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", suggestions: [ "install", "uninstall", "select", "deselect", "enable", "disable", "status", "register", ], }, }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "unix-socket", description: "Debug fig unix sockets", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "shell-integrations", description: "Toggle shell integrations", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: ["refresh", "reset", "prompt", "open", "status"], }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", filterStrategy: "fuzzy", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-d", "--delete"], description: "Delete", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], generateSpec: settingsSpecGenerator, }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: ["-y", "--no-confirm"], description: "Force update", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: ["pre", "post"], }, ], hidden: true, }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, generators: themesGenerator, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], icon: "fig://icon?type=twitter", }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isOptional: true, }, icon: "fig://icon?type=github", }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Manually refresh the auth token", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Details about the current user", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell compleations", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: "--version", description: "Print version information", }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "callback", description: "Callback used for the internal psudoterminal", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler-id", }, { name: "filename", isOptional: true, }, { name: "exit-code", isOptional: true, }, ], }, { name: "install", description: "Install fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--binary", description: "Uninstall only the binary", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "warn-user-when-uninstalling-incorrectly", description: "Notify the user that they are uninstalling incorrectly", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "animation", options: [ { name: ["-f", "--filename"], args: { name: "filename", isOptional: true, }, }, { name: ["-r", "--rate"], args: { name: "rate", isOptional: true, }, }, { name: ["-b", "--before-text"], args: { name: "before-text", isOptional: true, }, }, { name: ["-a", "--after-text"], args: { name: "after-text", isOptional: true, }, }, { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "alpha", description: "(LEGACY) Old way to launch mission control", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: false }), }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: true }), }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: ["-f", "--format"], description: "The output format", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; const versions: Fig.VersionDiffMap = {}; versions["1.3.0"] = {}; versions["1.3.1"] = { subcommands: [ { name: "debug", subcommands: [ { name: "shell-integrations", remove: true, }, ], }, { name: "settings", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", subcommands: [ { name: "enable", description: "Enable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "init", options: [ { name: "--rcfile", args: { name: "rcfile", isOptional: true, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "local-state", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "uninstall", options: [ { name: "--ssh", description: "Uninstall only the ssh integration", }, ], }, ], }, { name: "plugins", subcommands: [ { name: "list", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isOptional: true, }, }, ], }; versions["1.4.0"] = { subcommands: [ { name: "app", subcommands: [ { name: "uninstall", options: [ { name: "--user-data", description: "Remove configuration and data files", }, { name: "--app-bundle", description: "Remove executable and", }, { name: "--input-method", description: "Remove input method", }, { name: "--terminal-integrations", description: "Remove terminal integrations (i.e. VSCode, iTerm2, etc.)", }, { name: "--daemon", description: "Remove Fig daemon", }, { name: "--dotfiles", description: "Remove dotfile shell integration", }, { name: "--ssh", description: "Remove SSH integration", }, { name: "--no-open", description: "Do not open the uninstallation page", }, ], }, ], }, { name: "debug", subcommands: [ { name: "dotfiles", description: "Debug dotfiles", options: [ { name: "--version", description: "Print version information", }, { name: "--disable", description: "Disable debug mode", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, { name: "user", subcommands: [ { name: "login", description: "Login to Fig", options: [ { name: "--version", description: "Print version information", }, { name: ["-r", "--refresh"], description: "Manually refresh the auth token", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "logout", description: "Logout of Fig", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "whoami", options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-e", "--only-email"], description: "Only print the user's email address, this is quicker since it doesn't require a network request", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", description: "The expiration date of the token in RFC3339 format", exclusiveOn: ["--expires-in"], args: { name: "expires-date", isOptional: true, }, }, { name: "--expires-in", description: 'The time till the token expires (e.g. "90d")', exclusiveOn: ["--expires-date"], args: { name: "expires-in", isOptional: true, }, }, { name: ["-t", "--team"], description: "The team namespace to create the token for", args: { name: "team", generators: teamsGenerators, }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], args: { name: "name", }, }, { name: "list", options: [ { name: ["-t", "--team"], description: "The team namespace to list the tokens for", exclusiveOn: ["-p", "--personal"], args: { name: "team", generators: teamsGenerators, }, }, { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, { name: ["-p", "--personal"], description: "Only list tokens owned by the current user", exclusiveOn: ["-t", "--team"], }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], description: "The team namespace to revoke the token for", args: { name: "team", generators: teamsGenerators, }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], args: { name: "name", generators: tokensGenerators, }, }, ], options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], }, { name: "team", args: { name: "team", generators: teamsGenerators, isOptional: true, loadSpec: { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: membersGenerators, }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: invitationsGenerators, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], }, }, options: [ { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--list", exclusiveOn: ["--new", "--delete"], }, { name: "--new", exclusiveOn: ["--list", "--delete"], }, { name: "--delete", exclusiveOn: ["--list", "--new"], }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["internal", "_"], subcommands: [ { name: "hostname", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, ], }; versions["1.4.1"] = { subcommands: [ { name: "app", subcommands: [ { name: "install", options: [ { name: "--version", remove: true, }, ], }, { name: "onboarding", options: [ { name: "--version", remove: true, }, ], }, { name: "running", options: [ { name: "--version", remove: true, }, ], }, { name: "launch", options: [ { name: "--version", remove: true, }, ], }, { name: "restart", options: [ { name: "--version", remove: true, }, ], }, { name: "quit", options: [ { name: "--version", remove: true, }, ], }, { name: "set-path", options: [ { name: "--version", remove: true, }, ], }, { name: "uninstall", options: [ { name: "--user-data", isRepeatable: true, }, { name: "--app-bundle", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--terminal-integrations", isRepeatable: true, }, { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--no-open", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "prompts", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "hook", subcommands: [ { name: "editbuffer", options: [ { name: "--version", remove: true, }, ], }, { name: "hide", options: [ { name: "--version", remove: true, }, ], }, { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "integration-ready", options: [ { name: "--version", remove: true, }, ], }, { name: "keyboard-focus-changed", options: [ { name: "--version", remove: true, }, ], }, { name: "pre-exec", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt", options: [ { name: "--version", remove: true, }, ], }, { name: "ssh", options: [ { name: "--prompt", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "event", remove: true, }, ], }, { name: "debug", subcommands: [ { name: "app", options: [ { name: "--version", remove: true, }, ], }, { name: "dotfiles", options: [ { name: "--disable", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "build", options: [ { name: "--version", remove: true, }, ], }, { name: "autocomplete-window", options: [ { name: "--version", remove: true, }, ], }, { name: "logs", options: [ { name: "--version", remove: true, }, ], args: { isVariadic: true, }, }, { name: "ime", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt-accessibility", options: [ { name: "--version", remove: true, }, ], }, { name: "sample", options: [ { name: "--version", remove: true, }, ], }, { name: "unix-socket", options: [ { name: "--version", remove: true, }, ], }, { name: "verify-codesign", options: [ { name: "--version", remove: true, }, ], }, { name: "accessibility", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "settings", subcommands: [ { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "docs", options: [ { name: "--version", remove: true, }, ], }, { name: "open", options: [ { name: "--version", remove: true, }, ], }, { name: "sync", options: [ { name: "--version", remove: true, }, ], }, { name: "all", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-r", "--remote"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-d", "--delete"], isRepeatable: true, }, ], }, { name: "tips", subcommands: [ { name: "enable", options: [ { name: "--version", remove: true, }, ], }, { name: "disable", options: [ { name: "--version", remove: true, }, ], }, { name: "reset", options: [ { name: "--version", remove: true, }, ], }, { name: "prompt", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "install", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--no-confirm", isRepeatable: true, }, { name: "--force", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, ], }, { name: "ssh", subcommands: [ { name: "enable", options: [ { name: "--version", remove: true, }, ], }, { name: "disable", options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "update", options: [ { name: ["-y", "--no-confirm"], isRepeatable: true, }, ], }, { name: "diagnostic", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--force", isRepeatable: true, }, ], }, { name: "init", options: [ { name: "--rcfile", isRepeatable: true, }, ], }, { name: "theme", options: [ { name: "--list", exclusiveOn: ["--folder"], isRepeatable: true, }, { name: "--folder", exclusiveOn: ["--list"], isRepeatable: true, }, ], }, { name: "issue", options: [ { name: ["-f", "--force"], isRepeatable: true, }, ], args: { isVariadic: true, }, }, { name: "login", options: [ { name: ["-r", "--refresh"], isRepeatable: true, }, { name: "--hard-refresh", description: "Manually refresh the auth token", isRepeatable: true, }, ], }, { name: "user", subcommands: [ { name: "login", options: [ { name: ["-r", "--refresh"], isRepeatable: true, }, { name: "--hard-refresh", description: "Manually refresh the auth token", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "logout", options: [ { name: "--version", remove: true, }, ], }, { name: "whoami", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-e", "--only-email"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", isRepeatable: true, }, { name: "--expires-in", isRepeatable: true, }, { name: ["-t", "--team"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "list", options: [ { name: ["-t", "--team"], isRepeatable: true, }, { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-p", "--personal"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "validate", description: "Validate a token is valid", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "token", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: "--version", remove: true, }, ], }, ], }, { name: "team", subcommands: [ { name: "members", options: [ { name: "--version", remove: true, }, ], }, { name: "remove", options: [ { name: "--version", remove: true, }, ], }, { name: "add", options: [ { name: "--role", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "invitations", options: [ { name: "--version", remove: true, }, ], }, { name: "revoke", options: [ { name: "--version", remove: true, }, ], }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--list", isRepeatable: true, }, { name: "--new", isRepeatable: true, }, { name: "--delete", isRepeatable: true, }, ], }, { name: "doctor", options: [ { name: "--verbose", isRepeatable: true, }, { name: "--strict", isRepeatable: true, }, ], }, { name: "completion", args: { suggestions: [ { name: "bash", description: "Bash shell completions", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], subcommands: [ { name: "prompt-dotfiles-changed", options: [ { name: "--version", remove: true, }, ], }, { name: "local-state", subcommands: [ { name: "init", options: [ { name: "--version", remove: true, }, ], }, { name: "open", options: [ { name: "--version", remove: true, }, ], }, { name: "all", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-d", "--delete"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "callback", options: [ { name: "--version", remove: true, }, ], }, { name: "install", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--input-method", isRepeatable: true, }, { name: "--no-confirm", isRepeatable: true, }, { name: "--force", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "install-ibus", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "fig-ibus-engine-location", }, }, { name: "uninstall", options: [ { name: "--daemon", isRepeatable: true, }, { name: "--dotfiles", isRepeatable: true, }, { name: "--binary", isRepeatable: true, }, { name: "--ssh", isRepeatable: true, }, { name: "--version", remove: true, }, ], }, { name: "get-shell", options: [ { name: "--version", remove: true, }, ], }, { name: "hostname", options: [ { name: "--version", remove: true, }, ], }, { name: "should-figterm-launch", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "event", options: [ { name: "--name", description: "Name of the event", isRepeatable: true, args: { name: "name", }, }, { name: "--payload", description: "Payload of the event as a JSON string", isRepeatable: true, args: { name: "payload", isOptional: true, }, }, { name: "--apps", description: "Apps to send the event to", isRepeatable: true, args: { name: "apps", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "auth-token", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "request", options: [ { name: "--route", isRepeatable: true, args: { name: "route", }, }, { name: "--method", isRepeatable: true, args: { name: "method", }, }, { name: "--body", isRepeatable: true, args: { name: "body", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "warn-user-when-uninstalling-incorrectly", remove: true, }, { name: "animation", remove: true, }, ], }, { name: "plugins", subcommands: [ { name: "sync", options: [ { name: "--version", remove: true, }, ], }, { name: "update", options: [ { name: "--version", remove: true, }, ], }, { name: "add", options: [ { name: "--version", remove: true, }, ], }, { name: "remove", options: [ { name: "--version", remove: true, }, ], }, { name: "list", options: [ { name: ["-f", "--format"], isRepeatable: true, }, { name: ["-i", "--installed"], isRepeatable: true, }, { name: "--version", remove: true, }, ], }, ], }, { name: "man", args: { isVariadic: true, }, }, { name: ["run", "r", "workflow", "workflows", "flow", "flows"], description: "Search for and execute workflows", filterStrategy: "fuzzy", options: [ { name: ["-h", "--help"], priority: 20, description: "Print help information", }, ], generateSpec: workflowsSpecGenerator, }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, ], }; versions["1.4.3"] = { subcommands: [ { name: "ssh", subcommands: [ { name: "enable", remove: true }, { name: "disable", remove: true }, { name: "help", remove: true }, ], options: [ { name: ["-a", "--auth"], description: "Identity to connect with", args: { name: "auth", generators: sshIdentityGenerator, }, }, ], args: { name: "host", filterStrategy: "fuzzy", generators: sshHostsGenerator, }, }, { name: "login", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, ], }, { name: "user", subcommands: [ { name: "login", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, ], }, { name: "tokens", subcommands: [ { name: "list", options: [ { name: ["-p", "--personal"], remove: true, }, ], }, ], }, ], }, { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: "--version", remove: true, }, ], args: { name: "email", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "request", options: [ { name: "--method", args: { isOptional: true, suggestions: [ "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ], }, }, ], }, { name: "ipc", options: [ { name: "--figterm", isRepeatable: true, args: { name: "figterm", isOptional: true, }, }, { name: "--json", isRepeatable: true, args: { name: "json", }, }, { name: "--app", }, { name: "--daemon", }, { name: "--recv", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }, { name: "onboarding", hidden: true, }, { name: "plugins", subcommands: [ { name: "list", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, ], }, { name: "info", description: "Info about a specific plugin", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "configure", description: "Configure a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "plugin", isOptional: true, }, { name: "config", isOptional: true, }, ], }, ], }, { name: [ "workflow", "run", "r", "workflows", "snippet", "snippets", "flow", "flows", ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: "integrations", description: "Managed system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "alpha", remove: true, }, ], }; versions["1.4.7"] = { subcommands: [ { name: "ssh", options: [ { name: "--get-identities", }, ], }, { name: ["internal", "_"], subcommands: [ { name: "request", options: [ { name: "--namespace", isRepeatable: true, args: { name: "namespace", isOptional: true, }, }, ], }, ], }, { name: "integrations", description: "Manage system integrations", }, ], }; versions["1.4.10"] = { subcommands: [ { name: "ssh", options: [ { name: ["-a", "--auth"], args: { isOptional: true, }, }, ], }, { name: "login", options: [ { name: "--switchable", hidden: true, }, ], args: { name: "email", isOptional: true, }, }, { name: "user", subcommands: [ { name: "login", options: [ { name: "--switchable", hidden: true, }, ], args: { name: "email", isOptional: true, }, }, { name: "tokens", description: "Subcommand for dealing with tokens", }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "switch", description: "Switch to a switchable account", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: userGenerator, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "fig-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "figterm-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "session-id", }, }, ], }, { name: "ai", description: "English -> Bash translation", options: [ { name: ["-n", "--n"], description: "Number of completions to generate (must be <=5)", hidden: true, args: { name: "n", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "input", isVariadic: true, isOptional: true, }, }, { name: "pro", description: "Fig Pro", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, ], }; export { versions }; export default completion; 2.0.0.ts000066400000000000000000003225341471722043300376670ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/old-specimport { settingsSpecGenerator, subsystemsGenerator, themesGenerator, pluginsGenerator, tokensGenerators, invitationsGenerators, membersGenerators, teamsGenerators, workflowsSpecGenerator, sshHostsGenerator, sshIdentityGenerator, userGenerator, } from "./shared"; const completion: Fig.Subcommand = { name: "fig", description: "Top level cli commands", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal pseudo-terminal path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--app-bundle", description: "Remove executable and user data", }, { name: "--input-method", description: "Remove input method", }, { name: "--daemon", description: "Remove Fig daemon", }, { name: "--dotfiles", description: "Remove dotfile shell integration", }, { name: "--ssh", description: "Remove SSH integration", }, { name: "--no-open", description: "Do not open the uninstallation page", }, { name: "--only-open", description: "Only open the uninstallation page", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session_id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ], }, { name: "hide", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "integration-ready", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app_identifier", }, { name: "focused_session_id", }, ], }, { name: "pre-exec", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "prompt", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "ssh", options: [ { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control_path", }, { name: "remote_dest", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dotfiles", description: "Debug dotfiles", options: [ { name: "--disable", description: "Disable debug mode", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch build", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "build", suggestions: ["dev", "prod", "staging"], }, }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--level", isRepeatable: true, args: { name: "level", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isVariadic: true, isOptional: true, generators: subsystemsGenerator, }, }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "unix-socket", description: "Debug fig unix sockets", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "accessibility", description: "Accessibility", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: ["refresh", "reset", "prompt", "open", "status"], }, }, { name: "key-tester", description: "Key Tester", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostics", description: "Watches diagnostics", options: [ { name: "--rate", isRepeatable: true, args: { name: "rate", isOptional: true, }, }, { name: "--watch", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", options: [ { name: ["-c", "--channel"], isRepeatable: true, args: { name: "channel", }, }, { name: ["-k", "--kind"], isRepeatable: true, args: { name: "kind", }, }, { name: ["-v", "--variant"], isRepeatable: true, args: { name: "variant", }, }, { name: ["-e", "--version"], isRepeatable: true, args: { name: "version", }, }, { name: ["-a", "--architecture"], isRepeatable: true, args: { name: "architecture", }, }, { name: ["-t", "--override-threshold"], isRepeatable: true, args: { name: "override_threshold", isOptional: true, }, }, { name: ["-r", "--enable-rollout"], }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "devtools", description: "Open up the devtools of a specific webview", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "window", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch build", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "unix-socket", description: "Debug fig unix sockets", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], generateSpec: settingsSpecGenerator, }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", options: [ { name: ["-a", "--auth"], description: "Identity to connect with", isRepeatable: true, args: { name: "auth", isOptional: true, generators: sshIdentityGenerator, }, }, { name: "--get-identities", }, { name: "--ignore-saved", description: "Ignore saved identities", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "host", isOptional: true, generators: sshHostsGenerator, }, }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-y", "--no-confirm"], description: "Force uninstall", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: "--no-confirm", description: "(deprecated) Use --non-interactive instead", }, { name: ["-y", "--non-interactive"], description: "Don't prompt for confirmation", }, { name: "--relaunch-dashboard", description: "Relaunch into dashboard after update (false will launch in background)", }, { name: "--rollout", description: "Uses rollout", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["diagnostic", "diagnostics"], description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: "--rcfile", isRepeatable: true, args: { name: "rcfile", isOptional: true, }, }, { name: "--skip-dotfiles", description: "Whether to skip loading dotfiles", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: ["pre", "post"], }, ], }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: "--list", exclusiveOn: ["--folder"], }, { name: "--folder", exclusiveOn: ["--list"], }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, generators: themesGenerator, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isVariadic: true, isOptional: true, }, }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: 'Add a "not now" option to the choicer', }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Refresh the auth token if expired", }, { name: "--hard-refresh", description: "Force a refresh of the auth token", }, { name: "--switchable", }, { name: "--not-now", description: 'Add a "not now" option to the choicer', }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", isOptional: true, }, }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", options: [ { name: "--expires-date", description: "The expiration date of the token in RFC3339 format", exclusiveOn: ["--expires-in"], isRepeatable: true, args: { name: "expires_date", isOptional: true, }, }, { name: "--expires-in", description: 'The time till the token expires (e.g. "90d")', exclusiveOn: ["--expires-date"], isRepeatable: true, args: { name: "expires_in", isOptional: true, }, }, { name: ["-t", "--team"], description: "The team namespace to create the token for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", }, }, { name: "list", options: [ { name: ["-t", "--team"], description: "The team namespace to list the tokens for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "revoke", options: [ { name: ["-t", "--team"], description: "The team namespace to revoke the token for", isRepeatable: true, args: { name: "team", generators: teamsGenerators, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "name", generators: tokensGenerators, }, }, { name: "validate", description: "Validate a token is valid", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "token", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "whoami", description: "Prints details about the current user", options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-e", "--only-email"], description: "Only print the user's email address, this is quicker since it doesn't require a network request", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "plan", description: "Prints details about the user's plan", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, options: [ { name: ["-f", "--format"], description: "Output format to use", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "switch", description: "Switch to a switchable account", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: userGenerator, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "team", description: "Manage your fig team", args: { name: "team", generators: teamsGenerators, isOptional: true, loadSpec: { name: "team", subcommands: [ { name: "members", description: "List all members on a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "remove", description: "Remove a member from a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: membersGenerators, }, }, { name: "add", description: "Invite a member to a team", options: [ { name: "--role", isRepeatable: true, args: { name: "role", isOptional: true, suggestions: ["owner", "admin", "member"], }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", }, }, { name: "invitations", description: "List pending invitations to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "revoke", description: "Revoke an invitation to a team", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "email", generators: invitationsGenerators, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], }, }, options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--list", exclusiveOn: ["--new", "--delete"], }, { name: "--new", exclusiveOn: ["--list", "--delete"], }, { name: "--delete", exclusiveOn: ["--list", "--new"], }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell completions", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler_id", }, { name: "filename", isOptional: true, }, { name: "exit_code", isOptional: true, }, ], }, { name: "install", description: "Install fig cli", options: [ { name: "--daemon", description: "Install only the daemon", }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--input-method", description: "Prompt input method installation", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: "--ssh", description: "Install only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--input-method", description: "Uninstall only the input method", }, { name: "--binary", description: "Uninstall only the binary", }, { name: "--ssh", description: "Uninstall only the ssh integration", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hostname", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "should-figterm-launch", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "event", options: [ { name: "--name", description: "Name of the event", isRepeatable: true, args: { name: "name", }, }, { name: "--payload", description: "Payload of the event as a JSON string", isRepeatable: true, args: { name: "payload", isOptional: true, }, }, { name: "--apps", description: "Apps to send the event to", isRepeatable: true, args: { name: "apps", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "auth-token", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "request", options: [ { name: "--route", isRepeatable: true, args: { name: "route", }, }, { name: "--method", isRepeatable: true, args: { name: "method", isOptional: true, suggestions: [ "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ], }, }, { name: "--body", isRepeatable: true, args: { name: "body", isOptional: true, }, }, { name: "--namespace", isRepeatable: true, args: { name: "namespace", isOptional: true, }, }, { name: "--release", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sockets-dir", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "stream-from-socket", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "figterm-socket-path", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "session_id", }, }, { name: "ipc", options: [ { name: "--figterm", isRepeatable: true, args: { name: "figterm", isOptional: true, }, }, { name: "--json", isRepeatable: true, args: { name: "json", }, }, { name: "--app", }, { name: "--daemon", }, { name: "--recv", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall-for-all-users", description: "Linux only", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uuidgen", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ibus-bootstrap", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "detect-sandbox", description: "Checks for sandboxing", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open-uninstall-page", options: [ { name: "--verbose", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "remote_dest", }, }, { name: "dump-state", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "component", suggestions: ["figterm"], }, }, { name: "finish-update", options: [ { name: "--relaunch-dashboard", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "remote_username", }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "ibus-bootstrap", }, { name: "detect-sandbox", description: "Checks for sandboxing", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "dump-state", }, { name: "finish-update", }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: false }), }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", generators: pluginsGenerator({ installed: true }), }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], }, { name: "info", description: "Info about a specific plugin", options: [ { name: "--fields", description: "Fields to include in the output", isRepeatable: true, args: { name: "fields", isOptional: true, }, }, { name: ["-f", "--format"], description: "The output format", isRepeatable: true, args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "plugin", }, }, { name: "configure", description: "Configure a specific plugin", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "plugin", isOptional: true, }, { name: "config", isOptional: true, }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isVariadic: true, isOptional: true, }, }, { name: ["run", "r", "workflows"], description: "Fig Workflows", options: [ { name: ["-h", "--help"], priority: 20, description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, generateSpec: workflowsSpecGenerator, filterStrategy: "fuzzy", }, { name: ["integrations", "integration"], description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-s", "--silent"], description: "Suppress status messages", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information (use `--help` for more detail)", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, }, { name: "daemon", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ssh", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "input-method", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "vscode", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: ["intellij", "jetbrains"], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "all", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "ai", description: "English -> Bash translation", options: [ { name: ["-n", "--n"], description: "Number of completions to generate (must be <=5)", hidden: true, isRepeatable: true, args: { name: "n", isOptional: true, }, }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "input", isVariadic: true, isOptional: true, }, }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "status", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "pro", description: "Fig Pro", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "version", description: "Version", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help-all", description: "Print help for all subcommands", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "dashboard", description: "Open the fig dashboard", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "args", isVariadic: true, isOptional: true, }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", }, { name: "onboarding", description: "Run the Fig tutorial again", }, { name: "running", description: "Check if Fig is running", }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "set-path", description: "Set the internal pseudo-terminal path", }, { name: "uninstall", description: "Uninstall the Fig app", }, { name: "prompts", description: "Prompts shown on terminal startup", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", }, { name: "hide", }, { name: "init", }, { name: "integration-ready", }, { name: "keyboard-focus-changed", }, { name: "pre-exec", }, { name: "prompt", }, { name: "ssh", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", }, { name: "dotfiles", description: "Debug dotfiles", }, { name: "build", description: "Switch build", }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", }, { name: "logs", description: "Show fig debug logs", }, { name: "prompt-accessibility", description: "Prompt accessibility", }, { name: "sample", description: "Sample fig process", }, { name: "unix-socket", description: "Debug fig unix sockets", }, { name: "verify-codesign", description: "Debug fig codesign verification", }, { name: "accessibility", description: "Accessibility", }, { name: "key-tester", description: "Key Tester", }, { name: "diagnostics", description: "Watches diagnostics", }, { name: "query-index", description: "Queries remote repository for updates given the specified metadata", }, { name: "devtools", description: "Open up the devtools of a specific webview", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", }, { name: "docs", description: "Get the settings documentation", }, { name: "open", description: "Open the settings file", }, { name: "sync", description: "Sync the current settings", }, { name: "all", description: "List all the settings", }, ], }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", }, { name: "disable", description: "Disable fig tips", }, { name: "reset", description: "Reset the tips to the default", hidden: true, }, { name: "prompt", description: "Show the tips", hidden: true, }, ], }, { name: "install", description: "Install fig cli components", }, { name: "ssh", description: "Enable/disable fig SSH integration", }, { name: "uninstall", description: "Uninstall fig", hidden: true, }, { name: "update", description: "Update dotfiles", }, { name: "daemon", description: "Run the daemon", hidden: true, }, { name: "diagnostic", description: "Run diagnostic tests", }, { name: "init", description: "Generate the dotfiles for the given shell", }, { name: "source", description: "Sync your latest dotfiles", }, { name: "theme", description: "Get or set theme", }, { name: "invite", description: "Invite friends to Fig", }, { name: "tweet", description: "Tweet about Fig", }, { name: "issue", description: "Create a new Github issue", }, { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "user", description: "Manage your fig user", subcommands: [ { name: "login", description: "Login to Fig", }, { name: "logout", description: "Logout of Fig", }, { name: "tokens", description: "Subcommand for dealing with tokens", subcommands: [ { name: "new", }, { name: "list", }, { name: "revoke", }, { name: "validate", description: "Validate a token is valid", }, ], }, { name: "whoami", description: "Prints details about the current user", }, { name: "plan", description: "Prints details about the user's plan", hidden: true, }, { name: "list-accounts", description: "List all accounts that can be switch to", hidden: true, }, { name: "switch", description: "Switch to a switchable account", hidden: true, }, ], }, { name: "team", description: "Manage your fig team", subcommands: [ { name: "members", description: "List all members on a team", }, { name: "remove", description: "Remove a member from a team", }, { name: "add", description: "Invite a member to a team", }, { name: "invitations", description: "List pending invitations to a team", }, { name: "revoke", description: "Revoke an invitation to a team", }, ], }, { name: "doctor", description: "Check Fig is properly configured", }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, }, { name: "internal", description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", }, { name: "pre-cmd", description: "Command that is run during the PreCmd section of the fig integrations", }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", }, { name: "open", description: "Open the state file", }, { name: "all", description: "List all the settings", }, ], }, { name: "callback", description: "Callback used for the internal pseudoterminal", }, { name: "install", description: "Install fig cli", }, { name: "uninstall", description: "Uninstall fig cli", }, { name: "get-shell", }, { name: "hostname", }, { name: "should-figterm-launch", }, { name: "event", }, { name: "auth-token", }, { name: "request", }, { name: "sockets-dir", }, { name: "stream-from-socket", }, { name: "figterm-socket-path", }, { name: "ipc", }, { name: "uninstall-for-all-users", description: "Linux only", }, { name: "uuidgen", }, { name: "ibus-bootstrap", }, { name: "detect-sandbox", description: "Checks for sandboxing", }, { name: "open-uninstall-page", }, { name: "prompt-ssh", description: "Displays prompt to install remote shell integrations", }, { name: "dump-state", }, { name: "finish-update", }, { name: "check-ssh", description: "Checks to see if we should try to forward on this SSH connection", }, ], }, { name: "launch", description: "Launch the Fig desktop app", }, { name: "quit", description: "Quit the Fig desktop app", }, { name: "restart", description: "Restart the Fig desktop app", }, { name: "onboarding", description: "Run the Fig tutorial", hidden: true, }, { name: "plugins", description: "Manage your shell plugins with Fig", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", }, { name: "update", description: "Update the installed plugins", }, { name: "add", description: "Install a specific plugin from the plugin store", }, { name: "remove", description: "Uninstall a specific plugin", }, { name: "list", description: "List all plugins available in the plugin store", }, { name: "info", description: "Info about a specific plugin", }, { name: "configure", description: "Configure a specific plugin", }, ], }, { name: "man", description: "Open manual page", }, { name: "workflow", description: "Fig Workflows", }, { name: "integrations", description: "Manage system integrations", subcommands: [ { name: "install", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "uninstall", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, { name: "status", subcommands: [ { name: "dotfiles", }, { name: "daemon", }, { name: "ssh", }, { name: "input-method", }, { name: "vscode", }, { name: "intellij", }, { name: "all", }, ], }, ], }, { name: "ai", description: "English -> Bash translation", }, { name: "telemetry", description: "Enable/disable telemetry", hidden: true, subcommands: [ { name: "enable", }, { name: "disable", }, { name: "status", }, ], }, { name: "pro", description: "Fig Pro", }, { name: "version", description: "Version", }, { name: "help-all", description: "Print help for all subcommands", }, { name: "dashboard", description: "Open the fig dashboard", }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, }, { name: "bg:tmux", description: "(LEGACY) Old tmux hook that might be in ~/.tmux.conf", hidden: true, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", }, ], }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; const versions: Fig.VersionDiffMap = {}; versions["2.7.5"] = {}; export { versions }; export default completion; index.ts000066400000000000000000000006111471722043300403260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/old-specimport { createVersionedSpec } from "@fig/autocomplete-helpers"; const versionFiles = ["1.0.0", "2.0.0"]; export const getVersionCommand: Fig.GetVersionCommand = async (executeCommand) => { const { stdout } = await executeCommand({ command: "fig", args: ["--version"], }); return stdout.slice(stdout.indexOf(" ") + 1); }; export default createVersionedSpec("fig", versionFiles); shared.ts000066400000000000000000000260641471722043300404770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioning/fixtures/case-4/old-specconst SETTINGS_PATH = "~/.fig/tools/all-settings.json"; const ACTIONS_PATH = "~/.fig/apps/autocomplete/actions.json"; interface Setting { settingName: string; description: string; type: "boolean" | "text" | "single_select" | "multiselect"; options?: Array; default?: string; } interface Action { identifier: string; name: string; description: string; availability: string; defaultBindings: string[]; } const devCompletionsFolderGenerator: Fig.Generator = { script: '\\ls -d -1 "$PWD/"**/', postProcess: (out) => out.split("\n").map((folder) => { const paths = folder.split("/"); paths.pop(); return { name: paths.pop(), insertValue: folder, icon: `fig://${folder}`, }; }), }; const disableForCommandsGenerator: Fig.Generator = { script: "fig settings autocomplete.disableForCommands", postProcess: (out) => { const existing = out.split("\n").filter((item) => item.length > 0); const append: Fig.Suggestion = { name: "Disable new CLI...", description: `You must pass a valid JSON array of CLI tools contained within single quotes. e.g. '["npm","cd","ls"]'`, icon: "fig://icon?type=box", insertValue: JSON.stringify(existing.concat(["{cursor}"])), }; const enabledAll: Fig.Suggestion = { name: "Enable all commands", icon: "fig://icon?type=box", insertValue: "'[]'", }; return [append, enabledAll].concat( existing.map((disabledCommand) => { return { name: `Enable ${disabledCommand}`, icon: "fig://icon?type=box", insertValue: JSON.stringify( existing.filter((cmd) => cmd != disabledCommand) ), }; }) ); }, }; export const themesGenerator: Fig.Generator = { script: "fig theme --list", postProcess: (output) => { const builtinThemes = [ { name: "system", icon: "💻", priority: 51, }, { name: "light", icon: "fig://template?color=ffffff&badge=☀️", priority: 51, }, { name: "dark", icon: "fig://template?color=000000&badge=🌙", priority: 51, }, ]; return output .split("\n") .map((theme) => ({ name: theme.replace(".json", "") })) .concat(builtinThemes); }, }; export const SETTINGS_GENERATOR: Record = { "autocomplete.devCompletionsFolder": devCompletionsFolderGenerator, "autocomplete.disableForCommands": disableForCommandsGenerator, "autocomplete.theme": themesGenerator, }; export const subsystemsGenerator: Fig.Generator = { script: "\\ls ~/.fig/logs", trigger: (curr, prev) => { // trigger on new token return curr.length === 0 && prev.length > 0; }, postProcess: (out, tokens) => { const insertedLogFiles = new Set(tokens.slice(0, -1)); return out .split("\n") .map((name) => name.replace(".log", "")) .concat("figterm") .map((name) => ({ name, icon: "🪵" })) .filter((suggestion) => !insertedLogFiles.has(suggestion.name)); }, }; export const settingsSpecGenerator: Fig.Subcommand["generateSpec"] = async ( _, executeShellCommand ) => { const text = await executeShellCommand( "fig _ request --method GET --route '/settings/all'" ); const { settings, actions } = JSON.parse(text) as { settings: Setting[]; actions: Action[]; }; const actionSuggestions: Fig.Suggestion[] = actions.map((action) => ({ name: action.identifier.startsWith("autocomplete.") ? action.identifier.slice(13) : action.identifier, description: action.description, icon: "⚡️", })); return { name: "settings", subcommands: settings.map( ({ settingName: name, description, type, options, default: defaultValue, }) => { const suggestions = type === "boolean" ? ["true", "false"] : name.startsWith("autocomplete.keybindings.") ? actionSuggestions : options?.map((option) => ({ name: option["name"] || option, description: option["description"] || "", })); // const insertValue = // type === "multiselect" ? `${name} '{cursor}'` : undefined; const generators = SETTINGS_GENERATOR[name]; return { name, description, icon: "fig://icon?type=commandkey", // insertValue, args: { name: type, default: defaultValue, suggestions: generators ? [] : suggestions, generators, }, }; } ), }; }; interface Plugin { name: string; icon: string; description: string; } export const pluginsGenerator = (init: { installed: boolean; }): Fig.Generator => ({ cache: { strategy: "stale-while-revalidate", }, custom: async (_tokens, executeShellCommand) => { const script = init.installed ? "fig plugins list --format json --installed" : "fig plugins list --format json"; const out = await executeShellCommand(script); const json = JSON.parse(out) as Plugin[]; return json.map((plugin) => ({ name: plugin.name, icon: !plugin.icon?.startsWith("https://") ? plugin.icon : "📦", description: plugin.description, })); }, }); /** * Fig team */ // For insertions like `fig user tokens --team ` export const tokensGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", }, custom: async (tokens, executeShellCommand) => { const teamOptionIndex = tokens.findIndex((value) => value.startsWith("--team") ); if (teamOptionIndex === -1) return []; let teamName: string; if (tokens[teamOptionIndex].includes("=")) { teamName = tokens[teamOptionIndex + 1].split("=")[1]; } else { teamName = tokens[teamOptionIndex + 1]; } const out = JSON.parse( await executeShellCommand( `fig user tokens list --team ${teamName} --format json` ) ) as { createdAt: string; description?: string; expiresAt?: string; lastUsedAt: string; name: string; namespace: { username: string }; }[]; return out.map((token) => { return { name: token.name, description: `Team: ${token.namespace.username}.${ token.description ? " " + token.description : "" }`, }; }); }, }; export const teamsGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", }, script: "fig team --list --format json", postProcess: (out) => { return ( JSON.parse(out) as { id: number; name: string; specs: string[] }[] ).map((team) => ({ name: team.name, priority: 75 })); }, }; // For insertions like `fig teams ` export const membersGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", ttl: 1000 * 60, }, custom: async (tokens, executeShellCommand) => { const teamName = tokens.at(-3); const out = JSON.parse( await executeShellCommand(`fig team --format json ${teamName} members`) ) as { email: string; role: string }[]; return out.map((member) => { return { name: member.email, description: `Role: ${member.role}`, }; }); }, }; // For insertions like `fig teams ` export const invitationsGenerators: Fig.Generator = { cache: { strategy: "stale-while-revalidate", ttl: 1000 * 60, }, custom: async (tokens, executeShellCommand) => { const teamName = tokens.at(-3); const out = JSON.parse( await executeShellCommand( `fig team --format json ${teamName} invitations` ) ) as { email: string; role: string }[]; return out.map((invitation) => { return { name: invitation.email, description: `Role: ${invitation.role}`, }; }); }, }; /** * Fig workflows */ export const workflowsSpecGenerator: Fig.Subcommand["generateSpec"] = async ( _, exec ) => { const response = await exec( "fig _ request --route '/workflows' --method GET" ); const workflows = JSON.parse(response); const subcommands = workflows.map((workflow) => { const displayName = `${workflow.displayName ?? workflow.name} | @${ workflow.namespace }`; const options = workflow.parameters.map((param) => { const option: Fig.Option = { name: `--${param.name}`, description: param.description, }; switch (param.type) { case "text": option.args = { name: param.name, }; case "selector": let generators: Fig.Generator[] = []; if (param.typeData.generators) { generators = param.typeData.generators .filter((generator) => generator.type === "script") .map((generator) => ({ script: generator.script, splitOn: "\n", })); } option.args = { name: param.name, suggestions: param.typeData.suggestions, generators, }; } return option; }); // Add @namespace/name and name (if this workflow is associated with user's namespace) const name = [`@${workflow.namespace}/${workflow.name}`]; if (workflow.isOwnedByUser) { name.push(workflow.name); } return { displayName, icon: workflow.icon ?? "⚡️", name, insertValue: workflow.isOwnedByUser ? workflow.name : name[0], description: workflow.description, options, }; }); return { name: "run", subcommands, filterStrategy: "fuzzy", }; }; export const sshHostsGenerator: Fig.Generator = { script: "fig _ request --method GET --route /access/hosts/all", cache: { strategy: "stale-while-revalidate", }, postProcess: (out) => { return ( JSON.parse(out) as { nickName: string; namespace: string; description: string; }[] ).map((host) => ({ insertValue: `@${host.namespace}/${host.nickName}`, displayName: `${host.nickName} (@${host.namespace})`, name: `@${host.namespace}/${host.nickName}`, description: host.description, })); }, }; export const sshIdentityGenerator: Fig.Generator = { custom: async (tokens, executeShellCommand) => { const host = tokens.slice(2).find((value) => !value.startsWith("-")); if (host === undefined) { return []; } const hosts = JSON.parse( await executeShellCommand(`fig ssh ${host} --get-identities`) ) as { displayName: string; username: string }[]; return hosts.map((host) => ({ name: host.displayName, })); }, }; export const userGenerator: Fig.Generator = { script: "fig user list-accounts", postProcess: (out) => { if (out.startsWith("error: ")) { return []; } return out .trim() .split("\n") .map((name) => ({ name, icon: "👤" })); }, }; export default {}; index.ts000066400000000000000000000055561471722043300337100ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/test/versioningimport fs from "fs"; import child from "child_process"; import path from "path"; import { copyDirectorySync } from "../../src/scripts/version"; const cliPath = path.join(__dirname, "..", "..", "src", "bin.ts"); const fixturesPath = path.join(__dirname, "fixtures"); const dirs = fs .readdirSync(fixturesPath, { withFileTypes: true }) .filter((file) => file.isDirectory() && file.name !== ".DS_Store"); function assertEqualFiles(path1: string, path2: string): boolean { if (!fs.statSync(path1).isFile() || !fs.statSync(path2).isFile()) return false; return fs.readFileSync(path1).equals(fs.readFileSync(path2)); } function assertEqualDirectories(path1: string, path2: string): boolean { if (!fs.statSync(path1).isDirectory() || !fs.statSync(path2).isDirectory()) return false; const dirA = fs .readdirSync(path1, { withFileTypes: true }) .filter((file) => file.name !== ".DS_Store"); const dirB = fs .readdirSync(path2, { withFileTypes: true }) .filter((file) => file.name !== ".DS_Store"); if (dirA.length !== dirB.length) return false; for (const dirent of dirA) { const dirent1Path = path.join(path1, dirent.name); const dirent2Path = path.join(path2, dirent.name); if (dirent.isDirectory() && !assertEqualDirectories(dirent1Path, dirent2Path)) { return false; } if (dirent.isFile() && !assertEqualFiles(dirent1Path, dirent2Path)) { return false; } } return true; } export function runFixtures() { let hadErrors = false; for (const dir of dirs) { const fixtureDirPath = path.join(fixturesPath, dir.name); const newSpecPath = path.resolve(fixtureDirPath, "new-spec.ts"); const updatedSpecPath = path.join(fixtureDirPath, "updated-spec"); // gitignored const expectedSpecPath = path.join(fixtureDirPath, "expected-spec"); const configPath = path.join(fixtureDirPath, "config.json"); let newVersion: string; try { const config = JSON.parse(fs.readFileSync(configPath, "utf8")); newVersion = config.newVersion; // TODO: load other options } catch (error) { throw new Error(`You must provide a config.json file for fixture at ${fixtureDirPath}`); } fs.rmSync(updatedSpecPath, { recursive: true, force: true }); const cmd = `node -r tsx/cjs ${cliPath} version add-diff old-spec ${newSpecPath} ${newVersion} --cwd ${fixtureDirPath} --new-path ${updatedSpecPath}`; try { child.execSync(cmd); } catch (error) { console.warn(`- Encounterd an error when running fixture ${fixtureDirPath}.\n${error}`); } if (process.env.OVERWRITE || !fs.existsSync(expectedSpecPath)) { copyDirectorySync(updatedSpecPath, expectedSpecPath); } else if (!assertEqualDirectories(expectedSpecPath, updatedSpecPath)) { hadErrors = true; console.error(`- Fixture ${fixtureDirPath} is failing.`); } } if (hadErrors) { process.exit(1); } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/cli/tools-cli/tsconfig.json000066400000000000000000000010171471722043300316410ustar00rootroot00000000000000{ "compilerOptions": { "target": "ESNext", "lib": ["ESNext", "DOM"], "allowJs": false, "skipLibCheck": false, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", "moduleResolution": "Bundler", "rootDir": "src", "outDir": "build", "types": ["@withfig/autocomplete-types", "node"], "declaration": true }, "exclude": ["node_modules/", "generate-spec.ts", "test", "src/bin.ts"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/000077500000000000000000000000001471722043300257555ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/config-autocomplete/000077500000000000000000000000001471722043300317215ustar00rootroot00000000000000LICENSE000066400000000000000000000020711471722043300326470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/config-autocompleteMIT License Copyright (c) 2022 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. README.md000066400000000000000000000001521471722043300331170ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/config-autocomplete# @fig/eslint-config-autocomplete package This is a ready to use eslint config for autocomplete packages.index.js000066400000000000000000000010151471722043300333040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/config-autocompletemodule.exports = { parser: "@typescript-eslint/parser", parserOptions: { ecmaVersion: 2020, sourceType: "module", }, extends: [ "plugin:@typescript-eslint/recommended", "plugin:@withfig/fig-linter/recommended", "plugin:compat/recommended", ], env: { browser: true, }, plugins: ["@withfig/fig-linter"], rules: { "@typescript-eslint/explicit-module-boundary-types": 0, "no-unused-vars": ["off"], "no-var": ["off"], "@typescript-eslint/no-unused-vars": ["off"], }, }; package.json000066400000000000000000000012171471722043300341310ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/config-autocomplete{ "name": "@fig/eslint-config-autocomplete", "version": "2.0.0", "description": "Shared ESlint configuration for autocomplete repos", "author": "The Fig Team", "keywords": [ "eslint", "eslintconfig", "fig", "autocomplete" ], "engines": { "node": ">=20" }, "license": "MIT", "main": "./index.js", "peerDependencies": { "@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/parser": "^7.0.0", "@withfig/eslint-plugin-fig-linter": "workspace:^", "eslint": "^8.56.0", "eslint-plugin-compat": "^4.2.0", "typescript": ">=4.7.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/000077500000000000000000000000001471722043300313115ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/LICENSE000066400000000000000000000020711471722043300323160ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. README.md000066400000000000000000000002321471722043300325060ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter# @withfig/eslint-plugin-fig-linter This is a eslint plugin which is tailored for fig specs and ensures some conventions are followed when writing them. index.js000066400000000000000000000066011471722043300327020ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-lintermodule.exports = { rules: { "no-malicious-script": require("./rules/no-malicious-script"), "no-name-equals": require("./rules/no-name-equals"), "no-invalid-option": require("./rules/no-invalid-option"), "no-invalid-name": require("./rules/no-invalid-name"), "no-empty-array-values": require("./rules/no-empty-array-values"), "no-useless-insertvalue": require("./rules/no-useless-insertvalue"), "no-duplicate-options-subcommands": require("./rules/no-duplicate-options-subcommands"), "no-missing-default-export": require("./rules/no-missing-default-export"), "no-useless-arrays": require("./rules/no-useless-arrays"), "conventional-descriptions": require("./rules/conventional-descriptions"), "no-default-value-props": require("./rules/no-default-value-props"), "no-missing-get-version-export": require("./rules/no-missing-get-version-export"), "no-missing-versions-export": require("./rules/no-missing-versions-export"), "no-arg-in-option-name": require("./rules/no-arg-in-option-name"), }, configs: { recommended: { plugins: ["@withfig/fig-linter"], rules: { "@withfig/fig-linter/no-malicious-script": "error", }, overrides: [ { // IMPORTANT!: when enabling a new rule that may conflict with how diff-versioned-specs work // be sure to exclude it from diff-versioned-specs (see below) files: "src/**/*.ts", rules: { "@withfig/fig-linter/no-useless-insertvalue": "error", "@withfig/fig-linter/no-empty-array-values": "error", "@withfig/fig-linter/no-name-equals": "error", "@withfig/fig-linter/no-default-value-props": [ "error", [ { path: "options.[*].isRequired", defaultValue: false }, { path: "args.[*]?.isOptional", defaultValue: false }, { path: "args.[*]?.isDangerous", defaultValue: false }, { path: "options.[*].isDangerous", defaultValue: false }, { path: "subcommands.[*].isDangerous", defaultValue: false }, { path: "args.[*]?.isVariadic", defaultValue: false }, ], ], // TODO: Re-Enable Rule if we got a proper flag for that "@withfig/fig-linter/no-invalid-option": "off", "@withfig/fig-linter/no-invalid-name": "error", "@withfig/fig-linter/no-duplicate-options-subcommands": "error", "@withfig/fig-linter/no-missing-default-export": "error", "@withfig/fig-linter/no-useless-arrays": "error", "@withfig/fig-linter/conventional-descriptions": "error", "@withfig/fig-linter/no-arg-in-option-name": "error", }, }, { // MARK: here we modify some rules for diff-versioned-specs indexes files: "src/**/index.ts", rules: { "@withfig/fig-linter/no-missing-get-version-export": "warn", }, }, { // MARK: here we modify some rules from diff-versioned-specs versions files: "src/**/+([0-9]).+([0-9]).+([0-9]).ts", rules: { "@withfig/fig-linter/no-missing-versions-export": "error", "@withfig/fig-linter/no-default-value-props": "off", // disable this since diff-versioned specs may change isOptional to a default value }, }, ], }, }, }; package.json000066400000000000000000000004351471722043300335220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter{ "name": "@withfig/eslint-plugin-fig-linter", "version": "1.4.1", "description": "This is a eslint plugin which is tailored for fig specs", "main": "index.js", "keywords": [], "author": "The fig team", "license": "MIT", "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rules/000077500000000000000000000000001471722043300324435ustar00rootroot00000000000000conventional-descriptions.js000066400000000000000000000050271471722043300401310ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesconst PROBLEMS = { trailingDot: "no trailing dot", leadingWhitespaces: "no leading whitespaces", trailingWhitespaces: "no trailing whitespaces", uncapitalized: "first letter capitalized", newlineLeadingWhitespaces: "no leading whitespaces on newlines", }; module.exports = { meta: { type: "problem", fixable: "code", }, create(context) { return { 'ObjectExpression > Property[key.name="description"]': function (node) { const propValue = node.value; if ( (propValue.type === "Literal" && typeof propValue.value === "string") || (propValue.type === "TemplateLiteral" && propValue.quasis.length === 1) ) { const isTemplateLiteral = propValue.type === "TemplateLiteral" const problems = []; let newString = isTemplateLiteral ? propValue.quasis[0].value.raw : propValue.raw.slice(1, -1); // exclude the StringLiteral op but keep escapes if (newString.charAt(0).match(/[\n\s]/g)) { problems.push(PROBLEMS.leadingWhitespaces); newString = newString.trimStart(); } if (newString.charAt(newString.length - 1).match(/[\n\s]/g)) { problems.push(PROBLEMS.trailingWhitespaces); newString = newString.trimEnd(); } if (newString.charAt(0) !== newString.charAt(0).toUpperCase()) { problems.push(PROBLEMS.uncapitalized); newString = newString.charAt(0).toUpperCase() + newString.slice(1); } if (newString.endsWith(".")) { problems.push(PROBLEMS.trailingDot); newString = newString.slice(0, -1); } if (isTemplateLiteral && newString.match(/\n\s+/g)) { problems.push(PROBLEMS.newlineLeadingWhitespaces); newString = newString.split("\n").filter(s => !!s).map(s => s.trimStart()).join("\n") // remove trailing whitespaces for template literals } if (problems.length) { context.report({ node: propValue, message: `Descriptions should have: ${problems.join(", ")}.`, fix(fixer) { if (isTemplateLiteral) { return fixer.replaceText(propValue, "`" + newString + "`") } else { const d = propValue.raw.slice(0, 1); // keep the original StringLiteral op return fixer.replaceText(propValue, d + newString + d); } }, }); } } }, }; }, }; no-arg-in-option-name.js000066400000000000000000000016231471722043300367370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", }, create(context) { function report (node) { context.report({ node: node, message: "Args should be separated from the option name, see https://fig.io/docs/reference/option#args", }); } return { 'ObjectExpression > Property[key.name="options"] > ArrayExpression > ObjectExpression > Property[key.name="name"]': function (node) { const optionNameNode = node.value; const optNameElementNodes = optionNameNode.type === "ArrayExpression" ? optionNameNode.elements // name: ["--one", "--two"] : [optionNameNode]; // name: "--one" for (const node of optNameElementNodes) { if (node.type === "Literal" && typeof node.value === "string" && node.value.indexOf(" ") >= 0) { report(node); } } }, }; }, }; no-default-value-props.js000066400000000000000000000036011471722043300372330ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", fixable: "code", // [{path: "options.[*].isOptional", defaultValue: "true"}] schema: [{ type: "array", items: { type: "object", properties: { path: { type: "string" }, // check if `anyliteral` exists defaultValue: { type: "any" } } } }], }, create(context) { function checker(propName, defaultValue) { return (node) => { const nodeValue = node.value; // see if it is possible to resolve the map if (nodeValue.type === "Literal" && nodeValue.value === defaultValue) { context.report({ node, message: `The ${propName} prop if ${defaultValue} by default and can be omitted`, fix(fixer) { const [start, end] = node.range; return fixer.removeRange([start, end + 1]); }, }); } } } return context.options[0].reduce((traverseObject, setting) => { const { path, defaultValue } = setting const pathComponents = path.split(".") pathComponents.reduce((previousTraversePaths, component) => { return previousTraversePaths.flatMap((currentPath) => { if (component.startsWith("[*]")) { const returnedPaths = [] if (component.endsWith("?")) { returnedPaths.push(currentPath) } returnedPaths.push(currentPath + 'ArrayExpression > ') return returnedPaths } else { return `${currentPath}ObjectExpression > Property[key.name="${component}"] > ` } }) }, [""]).map(path => path.slice(0, -3)).forEach(traversePath => { traverseObject[traversePath] = checker(pathComponents[pathComponents.length - 1], defaultValue) }); return traverseObject }, {}) }, }; no-duplicate-options-subcommands.js000066400000000000000000000032561471722043300413160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesfunction getNameProperty(object) { for (const property of object.properties) { if ( property.type === "Property" && property.key.type === "Identifier" && property.key.name === "name" ) { return property; } } } module.exports = { meta: { type: "problem", }, create(context) { return { 'ObjectExpression > Property[key.type="Identifier"]': function (node) { if (node.key.name === "options" || node.key.name === "subcommands") { const set = new Set(); if (node.value.type !== "ArrayExpression") return; for (const obj of node.value.elements) { if (obj.type !== "ObjectExpression") return; const nameProp = getNameProperty(obj); if (!nameProp) return; let nameLiterals = []; switch (nameProp.value.type) { case "Literal": // e.g. name: "npm" nameLiterals = [nameProp.value]; break; case "ArrayExpression": // e.g. name: ["-v", "--version"] nameLiterals = nameProp.value.elements; break; default: return; } nameLiterals.forEach((nameLiteral) => { if (set.has(nameLiteral.value)) { return context.report({ node: nameLiteral, message: `Duplicate "${nameLiteral.value}" ${ node.key.name === "options" ? "option" : "subcommand" } name.`, }); } set.add(nameLiteral.value); }); } } }, }; }, }; no-empty-array-values.js000066400000000000000000000022351471722043300371050ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", fixable: "code", }, create(context) { return { Property(node) { const keyName = node.key.name; if (["options", "subcommands", "args"].includes(keyName)) { // This rule should not be applied to subcommands and // options on the root object if ( node.parent && node.parent.parent && node.parent.parent.parent && node.parent.parent.parent.parent && node.parent.parent.parent.parent.type === "ExportNamedDeclaration" && keyName !== "args" ) return; if (node.value && node.value.type === "ArrayExpression") { if (node.value.elements.length === 0) { context.report({ node, message: "Empty arrays don't have any effect and can be omitted", fix(fixer) { const [start, end] = node.range; return fixer.removeRange([start, end + 1]); }, }); } } } }, }; }, }; no-invalid-name.js000066400000000000000000000033221471722043300357000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesconst INVALID_REGEXP = /(<|\[).*(>|\])/; const ERROR_MESSAGE = `The prop contains invalid characters. If you subcommand / option takes an argument takes an argument, Fig will automatically display this when you add a name prop to the args object.`; module.exports = { meta: { type: "problem", }, create(context) { return { Property(node) { if (node.key.name === "options" || node.key.name === "subcommand") { if (node.value && node.value.type === "ArrayExpression") { node.value.elements.forEach((element) => { if (element.type !== "ObjectExpression") return; // Look for the name property in the options object const nameProp = element.properties.find( (prop) => prop.key && prop.key.name === "name" ); if (!nameProp) return; // Case: The name value is a string (single value) if (nameProp.value.type === "Literal") { if (INVALID_REGEXP.test(nameProp.value.value)) { context.report({ node: nameProp, message: ERROR_MESSAGE, }); } } // Case: The name value is a list of strings (array) if (nameProp.value.type === "ArrayExpression") { nameProp.value.elements.forEach((literal) => { if (INVALID_REGEXP.test(nameProp.value.value)) { context.report({ node: literal, message: ERROR_MESSAGE, }); } }); } }); } } }, }; }, }; no-invalid-option.js000066400000000000000000000044411471722043300362730ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesconst DASH_CHAR = "-"; const ERROR_MESSAGE = ` 1. Each individual option should be listed separately in the array of option objects e.g. "-am" should have an option for -a" and an option for "-m" 2. If you would like to provide custom suggestions for common flag sequences, please list them as Suggestion objects using the additionalSuggestions prop with type: shortcut`; function getDashAmount(string) { let count = 0; if (string.length === 0) return 0; if (string[0] === DASH_CHAR) { count++; } if (string[1] === DASH_CHAR) { count++; } return count; } function checkIsInvalidName(name) { const dashAmount = getDashAmount(name); const lengthWithoutDashes = name.slice(dashAmount).length; return ( (dashAmount === 1 && lengthWithoutDashes > 1) || (dashAmount === 2 && lengthWithoutDashes === 1) ); } module.exports = { meta: { type: "problem", }, create(context) { return { Property(node) { if (node.key.name === "options") { if (node.value && node.value.type === "ArrayExpression") { node.value.elements.forEach((element) => { if (element.type !== "ObjectExpression") return; // Look for the name property in the options object const nameProp = element.properties.find( (prop) => prop.key.name === "name" ); // Case: The name value is a string (single value) if (nameProp.value.type === "Literal") { const isInvalid = checkIsInvalidName(nameProp.value.value); if (isInvalid) { context.report({ node: element, message: ERROR_MESSAGE, }); } } // Case: The name value is a list of strings (array) if (nameProp.value.type === "ArrayExpression") { nameProp.value.elements.forEach((literal) => { const isInvalid = checkIsInvalidName(literal.value); if (isInvalid) { context.report({ node: literal, message: ERROR_MESSAGE, }); } }); } }); } } }, }; }, }; no-malicious-script.js000066400000000000000000000007351471722043300366300ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesconst RM_RF_REGEXP = /rm \-(?:f(?:(?: \-)?r)?|r(?: \-f|f)?)/; module.exports = { meta: { type: "problem", }, create(context) { return { Property(node) { if (node.key.name === "script") { const scriptValue = node.value.value; if (RM_RF_REGEXP.test(scriptValue)) { context.report({ node, message: "No Malicious Script allowed", }); } } }, }; }, }; no-missing-default-export.js000066400000000000000000000010121471722043300377400ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", }, create(context) { let hasExport = false; return { ExportDefaultDeclaration() { hasExport = true; }, 'ExportSpecifier[exported.name="default"]': function (node) { hasExport = true; }, "Program:exit": function (node) { if (!hasExport) { context.report({ node, message: "File must default export a completion spec object", }); } }, }; }, }; no-missing-get-version-export.js000066400000000000000000000013241471722043300405640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", }, create(context) { let hasExport = false; return { 'ExportNamedDeclaration > FunctionDeclaration[id.name="getVersionCommand"]'() { hasExport = true; }, 'ExportNamedDeclaration > VariableDeclaration > VariableDeclarator[id.name="getVersionCommand"]'() { hasExport = true; }, 'ExportSpecifier[exported.name="getVersionCommand"]'() { hasExport = true; }, "Program:exit": function (node) { if (!hasExport) { context.report({ node, message: "File should have an exported function named `getVersionCommand`", }); } }, }; }, }; no-missing-versions-export.js000066400000000000000000000012561471722043300401760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", }, create(context) { let hasExport = false; return { 'ExportNamedDeclaration > FunctionDeclaration[id.name="versions"]'() { hasExport = true; }, 'ExportNamedDeclaration > VariableDeclaration > VariableDeclarator[id.name="versions"]'() { hasExport = true; }, 'ExportSpecifier[exported.name="versions"]'() { hasExport = true; }, "Program:exit": function (node) { if (!hasExport) { context.report({ node, message: "File should have an exported object named `versions`", }); } }, }; }, }; no-name-equals.js000066400000000000000000000012431471722043300355440ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", fixable: "code", }, create(context) { return { Property(node) { if (node.key.name === "name") { const currentNode = node.value; if ( currentNode.type === "Literal" && currentNode.value.endsWith("=") ) { context.report({ node, message: "The name property must not include `=`", fix(fixer) { const [, end] = currentNode.range; return fixer.replaceTextRange([end - 2, end - 1], ""); }, }); } } }, }; }, }; no-useless-arrays.js000066400000000000000000000020521471722043300363150ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", fixable: "code", }, create(context) { return { "ObjectExpression > Property": function (node) { const propName = node.key.name; const propValue = node.value; if ( (propName === "name" || propName === "args" || propName === "generators") && propValue.type === "ArrayExpression" && propValue.elements.length === 1 ) { context.report({ node, message: `If \`${propName}\` is a single value it should not be enclosed in square brackets.`, fix(fixer) { const [wrapperStart, wrapperEnd] = propValue.range; // it doesn't take into account `[...elem]` const [itemStart, itemEnd] = propValue.elements[0].range; return [ fixer.removeRange([wrapperStart, itemStart]), fixer.removeRange([itemEnd, wrapperEnd]), ]; }, }); } }, }; }, }; no-useless-insertvalue.js000066400000000000000000000016661471722043300373670ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/eslint/plugin-fig-linter/rulesmodule.exports = { meta: { type: "problem", fixable: "code", }, create(context) { return { 'ObjectExpression > Property[key.name="insertValue"]': function (node) { const nameProp = node.parent.properties.find( (prop) => prop?.key?.name === "name" ); if (!nameProp) return; const insertValue = node.value.value; const nameValue = nameProp.value.value; if (!insertValue || !nameValue) return; if (insertValue === nameValue) { context.report({ node, message: "The insertValue prop can be omitted if the value is the same as name", fix(fixer) { const [start, end] = node.range; // TODO: check if there is a comma after the prop before removing end + 1 return fixer.removeRange([start, end + 1]); }, }); } }, }; }, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/000077500000000000000000000000001471722043300266305ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/.gitignore000066400000000000000000000000341471722043300306150ustar00rootroot00000000000000.DS_Store node_modules/ lib/golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/.mocharc.json000066400000000000000000000001271471722043300312150ustar00rootroot00000000000000{ "extension": ["ts"], "spec": "test/**/*.test.ts", "require": "./test/hook.js" }golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/LICENSE000066400000000000000000000020711471722043300276350ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/README.md000066400000000000000000000001561471722043300301110ustar00rootroot00000000000000# @fig/autocomplete-generators package This package adds some sugar over default Fig autocomplete generators.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/index.ts000066400000000000000000000002071471722043300303060ustar00rootroot00000000000000export { filepaths, FilepathsOptions, folders } from "./src/filepaths"; export * from "./src/keyvalue"; export { ai } from "./src/ai"; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/package.json000066400000000000000000000011551471722043300311200ustar00rootroot00000000000000{ "name": "@fig/autocomplete-generators", "version": "2.4.0", "description": "A set of prebuilt generators for Fig Autocomplete", "main": "lib/index.js", "scripts": { "build": "tsc", "pretest": "pnpm build", "test": "vitest --run", "prepack": "pnpm build" }, "author": "Federico Ciardi ", "license": "MIT", "files": [ "lib/" ], "devDependencies": { "@types/node": "^22.5.2", "@withfig/autocomplete-types": "workspace:^", "tsx": "^4.19.0", "typescript": "^5.5.4", "vitest": "^2.1.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/src/000077500000000000000000000000001471722043300274175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/src/ai.ts000066400000000000000000000067161471722043300303720ustar00rootroot00000000000000export type GeneratorFn = (args: { tokens: string[]; executeCommand: Fig.ExecuteCommandFunction; generatorContext: Fig.GeneratorContext; }) => Promise | T; const MAX_TOKENS = 4097; const TOKEN_TO_CHAR_RATIO = 4; const MARGIN_RATIO = 0.8; const MAX_CHARS = MAX_TOKENS * TOKEN_TO_CHAR_RATIO * MARGIN_RATIO; /** * A generator that uses the Fig AI API to generate suggestions. * * @param prompt The prompt to use for the AI. Can be a string or a generator function. * @param message The message to send to the AI. Can be a string or a generator function. * @param postProcess A function to post-process the AI's response. * @param temperature The temperature to use for the AI. * @returns A Fig generator. */ export function ai({ name, prompt, message, postProcess, temperature, splitOn, }: { name: string; prompt?: string | GeneratorFn; message: string | GeneratorFn | null; postProcess?: (out: string) => Fig.Suggestion[]; temperature?: number; splitOn?: string; }): Fig.Generator { return { scriptTimeout: 15000, custom: async (tokens, executeCommand, generatorContext) => { const settingOutput = await executeCommand({ command: "fig", args: ["settings", "--format", "json", "autocomplete.ai.enabled"], }); if (!JSON.parse(settingOutput.stdout)) { return []; } const promptString = typeof prompt === "function" ? await prompt({ tokens, executeCommand, generatorContext, }) : prompt; const messageString = typeof message === "function" ? await message({ tokens, executeCommand, generatorContext, }) : message; if (messageString === null || messageString.length === 0) { console.warn("No message provided to AI generator"); return []; } const budget = MAX_CHARS - (promptString?.length ?? 0); const body = { model: "gpt-3.5-turbo", source: "autocomplete", name, messages: [ ...(promptString ? [ { role: "system", content: promptString, }, ] : []), { role: "user", content: messageString.slice(0, budget), }, ], temperature, }; const bodyJson = JSON.stringify(body); const requestOutput = await executeCommand({ command: "fig", args: ["_", "request", "--route", "/ai/chat", "--method", "POST", "--body", bodyJson], }); const json = JSON.parse(requestOutput.stdout); const a = json?.choices // eslint-disable-next-line @typescript-eslint/no-explicit-any .map((c: any) => c?.message?.content) .filter((c: unknown) => typeof c === "string") .flatMap((c: string) => splitOn ? c.split(splitOn).filter((s) => s.trim().length > 0) : [c] ) .map((out: string) => { if (postProcess) { return postProcess(out); } const text = out.trim().replace(/\n/g, " "); return { icon: "🪄", name: text, insertValue: `'${text}'`, description: "Generated by Fig AI", } as Fig.Suggestion; }) ?? []; return a; }, }; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/src/filepaths.ts000066400000000000000000000170531471722043300317540ustar00rootroot00000000000000import { ensureTrailingSlash, shellExpand } from "./resolve"; export interface FilepathsOptions { /** * Show suggestions with any of these extensions. Do not include the leading dot. */ extensions?: string[]; /** * Show suggestions where the name exactly matches one of these strings */ equals?: string | string[]; /** * Show suggestions where the name matches this expression */ matches?: RegExp; /** * Will treat folders like files, filtering based on the name. */ filterFolders?: boolean; /** * Set properties of suggestions of type "file". */ editFileSuggestions?: Omit; /** * Set properties of suggestions of type "folder". */ editFolderSuggestions?: Omit; /** * Start to suggest filepaths and folders from this directory. */ rootDirectory?: string; /** * Set how the generator should display folders: * - **Default:** `always` will always suggest folders. * - `never`: will never suggest folders. * - `only`: will show only folders and no files. */ showFolders?: "always" | "never" | "only"; } export function sortFilesAlphabetically(array: string[], skip: string[] = []): string[] { const skipLower = skip.map((str) => str.toLowerCase()); const results = array.filter((x) => !skipLower.includes(x.toLowerCase())); // Put all files beginning with . after all those that don't, sort alphabetically within each. return [ ...results.filter((x) => !x.startsWith(".")).sort((a, b) => a.localeCompare(b)), ...results.filter((x) => x.startsWith(".")).sort((a, b) => a.localeCompare(b)), "../", ]; } /** * @param cwd - The current working directory when the user started typing the new path * @param searchTerm - The path inserted by the user, it can be relative to cwd or absolute * @returns The directory the user inserted, taking into account the cwd. */ export const getCurrentInsertedDirectory = ( cwd: string | null, searchTerm: string, context: Fig.ShellContext ): string => { if (cwd === null) return "/"; const resolvedPath = shellExpand(searchTerm, context); const dirname = resolvedPath.slice(0, resolvedPath.lastIndexOf("/") + 1); if (dirname === "") { return ensureTrailingSlash(cwd); } return dirname.startsWith("/") ? dirname : `${ensureTrailingSlash(cwd)}${dirname}`; }; /** * Sugar over using the `filepaths` template with `filterTemplateSuggestions`. If any of the * conditions match, the suggestion will be accepted. * * Basic filepath filters can be replaced with this generator. * * @example * ``` * // inside a `Fig.Arg`... * generators: filepaths({ extensions: ["mjs", "js", "json"] }); * ``` */ function filepathsFn(options: FilepathsOptions = {}): Fig.Generator { const { extensions = [], equals = [], matches, filterFolders = false, editFileSuggestions, editFolderSuggestions, rootDirectory, showFolders = "always", } = options; // TODO: automatically remove eventual leading dots const extensionsSet = new Set(extensions); const equalsSet = new Set(equals); // NOTE: If no filter is provided we should not run the filterSuggestions fn. // !! When new filtering parameters are added we should increase this function const shouldFilterSuggestions = () => extensions.length > 0 || equals.length > 0 || matches; const filterSuggestions = ( suggestions: Fig.TemplateSuggestion[] = [] ): Fig.TemplateSuggestion[] => { if (!shouldFilterSuggestions()) return suggestions; return suggestions.filter(({ name = "", type }) => { if (!filterFolders && type === "folder") return true; if (equalsSet.has(name)) return true; if (matches && !!name.match(matches)) return true; // handle extensions const [, ...suggestionExtensions] = name.split("."); if (suggestionExtensions.length >= 1) { let i = suggestionExtensions.length - 1; let stackedExtensions = suggestionExtensions[i]; do { if (extensionsSet.has(stackedExtensions)) { return true; } i -= 1; // `i` may become -1 which is not a valid index, but the extensionSet check at the beginning is not run in that case, // so the wrong extension is not evaluated stackedExtensions = [suggestionExtensions[i], stackedExtensions].join("."); } while (i >= 0); } return false; }); }; const postProcessSuggestions = ( suggestions: Fig.TemplateSuggestion[] = [] ): Fig.TemplateSuggestion[] => { if (!editFileSuggestions && !editFolderSuggestions) return suggestions; return suggestions.map((suggestion) => ({ ...suggestion, ...((suggestion.type === "file" ? editFileSuggestions : editFolderSuggestions) || {}), })); }; return { trigger: (oldToken, newToken) => { const oldLastSlashIndex = oldToken.lastIndexOf("/"); const newLastSlashIndex = newToken.lastIndexOf("/"); // If the final path segment has changed, trigger new suggestions if (oldLastSlashIndex !== newLastSlashIndex) { return true; } // Here, there could either be no slashes, or something before the // final slash has changed. In the case where there are no slashes, // we don't want to trigger on each keystroke, so explicitly return false. if (oldLastSlashIndex === -1 && newLastSlashIndex === -1) { return false; } // We know there's at least one slash in the string thanks to the case // above, so trigger if anything before the final slash has changed. return oldToken.slice(0, oldLastSlashIndex) !== newToken.slice(0, newLastSlashIndex); }, getQueryTerm: (token) => token.slice(token.lastIndexOf("/") + 1), custom: async (_, executeCommand, generatorContext) => { const { isDangerous, currentWorkingDirectory, searchTerm } = generatorContext; const currentInsertedDirectory = getCurrentInsertedDirectory( rootDirectory ?? currentWorkingDirectory, searchTerm, generatorContext ) ?? "/"; try { const data = await executeCommand({ command: "ls", args: ["-1ApL"], cwd: currentInsertedDirectory, }); const sortedFiles = sortFilesAlphabetically(data.stdout.split("\n"), [".DS_Store"]); const generatorOutputArray: Fig.TemplateSuggestion[] = []; // Then loop through them and add them to the generatorOutputArray // depending on the template type for (const name of sortedFiles) { if (name) { const templateType = name.endsWith("/") ? "folders" : "filepaths"; if ( (templateType === "filepaths" && showFolders !== "only") || (templateType === "folders" && showFolders !== "never") ) { generatorOutputArray.push({ type: templateType === "filepaths" ? "file" : "folder", name, insertValue: name, isDangerous, context: { templateType }, }); } } } // Filter suggestions. This takes in the array of suggestions, filters it, // and outputs an array of suggestions return postProcessSuggestions(filterSuggestions(generatorOutputArray)); } catch (err) { return []; } }, }; } export const folders = Object.assign( () => filepathsFn({ showFolders: "only" }), Object.freeze(filepathsFn({ showFolders: "only" })) ); export const filepaths = Object.assign(filepathsFn, Object.freeze(filepathsFn())); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/src/keyvalue.ts000066400000000000000000000261271471722043300316240ustar00rootroot00000000000000/** Suggestions to be displayed for keys or values */ export type KeyValueSuggestions = | string[] | Fig.Suggestion[] | NonNullable; /** @deprecated use `KeyValueSuggestions` */ export type Suggestions = KeyValueSuggestions; export type CacheValue = boolean | "keys" | "values"; export interface ValueListInit { /** String to use as the separator between keys and values */ delimiter?: string; /** List of suggestions */ values?: KeyValueSuggestions; /** Cache key and value suggestions */ cache?: boolean; /** Insert the delimiter string after accepting a suggestion (default: false) */ insertDelimiter?: boolean; /** Don't filter repeated values from suggestions (default: false) */ allowRepeatedValues?: boolean; } export interface KeyValueInit { /** String to use as the separator between keys and values */ separator?: string; /** List of key suggestions */ keys?: KeyValueSuggestions; /** List of value suggestions */ values?: KeyValueSuggestions; /** Cache key and value suggestions */ cache?: CacheValue; /** Should the separator be inserted after a key? (default: true ) */ insertSeparator?: boolean; } export interface KeyValueListInit { /** String to use as the separator between keys and values */ separator?: string; /** String to use as the separator between key-value pairs */ delimiter?: string; /** List of key suggestions */ keys?: KeyValueSuggestions; /** List of value suggestions */ values?: KeyValueSuggestions; /** Cache key and value suggestions */ cache?: CacheValue; /** Should the separator be inserted after a key? (default: true ) */ insertSeparator?: boolean; /** Insert the delimiter string after accepting a value suggestion (default: false) */ insertDelimiter?: boolean; /** Don't filter repeated keys from suggestions (default: false) */ allowRepeatedKeys?: boolean; /** Don't filter repeated values from suggestions (default: true) */ allowRepeatedValues?: boolean; } /** Cache of Fig suggestions using the string[]/Suggestion[]/function as a key */ const suggestionCache = new Map(); function appendToInsertValue(append: string, suggestions: Fig.Suggestion[]): Fig.Suggestion[] { if (append.length === 0) { return suggestions; } return suggestions.map((item) => item.insertValue ? item : { ...item, insertValue: item.name + append } ); } async function kvSuggestionsToFigSuggestions( suggestions: KeyValueSuggestions, append: string, init: Parameters> ): Promise { if (typeof suggestions === "function") { const out = await suggestions(...init); return appendToInsertValue(append, out); } if (typeof suggestions[0] === "string") { const out = (suggestions as string[]).map((name) => ({ name })); return appendToInsertValue(append, out); } return appendToInsertValue(append, suggestions as Fig.Suggestion[]); } async function getSuggestions( suggestions: KeyValueSuggestions, append: string, useSuggestionCache: boolean, init: Parameters> ): Promise { if (useSuggestionCache || Array.isArray(suggestions)) { let value = suggestionCache.get(suggestions); if (value === undefined) { value = await kvSuggestionsToFigSuggestions(suggestions, append, init); suggestionCache.set(suggestions, value); } return value; } return kvSuggestionsToFigSuggestions(suggestions, append, init); } function shouldUseCache(isKey: boolean, cache: CacheValue) { if (typeof cache === "string") { return (isKey && cache === "keys") || (!isKey && cache === "values"); } return cache; } /** Get the final index of any of the strings */ function lastIndexOf(haystack: string, ...needles: readonly string[]) { return Math.max(...needles.map((needle) => haystack.lastIndexOf(needle))); } function removeRepeatSuggestions( alreadyUsed: string[], suggestions: readonly Fig.Suggestion[] ): Fig.Suggestion[] { const seen = new Set(alreadyUsed); return suggestions.filter((suggestion) => { if (typeof suggestion.name === "string") { return !seen.has(suggestion.name); } return !suggestion.name?.some((name) => seen.has(name)); }); } /** * Create a generator that gives suggestions for val,val,... arguments. You * can use a `string[]` or `Fig.Suggestion[]` for the values. * * You can set `cache: true` to enable caching results. The suggestions are cached * globally using the function as a key, so enabling caching for any one generator * will set the cache values for the functions for the entire spec. This behavior * can be used to compose expensive generators without incurring a cost every time * they're used. * * The primary use of this is to enable the same caching behavior as `keyValue` * and `keyValueList`. If your goal is to create a $PATH-like value, use a generator * object literal: `{ template: "filepaths", trigger: ":", getQueryTerm: ":" }` */ export function valueList({ delimiter = ",", values = [], cache = false, insertDelimiter = false, allowRepeatedValues = false, }: ValueListInit): Fig.Generator { return { trigger: (newToken, oldToken) => newToken.lastIndexOf(delimiter) !== oldToken.lastIndexOf(delimiter), getQueryTerm: (token) => token.slice(token.lastIndexOf(delimiter) + delimiter.length), custom: async (...init) => { const out = await getSuggestions(values, insertDelimiter ? delimiter : "", cache, init); if (allowRepeatedValues) { return out; } const [tokens] = init; const valuesInList = tokens[tokens.length - 1]?.split(delimiter); return removeRepeatSuggestions(valuesInList, out); }, }; } /** * Create a generator that gives suggestions for key=value arguments. You * can use a `string[]` or `Fig.Suggestion[]` for the keys and values, or a * function with the same signature as `Fig.Generator["custom"]`. * * You can set `cache: true` to enable caching results. The suggestions are cached * globally using the function as a key, so enabling caching for any one generator * will set the cache values for the functions for the entire spec. This behavior * can be used to copmpose expensive key/value generators without incurring the * initial cost every time they're used. * * Note that you should only cache generators that produce the same output regardless * of their input. You can cache either the keys or values individually using `"keys"` * or `"values"` as the `cache` property value. * * @example * * ```typescript * // set-values a=1 b=3 c=2 * const spec: Fig.Spec = { * name: "set-values", * args: { * name: "values", * isVariadic: true, * generators: keyValue({ * keys: ["a", "b", "c"], * values: ["1", "2", "3"], * }), * }, * } * ``` * * @example The separator between keys and values can be customized (default: `=`) * * ```typescript * // key1:value * keyValue({ * separator: ":", * keys: [ * { name: "key1", icon: "fig://icon?type=string" }, * { name: "key2", icon: "fig://icon?type=string" }, * ], * }), * ``` */ export function keyValue({ separator = "=", keys = [], values = [], cache = false, insertSeparator = true, }: KeyValueInit): Fig.Generator { return { trigger: (newToken, oldToken) => newToken.indexOf(separator) !== oldToken.indexOf(separator), getQueryTerm: (token) => token.slice(token.indexOf(separator) + 1), custom: async (...init) => { const [tokens] = init; const finalToken = tokens[tokens.length - 1]; const isKey = !finalToken.includes(separator); const suggestions = isKey ? keys : values; const useCache = shouldUseCache(isKey, cache); const append = isKey ? (insertSeparator ? separator : "") : ""; return getSuggestions(suggestions, append, useCache, init); }, }; } /** * Create a generator that gives suggestions for `k=v,k=v,...` arguments. You * can use a `string[]` or `Fig.Suggestion[]` for the keys and values, or a * function with the same signature as `Fig.Generator["custom"]` * * You can set `cache: true` to enable caching results. The suggestions are cached * globally using the function as a key, so enabling caching for any one generator * will set the cache values for the functions for the entire spec. This behavior * can be used to copmpose expensive key/value generators without incurring the * initial cost every time they're used. * * Note that you should only cache generators that produce the same output regardless * of their input. You can cache either the keys or values individually using `"keys"` * or `"values"` as the `cache` property value. * * @example * * ```typescript * // set-values a=1,b=3,c=2 * const spec: Fig.Spec = { * name: "set-values", * args: { * name: "values", * generators: keyValueList({ * keys: ["a", "b", "c"], * values: ["1", "2", "3"], * }), * }, * } * ``` * * @example * * The separator between keys and values can be customized. It's `=` by * default. You can also change the key/value pair delimiter, which is `,` * by default. * * ```typescript * // key1:value&key2:another * keyValueList({ * separator: ":", * delimiter: "&" * keys: [ * { name: "key1", icon: "fig://icon?type=string" }, * { name: "key2", icon: "fig://icon?type=string" }, * ], * }), * ``` */ export function keyValueList({ separator = "=", delimiter = ",", keys = [], values = [], cache = false, insertSeparator = true, insertDelimiter = false, allowRepeatedKeys = false, allowRepeatedValues = true, }: KeyValueListInit): Fig.Generator { return { trigger: (newToken, oldToken) => { const newTokenIdx = lastIndexOf(newToken, separator, delimiter); const oldTokenIdx = lastIndexOf(oldToken, separator, delimiter); return newTokenIdx !== oldTokenIdx; }, getQueryTerm: (token) => { const index = lastIndexOf(token, separator, delimiter); return token.slice(index + 1); }, custom: async (...init) => { const [tokens] = init; const finalToken = tokens[tokens.length - 1]; const index = lastIndexOf(finalToken, separator, delimiter); const isKey = index === -1 || finalToken.slice(index, index + separator.length) !== separator; const suggestions = isKey ? keys : values; const useCache = shouldUseCache(isKey, cache); const append = isKey ? (insertSeparator ? separator : "") : insertDelimiter ? delimiter : ""; const out = await getSuggestions(suggestions, append, useCache, init); if (isKey) { if (allowRepeatedKeys) { return out; } const existingKeys = finalToken .split(delimiter) .map((chunk) => chunk.slice(0, chunk.indexOf(separator))); return removeRepeatSuggestions(existingKeys, out); } if (allowRepeatedValues) { return out; } const existingValues = finalToken .split(delimiter) .map((chunk) => chunk.slice(chunk.indexOf(separator) + separator.length)); return removeRepeatSuggestions(existingValues, out); }, }; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/src/resolve.ts000066400000000000000000000021341471722043300314460ustar00rootroot00000000000000export const ensureTrailingSlash = (str: string) => (str.endsWith("/") ? str : `${str}/`); const replaceTilde = (path: string, homeDir: string) => { if (path.startsWith("~") && (path.length === 1 || path.charAt(1) === "/")) { return path.replace("~", homeDir); } return path; }; const replaceVariables = (path: string, environmentVariables: Record) => { // Replace simple $VAR variables const resolvedSimpleVariables = path.replace(/\$([A-Za-z0-9_]+)/g, (key) => { const envKey = key.slice(1); return environmentVariables[envKey] ?? key; }); // Replace complex ${VAR} variables const resolvedComplexVariables = resolvedSimpleVariables.replace( /\$\{([A-Za-z0-9_]+)(?::-([^}]+))?\}/g, (match, envKey, defaultValue) => environmentVariables[envKey] ?? defaultValue ?? match ); return resolvedComplexVariables; }; export const shellExpand = (path: string, context: Fig.ShellContext): string => { const { environmentVariables } = context; return replaceVariables( replaceTilde(path, environmentVariables?.HOME ?? "~"), environmentVariables ); }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/test/000077500000000000000000000000001471722043300276075ustar00rootroot00000000000000filepaths.test.ts000066400000000000000000000361051471722043300330420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/test// import { filepaths, FilepathsOptions, folders } from ".."; import { describe, expect, it } from "vitest"; import { getCurrentInsertedDirectory, sortFilesAlphabetically } from "../src/filepaths"; // import { testQueryTerm, testTrigger } from "./keyvalue.test"; // function toName(suggestion: Fig.Suggestion): string { // return suggestion.name as string; // } const defaultHome = "/home/user"; const defaultCwd = `${defaultHome}/current_cwd`; const defaultContext: Fig.GeneratorContext = { searchTerm: "", currentWorkingDirectory: defaultCwd, currentProcess: "zsh", sshPrefix: "", environmentVariables: { HOME: defaultHome, }, }; const defaultContextWithEnv = (env: Record) => ({ ...defaultContext, environmentVariables: { ...defaultContext.environmentVariables, ...env, }, }); describe("Test getCurrentInsertedDirectory", () => { it("returns root for null cwd", () => { expect(getCurrentInsertedDirectory(null, "foo/", defaultContext)).to.equal("/"); }); it("returns merged path when both cwd and search term are specified", () => { expect(getCurrentInsertedDirectory(defaultCwd, "test/", defaultContext)).to.equal( `${defaultCwd}/test/` ); }); it("returns partial path when trailing slash is missing (1)", () => { expect(getCurrentInsertedDirectory(defaultCwd, "src/packages", defaultContext)).to.equal( `${defaultCwd}/src/` ); }); it("returns partial path when trailing slash is missing (2)", () => { expect(getCurrentInsertedDirectory(defaultCwd, "src", defaultContext)).to.equal( `${defaultCwd}/` ); }); it("returns the entire search term if it is an absolute path relative to ~", () => { expect( getCurrentInsertedDirectory(defaultCwd, "~/some_dir/src/test/", defaultContext) ).to.equal(`${defaultHome}/some_dir/src/test/`); }); it("returns the entire search term if it is an absolute path relative to /", () => { expect(getCurrentInsertedDirectory(defaultCwd, "/etc/bin/tool", defaultContext)).to.equal( "/etc/bin/" ); }); it("returns the path with $HOME resolved", () => { expect(getCurrentInsertedDirectory(defaultCwd, "$HOME/src/test/", defaultContext)).to.equal( `${defaultHome}/src/test/` ); }); it("returns the path with $DIR resolved", () => { expect( getCurrentInsertedDirectory( defaultCwd, "$DIR/src/test/", defaultContextWithEnv({ DIR: "/tmp/folder", }) ) ).to.equal("/tmp/folder/src/test/"); }); it("returns the path with $DIR and $HOME resolved", () => { expect( getCurrentInsertedDirectory( defaultCwd, "$HOME/src/$DIR/test/", defaultContextWithEnv({ DIR: "tmp/folder", }) ) ).to.equal(`${defaultHome}/src/tmp/folder/test/`); }); it("returns the path when just $HOME is specified", () => { expect(getCurrentInsertedDirectory(defaultHome, "$HOME", defaultContext)).to.equal("/home/"); }); it("returns the path when $DIR is not specified", () => { expect(getCurrentInsertedDirectory(defaultCwd, "$DIR", defaultContext)).to.equal( `${defaultCwd}/` ); }); it("returns the path with the complex $DIR and $HOME resolved", () => { expect( getCurrentInsertedDirectory( defaultCwd, // eslint-disable-next-line no-template-curly-in-string "${HOME}/src/${DIR}/test/", defaultContextWithEnv({ DIR: "tmp/folder", }) ) ).to.equal(`${defaultHome}/src/tmp/folder/test/`); }); it("returns the path with the complex $DIR and $HOME resolved with default", () => { expect( getCurrentInsertedDirectory( defaultCwd, // eslint-disable-next-line no-template-curly-in-string "${HOME:-/fallback}/src/${DIR:-fallback}/test/", defaultContext ) ).to.equal(`${defaultHome}/src/fallback/test/`); }); }); describe("Test sortFilesAlphabetically", () => { const files = ["a", "e", "z", "t", "m", "b", "x"]; it("should sort files alphabetically", () => { expect(sortFilesAlphabetically(files)).to.eql(["a", "b", "e", "m", "t", "x", "z", "../"]); }); it("should sort files alphabetically and put dotfiles/folders at the end", () => { expect(sortFilesAlphabetically([...files, ".g", ".l"])).to.eql([ "a", "b", "e", "m", "t", "x", "z", ".g", ".l", "../", ]); }); it("should sort files alphabetically and skip files in the skip array", () => { expect(sortFilesAlphabetically(files, ["b", "t"])).to.eql(["a", "e", "m", "x", "z", "../"]); }); }); // describe("Test filepaths generators", () => { // let currentCWD: string; // let executeCommandStub: sinon.SinonStub; // async function executeCommand(args: Fig.ExecuteCommandInput): Promise { // try { // return executeCommandStub(args); // } catch (err) { // return new Promise((resolve) => { // resolve({ // stdout: "", // stderr: "", // status: 1, // }); // }); // } // } // async function runFilepaths( // options: FilepathsOptions, // mockLSResults: string[], // context = defaultContext // ): Promise { // executeCommandStub.resolves(mockLSResults.join("\n")); // return (await filepaths(options).custom!([], executeCommand, context)).map(toName); // } // beforeEach(() => { // executeCommandStub = sinon.stub(); // // these steps are approximately the ones performed by the engine before running a generator // currentCWD = "~/current_cwd/"; // defaultContext.currentWorkingDirectory = currentCWD; // }); // afterEach(() => { // executeCommandStub.resetHistory(); // }); // after(() => { // sinon.reset(); // }); // describe("filepaths generator", () => { // describe("should trigger correctly", () => { // const test = testTrigger(filepaths); // test("", "", false); // test("", "a", false); // test("a", "aa", false); // test("aa", "aa", false); // test("a", "a/", true); // test("a/a", "a/ab", false); // test("a/ab", "a/abc", false); // test("a/ab", "/ab", true); // test("bar/ab", "foo/ab", true); // }); // describe("should return the correct query term", () => { // const test = testQueryTerm(filepaths); // test("", ""); // test("a", "a"); // test("abc", "abc"); // test("abc/", ""); // test("abc/d", "d"); // test("~/abc", "abc"); // test("/abc", "abc"); // }); // describe("should return filepaths suggestions", () => { // const suggestions = ["a/", "c/", "l", "x"]; // it("should show all suggestions when no options or search term is specified", async () => { // executeCommandStub.resolves(suggestions.join("\n")); // expect(await filepaths.custom!([], executeCommand, defaultContext)).to.eql( // [ // { insertValue: "a/", name: "a/", type: "folder", context: { templateType: "folders" } }, // { insertValue: "c/", name: "c/", type: "folder", context: { templateType: "folders" } }, // { insertValue: "l", name: "l", type: "file", context: { templateType: "filepaths" } }, // { insertValue: "x", name: "x", type: "file", context: { templateType: "filepaths" } }, // { // insertValue: "../", // name: "../", // type: "folder", // context: { templateType: "folders" }, // }, // ].map((x) => ({ ...x, isDangerous: undefined })) // ); // }); // it("should call executeCommand with specified user input dir", async () => { // const results = await runFilepaths({ rootDirectory: "/etc/" }, suggestions); // expect(executeCommand).to.have.been.calledWith( // "cd /etc/ && command ls -1ApL | cat", // undefined // ); // expect(results).to.eql(suggestions.concat("../")); // }); // it("should call executeCommand with specified user input dir and updated relative search term", async () => { // const results = await runFilepaths({ rootDirectory: "/etc/" }, suggestions, { // ...defaultContext, // searchTerm: "bin/n", // }); // expect(executeCommand).to.have.been.calledWith( // "cd /etc/bin/ && command ls -1ApL | cat", // undefined // ); // expect(results).to.eql(suggestions.concat("../")); // }); // it("should call executeCommand with specified user input dir and updated absolute search term", async () => { // const results = await runFilepaths({ rootDirectory: "/etc/" }, suggestions, { // ...defaultContext, // searchTerm: "/etc/bin/pin", // }); // expect(executeCommand).to.have.been.calledWith( // "cd /etc/bin/ && command ls -1ApL | cat", // undefined // ); // expect(results).to.eql(suggestions.concat("../")); // }); // }); // describe("should apply options correctly when they are specified", () => { // it("should suggest files containing a single-dotted extension", async () => { // const options: FilepathsOptions = { // extensions: ["js", "mjs"], // }; // const passing: string[] = [ // "file1.test.js", // "file2.js", // "file3.mjs", // "folder1.txt/", // "folder2.txt/", // "folder3/", // ]; // const failing: string[] = ["file4.ts"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(executeCommand).to.have.been.calledWith( // "cd ~/current_cwd/ && command ls -1ApL | cat", // undefined // ); // expect(results).to.eql(passing.concat("../")); // }); // it("should suggest files containing extensions with multiple dots", async () => { // const options: FilepathsOptions = { // extensions: ["test.js", "test.ts"], // }; // const passing: string[] = [ // "file.detail.test.js", // "file1.test.js", // "file2.test.ts", // "folder1.txt/", // "folder2.txt/", // "folder3/", // ]; // const failing: string[] = ["file.js", "file3.test.mjs", "file4.test.mts"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(results).to.eql(passing.concat("../")); // }); // describe("showFolders option", () => { // it("it should always suggest folders when no `showFolders` option is provided", async () => { // const options: FilepathsOptions = {}; // const passing: string[] = [ // "file1.test.js", // "file2.js", // "file3.mjs", // "file4.ts", // "folder1.txt/", // "folder2.txt/", // "folder3/", // ]; // const results = await runFilepaths(options, passing); // expect(results).to.eql(passing.concat("../")); // }); // it("it should not suggest folders when `showFolders` is 'never'", async () => { // const options: FilepathsOptions = { // showFolders: "never", // }; // const passing: string[] = ["file1.test.js", "file2.js", "file3.mjs", "file4.ts"]; // const failing: string[] = ["folder1.txt/", "folder2.txt/", "folder3/"]; // const results = await runFilepaths(options, passing.concat(failing)); // // NOTE: results won't have `../` // expect(results).to.eql(passing); // }); // it("it should suggest only folders when `showFolders` is 'only'", async () => { // const options: FilepathsOptions = { // showFolders: "only", // }; // const passing: string[] = ["folder1.txt/", "folder2.txt/", "folder3/"]; // const failing: string[] = ["file1.test.js", "file2.js", "file3.mjs", "file4.ts"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(results).to.eql(passing.concat("../")); // }); // }); // it("it should filter folders as if they were custom files when `filterFolders` is `true`", async () => { // const options: FilepathsOptions = { // filterFolders: true, // equals: ["package.json", "a-folder/"], // matches: /foo/g, // }; // const passing: string[] = ["a-folder/", "foo.js", "foo/", "package.json"]; // const failing: string[] = ["bar.js", "a-folder.js", "some-other-folder/"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(results).to.eql(passing); // }); // it("it should work correctly with 'matches'", async () => { // const options: FilepathsOptions = { // matches: /(file){1,2}\..*/g, // }; // const passing: string[] = ["file.mjs", "file1/", "filefile.js", "filefile.txt/"]; // const failing: string[] = ["file1.js"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(results).to.eql(passing.concat("../")); // }); // it("it should work correctly with 'equals'", async () => { // const options: FilepathsOptions = { // equals: ["foo.js", "bar.ts"], // }; // const passing: string[] = ["bar.ts", "bar.ts/", "folder/", "foo.js", "foo.js/", "foo.ts/"]; // const failing: string[] = ["foo.ts", "foo.js.ts"]; // const results = await runFilepaths(options, passing.concat(failing)); // expect(results).to.eql(passing.concat("../")); // }); // }); // it("it should sort suggestions returned form the `ls` command executed", async () => { // const options: FilepathsOptions = {}; // const passing: string[] = ["c/", "b/", "a/"]; // const expected: string[] = ["a/", "b/", "c/"]; // const results = await runFilepaths(options, passing); // expect(results).to.eql(expected.concat("../")); // }); // describe("deprecated sshPrefix", () => { // it("should call executeCommand with default user input dir ignoring ssh", async () => { // await filepaths.custom!([], executeCommand, { // ...defaultContext, // sshPrefix: "ssh -i blabla", // }); // expect(executeCommand).to.have.been.calledWith( // "cd ~/current_cwd/ && command ls -1ApL | cat", // undefined // ); // }); // }); // }); // describe("folders generator", () => { // it("should suggest only folders and no filepaths", async () => { // const passing: string[] = ["folder1.txt/", "folder2.txt/", "folder3/"]; // const failing: string[] = ["file1.test.js", "file2.js", "file3.mjs", "file4.ts"]; // executeCommandStub.resolves(passing.concat(failing).join("\n")); // const results = (await folders().custom!([], executeCommand, defaultContext)).map(toName); // expect(results).to.eql(passing.concat("../")); // }); // }); // }); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/test/hook.js000066400000000000000000000000001471722043300310730ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/test/keyvalue.test.ts000066400000000000000000000473451471722043300327770ustar00rootroot00000000000000import { describe, expect, it } from "vitest"; import { keyValue, keyValueList, valueList } from "../lib"; function testSuggestions( generator: Fig.Generator ): (token: string, expected: Fig.Suggestion[]) => Promise { return async (token, expected) => { const result = await generator.custom?.( ["spec", token], () => Promise.resolve({ status: 1, stderr: "", stdout: "", }), { searchTerm: "", currentProcess: "", currentWorkingDirectory: "", sshPrefix: "", environmentVariables: {}, } ); expect(result).to.deep.equal(expected); }; } export function testQueryTerm(gen: Fig.Generator): (token: string, expected: string) => void { const { getQueryTerm } = gen; expect(getQueryTerm).to.be.a("function"); // @ts-ignore return (token, expected) => expect(getQueryTerm(token)).to.equal(expected); } function triggerMsg(newToken: string, oldToken: string, expected: boolean) { if (expected) { return `Expected '${newToken}' -> '${oldToken}' to trigger, but it didn't`; } return `Didn't expect '${newToken}' -> '${oldToken}' to trigger, but it did`; } export function testTrigger( gen: Fig.Generator ): (newToken: string, oldToken: string, expected: boolean) => void { const { trigger } = gen; expect(trigger).to.be.a("function"); return (newToken, oldToken, expected) => // @ts-ignore expect(trigger(newToken, oldToken)).to.equal( expected, triggerMsg(newToken, oldToken, expected) ); } describe("Test valueList suggestions", () => { it("has the correct query term", () => { const test = testQueryTerm(valueList({})); test("", ""); test("value", "value"); test("value,", ""); test("value,val", "val"); }); it("triggers correctly", () => { const test = testTrigger(valueList({})); test("", "", false); test("", "a", false); test("value", "value,", true); test("value,", "value", true); test("value,", "value,v", false); test("value,v", "value,val", false); }); it("suggests values correctly", async () => { const test = testSuggestions( valueList({ values: ["1", "2", "3"], delimiter: "/", insertDelimiter: false, allowRepeatedValues: true, }) ); await test("", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("1", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("1/", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); it("can append the delimiter to values", async () => { const test = testSuggestions( valueList({ values: ["1", "2", "3"], delimiter: "/", insertDelimiter: true, }) ); await test("", [ { name: "1", insertValue: "1/" }, { name: "2", insertValue: "2/" }, { name: "3", insertValue: "3/" }, ]); }); it("runs functions", async () => { const test = testSuggestions( valueList({ values: () => Promise.resolve([{ name: "value" }]), }) ); await test("", [{ name: "value" }]); }); it("caches results", async () => { let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( valueList({ values: getValues, allowRepeatedValues: true, cache: true, }) ); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "value" }]); expect(getValuesCalled).to.be.equal(1); await test("value", [{ name: "value" }]); expect(getValuesCalled).to.be.equal(1); await test("value,", [{ name: "value" }]); expect(getValuesCalled).to.be.equal(1); await test("value,value,", [{ name: "value" }]); expect(getValuesCalled).to.be.equal(1); }); it("removes used values by default", async () => { const test = testSuggestions( valueList({ values: ["1", "2", "3"], }) ); await test("", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("1,", [{ name: "2" }, { name: "3" }]); await test("1,2", [{ name: "3" }]); }); it("can be configured to allow repeated values", async () => { const test = testSuggestions( valueList({ values: ["1", "2", "3"], allowRepeatedValues: true, }) ); await test("1,", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); }); describe("Test keyValue suggestions", () => { it("has the correct query term", () => { const test = testQueryTerm(keyValue({})); test("", ""); test("key", "key"); test("key=", ""); test("key=val", "val"); }); it("triggers correctly", () => { const test = testTrigger(keyValue({})); test("", "", false); test("", "a", false); test("key", "key=", true); test("key=", "key", true); test("key=", "key=v", false); test("key=val", "key=val=", false); }); it("suggests keys and values correctly", async () => { const test = testSuggestions( keyValue({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: ":", insertSeparator: false, }) ); await test("", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test(":", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key:", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key:val", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); it("can append the separator to keys", async () => { const test = testSuggestions( keyValue({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: ":", // The default behavior is to insert the separator // insertSeparator:false }) ); await test("", [ { name: "a", insertValue: "a:" }, { name: "b", insertValue: "b:" }, { name: "c", insertValue: "c:" }, ]); await test("key", [ { name: "a", insertValue: "a:" }, { name: "b", insertValue: "b:" }, { name: "c", insertValue: "c:" }, ]); // checking that the value suggestions don't have the separator await test(":", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key:", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key:val", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); it("runs functions", async () => { const test = testSuggestions( keyValue({ keys: () => Promise.resolve([{ name: "key" }]), values: () => Promise.resolve([{ name: "value" }]), separator: ":", insertSeparator: false, }) ); await test("", [{ name: "key" }]); await test("key", [{ name: "key" }]); await test(":", [{ name: "value" }]); await test("key:", [{ name: "value" }]); }); it("caches results", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValue({ keys: getKeys, values: getValues, cache: true, insertSeparator: false, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); }); it("can cache keys independently", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValue({ keys: getKeys, values: getValues, cache: "keys", insertSeparator: false, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(2); await test("key=val=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(3); }); it("can cache values independently", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValue({ keys: getKeys, values: getValues, cache: "values", insertSeparator: false, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(1); await test("key=val=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(1); }); }); describe("Test keyValueList suggestions", () => { it("has the correct query term", () => { const test = testQueryTerm(keyValueList({})); test("", ""); test("key", "key"); test("key=", ""); test("key=val", "val"); test(",abc", "abc"); test("key,abc", "abc"); test("key=,abc", "abc"); test("key=val,abc", "abc"); test("key=val,abc", "abc"); }); it("triggers correctly", () => { const test = testTrigger(keyValueList({})); test("", "", false); test("key", "ke", false); test("key", "key=", true); test("key=", "key", true); test("key=va", "key=val", false); test("key=val", "key=val,", true); test("key=val,", "key=val", true); }); it("suggests keys and values correctly", async () => { const test = testSuggestions( keyValueList({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: "=", delimiter: ",", insertSeparator: false, }) ); await test("", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("=", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key=", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key=val", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test(",", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key,", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key=value,", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key=,", [{ name: "a" }, { name: "b" }, { name: "c" }]); await test("key=value,key2=", [{ name: "1" }, { name: "2" }, { name: "3" }]); await test("key=value,=", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); it("removes used keys by default, but not values", async () => { const test = testSuggestions( keyValueList({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: "=", delimiter: ",", insertSeparator: false, }) ); await test("a=1,", [{ name: "b" }, { name: "c" }]); await test("a=1,b=", [{ name: "1" }, { name: "2" }, { name: "3" }]); }); it("can be configured to allow repeated keys", async () => { const test = testSuggestions( keyValueList({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: "=", delimiter: ",", insertSeparator: false, allowRepeatedKeys: true, }) ); await test("a=1,", [{ name: "a" }, { name: "b" }, { name: "c" }]); }); it("can be configured to disallow repeated values", async () => { const test = testSuggestions( keyValueList({ keys: ["a", "b", "c"], values: ["1", "2", "3"], separator: "=", delimiter: ",", insertSeparator: false, allowRepeatedValues: false, }) ); await test("a=1,b=", [{ name: "2" }, { name: "3" }]); }); it("can insert the separator and delimiter", async () => { const test = testSuggestions( keyValueList({ keys: ["a"], values: ["1"], separator: "=", delimiter: ",", insertSeparator: true, insertDelimiter: true, }) ); await test("", [{ name: "a", insertValue: "a=" }]); await test("key", [{ name: "a", insertValue: "a=" }]); await test("=", [{ name: "1", insertValue: "1," }]); await test("key=", [{ name: "1", insertValue: "1," }]); await test("key=val", [{ name: "1", insertValue: "1," }]); await test(",", [{ name: "a", insertValue: "a=" }]); await test("key,", [{ name: "a", insertValue: "a=" }]); await test("key=value,", [{ name: "a", insertValue: "a=" }]); await test("key=,", [{ name: "a", insertValue: "a=" }]); await test("key=value,key2=", [{ name: "1", insertValue: "1," }]); await test("key=value,=", [{ name: "1", insertValue: "1," }]); }); it("runs functions", async () => { const test = testSuggestions( keyValueList({ keys: () => Promise.resolve([{ name: "key" }]), values: () => Promise.resolve([{ name: "value" }]), separator: ":", insertSeparator: false, }) ); await test("", [{ name: "key" }]); await test("key", [{ name: "key" }]); await test(":", [{ name: "value" }]); await test("key:", [{ name: "value" }]); }); it("caches results", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValueList({ keys: getKeys, values: getValues, cache: true, insertSeparator: false, allowRepeatedKeys: true, allowRepeatedValues: true, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val,", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val,key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val,key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val,key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); }); it("can cache keys independently", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValueList({ keys: getKeys, values: getValues, cache: "keys", insertSeparator: false, allowRepeatedKeys: true, allowRepeatedValues: true, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(2); await test("key=val,", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(2); await test("key=val,key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(2); await test("key=val,key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(3); await test("key=val,key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(4); }); it("can cache values independently", async () => { let getKeysCalled = 0; const getKeys = async () => { getKeysCalled += 1; return [{ name: "key" }]; }; let getValuesCalled = 0; const getValues = async () => { getValuesCalled += 1; return [{ name: "value" }]; }; const test = testSuggestions( keyValueList({ keys: getKeys, values: getValues, cache: "values", insertSeparator: false, allowRepeatedKeys: true, allowRepeatedValues: true, }) ); expect(getKeysCalled).to.be.equal(0); expect(getValuesCalled).to.be.equal(0); await test("", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(1); expect(getValuesCalled).to.be.equal(0); await test("key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(0); await test("key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(1); await test("key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(2); expect(getValuesCalled).to.be.equal(1); await test("key=val,", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(3); expect(getValuesCalled).to.be.equal(1); await test("key=val,key", [{ name: "key" }]); expect(getKeysCalled).to.be.equal(4); expect(getValuesCalled).to.be.equal(1); await test("key=val,key=", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(4); expect(getValuesCalled).to.be.equal(1); await test("key=val,key=val", [{ name: "value" }]); expect(getKeysCalled).to.be.equal(4); expect(getValuesCalled).to.be.equal(1); }); }); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/test/tsconfig.json000066400000000000000000000001251471722043300323140ustar00rootroot00000000000000{ "extends": "../tsconfig.json", "include": ["./**/*.test.ts"], "exclude": [] }golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/generators/tsconfig.json000066400000000000000000000005601471722043300313400ustar00rootroot00000000000000{ "compilerOptions": { "target": "es6", "outDir": "lib/", "rootDir": "./", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": true, "types": ["@withfig/autocomplete-types", "node"] }, "exclude": ["node_modules/", "lib/", "test"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/000077500000000000000000000000001471722043300261215ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/.gitignore000066400000000000000000000000711471722043300301070ustar00rootroot00000000000000.DS_Store node_modules/ lib/ test/fixtures/**/output.jsongolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/LICENSE000066400000000000000000000020711471722043300271260ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/README.md000066400000000000000000000001761471722043300274040ustar00rootroot00000000000000# @fig/autocomplete-helpers package This package adds publicly accessible functions that are useful when creating Fig specs. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/index.ts000066400000000000000000000000401471722043300275720ustar00rootroot00000000000000export * from "./src/versions"; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/package.json000066400000000000000000000020571471722043300304130ustar00rootroot00000000000000{ "name": "@fig/autocomplete-helpers", "version": "1.0.7", "description": "Helper functions for fig completion specs", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "typings": "./dist/cjs/index.d.ts", "exports": { "require": "./dist/cjs/index.js", "import": "./dist/esm/index.js" }, "files": [ "dist/" ], "scripts": { "clean": "rm -rf dist/", "build": "pnpm clean && pnpm build:cjs && pnpm build:esm", "build:cjs": "tsc --declaration --outDir dist/cjs", "build:esm": "tsc --declaration --module esnext --outDir dist/esm", "prepack": "pnpm build", "test": "tsx test/index.ts && vitest --run" }, "author": "Fig Team", "dependencies": { "semver": "^7.6.3", "typescript": "^5.5.4" }, "devDependencies": { "@tsconfig/recommended": "^1.0.7", "@types/node": "^22.5.2", "@types/semver": "^7.5.8", "@withfig/autocomplete-types": "workspace:^", "prettier": "^3.3.3", "tsx": "^4.19.0", "vitest": "^2.1.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/src/000077500000000000000000000000001471722043300267105ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/src/versions.ts000066400000000000000000000203231471722043300311300ustar00rootroot00000000000000import semver from "semver"; const isPrimitive = (obj: unknown): boolean => obj !== Object(obj); const deepEqual = (a: T, b: T): boolean => { if (a === b) return true; if (isPrimitive(a) && isPrimitive(b)) return a === b; if (Object.keys(a as "object").length !== Object.keys(b as "object").length) return false; for (const key in a) { if (!(typeof b === "object" && b && key in b && deepEqual(a[key], b[key]))) { return false; } } return true; }; const diffSimpleObject = (original: T, updated: T): T => { const diff = { ...updated }; for (const key in diff) { if ( original && typeof original === "object" && key in original && deepEqual(original[key], updated[key]) ) { delete diff[key]; } } return diff; }; const mergeSimpleObject = (original: T, diff: Diff): T => ({ ...original, ...diff, }); const toArray = (x: T | T[] | undefined | null): T[] => { if (!x) { return []; } return Array.isArray(x) ? x : [x]; }; const namesMatch = (x: NamedObject, y: NamedObject): boolean => { const xNames = new Set(toArray(x.name)); return toArray(y.name).some((name) => xNames.has(name)); }; const isEmpty = (x: T): boolean => x === undefined || x === null || Object.keys(x).length === 0; type NamedObject = { name: string | string[]; }; type Remove = NamedObject & { remove: true }; const diffNamedArrays = ( previous: T[], updated: T[], diffFn: (p: T, u: T) => TDiff | null ) => { const diffs: Array = []; const matchedIndexes: Set = new Set(); updated.forEach((curr) => { const idx = previous.findIndex((prev, i) => !matchedIndexes.has(i) && namesMatch(curr, prev)); if (idx === -1) { diffs.push(curr); } else { matchedIndexes.add(idx); const diff = diffFn(previous[idx], curr); if (diff !== null && Object.keys(diff).length > 0) { diffs.push(diff); } } }); previous.forEach((prev, i) => { if (!matchedIndexes.has(i)) { diffs.push({ name: prev.name, remove: true }); } }); return diffs; }; const mergeNamedArrayDiff = ( current: T[], diffs: (TDiff | Remove)[], mergeFn: (current: T, diff: TDiff) => T | null ) => { const updated: T[] = []; const mergedIndexes: Set = new Set(); diffs.forEach((diff) => { const idx = current.findIndex((curr, i) => !mergedIndexes.has(i) && namesMatch(curr, diff)); if (idx === -1) { updated.push(diff as T); } else { mergedIndexes.add(idx); if (!("remove" in diff)) { const merged = mergeFn(current[idx], diff); if (merged !== null) { updated.push(merged); } } } }); current.forEach((curr, i) => { if (!mergedIndexes.has(i)) { updated.push(curr); } }); return updated; }; const diffOrderedArrays = ( previous: T[], updated: T[], diffFn: (p: T, u: T) => TDiff ) => { const diffs: (TDiff | { remove: true })[] = []; updated.forEach((curr, idx) => { const diff = diffFn(previous[idx], curr); diffs.push(diff); }); for (let i = diffs.length; i < previous.length; i += 1) { diffs.push({ remove: true }); } return diffs.every((diff) => isEmpty(diff)) ? [] : diffs; }; const mergeOrderedArrays = ( current: T[], diffs: (TDiff | { remove: true })[], mergeFn: (current: T, diff: TDiff) => T | null ) => diffs .filter( (diff): diff is TDiff => !(typeof diff === "object" && diff && "remove" in diff) || !diff.remove ) .map((diff, idx) => mergeFn(current[idx], diff)) .filter((merged): merged is T => merged !== null); type Diff = { [key in keyof T]?: unknown; }; type Processor = { diff: (t1: T, t2: T) => TDiff | null; merge: (t: T, tdiff: TDiff | null) => T; }; type ProcessorMapping = { [key in keyof T & keyof U]?: Processor; }; type IsDiff = U extends Diff ? U : never; const makeNamedProcessor = ( propertyMapping: ProcessorMapping ): Processor, T> => ({ diff: (previous, updated) => { const diff = { ...updated } as TDiff extends Diff ? TDiff : never; for (const key in diff) { if (key !== "name") { if (key in propertyMapping) { delete diff[key]; } else if (key in previous && deepEqual(previous[key], updated[key])) { delete diff[key]; } } } // eslint-disable-next-line guard-for-in for (const mapKey in propertyMapping) { // TODO: For some reason typescript can't infer the type well here... const key = mapKey as keyof typeof propertyMapping; const propDiff = previous[key] && updated[key] ? propertyMapping[key]?.diff(previous[key], updated[key]) : updated[key]; if (propDiff && !isEmpty(propDiff)) { diff[key] = propDiff; } } return Object.keys(diff).length === 1 ? null : diff; }, merge: (current, diff) => { if (diff === null) { return current; } const merged = { ...current, ...diff }; // eslint-disable-next-line guard-for-in for (const mapKey in propertyMapping) { // TODO: For some reason typescript can't infer the type well here... const key = mapKey as keyof typeof propertyMapping; const property = propertyMapping[key]; if (diff[key] && property !== undefined) { merged[key] = property.merge(current[key], diff[key]); } } return merged; }, }); const argArrayProcessor: Processor< Fig.ArgDiff | Fig.ArgDiff[] | undefined, Fig.Arg | Fig.Arg[] | undefined > = { diff: (p, u) => diffOrderedArrays(toArray(p), toArray(u), diffSimpleObject), merge: (c, d) => mergeOrderedArrays(toArray(c), toArray(d), mergeSimpleObject), }; const optionProcessor = makeNamedProcessor({ args: argArrayProcessor, }); const subcommandProcessor: Processor = makeNamedProcessor({ subcommands: { diff: (p, u) => diffNamedArrays(toArray(p), toArray(u), subcommandProcessor.diff), merge: (c, d) => mergeNamedArrayDiff(toArray(c), toArray(d), subcommandProcessor.merge), }, options: { diff: (p, u) => diffNamedArrays(toArray(p), toArray(u), optionProcessor.diff), merge: (c, d) => mergeNamedArrayDiff(toArray(c), toArray(d), optionProcessor.merge), }, args: argArrayProcessor, } as const); const getBestVersionIndex = (versions: string[], target?: string): number => { if (!target) return versions.length - 1; // find the last element minor or equal to the target for (let i = versions.length - 1; i >= 0; i -= 1) { const version = versions[i]; if (semver.compare(version, target) <= 0) { return i; } } return versions.length - 1; }; export const applySpecDiff = (spec: Fig.Subcommand, diff: Fig.SpecDiff): Fig.Subcommand => subcommandProcessor.merge(spec, { ...diff, name: spec.name }); export const diffSpecs = (original: Fig.Subcommand, updated: Fig.Subcommand): Fig.SpecDiff => { const result = subcommandProcessor.diff(original, updated); if (result === null) { return {}; } // eslint-disable-next-line @typescript-eslint/no-unused-vars const { name: _name, remove: _remove, ...remaining } = result; return remaining; }; export const getVersionFromVersionedSpec = ( base: Fig.Subcommand, versions: Fig.VersionDiffMap, target?: string ): { version: string; spec: Fig.Subcommand } => { const versionNames = Object.keys(versions).sort(semver.compare); const versionIndex = getBestVersionIndex(versionNames, target); const spec = versionNames .slice(0, versionIndex + 1) .map((name) => versions[name]) .reduce(applySpecDiff, base); return { spec, version: versionNames[versionIndex] }; }; export const createVersionedSpec = (specName: string, versionFiles: string[]): Fig.Spec => async (version?: string) => { const versionNames = versionFiles.sort(semver.compare); const versionFileIndex = getBestVersionIndex(versionNames, version); const versionFile = versionNames[versionFileIndex]; return { versionedSpecPath: `${specName}/${versionFile}`, version, }; }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/000077500000000000000000000000001471722043300271005ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/000077500000000000000000000000001471722043300307515ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/fig-cli/000077500000000000000000000000001471722043300322635ustar00rootroot00000000000000config.json000066400000000000000000000000361471722043300343430ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/fig-cli{ "targetVersion": "1.3.1" }expected.json000066400000000000000000001317371471722043300347140ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/fig-cli{ "spec": { "name": "fig", "description": "The CLI for Fig", "subcommands": [ { "name": "debug", "description": "Debug Fig", "subcommands": [ { "name": "app", "description": "Debug fig app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "build", "description": "Switch build", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "build", "suggestions": ["dev", "prod", "staging"] } }, { "name": "autocomplete-window", "description": "Toggle/set autocomplete window debug mode", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "mode", "isOptional": true, "suggestions": ["on", "off"] } }, { "name": "logs", "description": "Show fig debug logs", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "files", "isOptional": true } }, { "name": "ime", "description": "Fig input method editor", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "command", "suggestions": [ "install", "uninstall", "select", "deselect", "enable", "disable", "status", "register" ] } }, { "name": "prompt-accessibility", "description": "Prompt accessibility", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "sample", "description": "Sample fig process", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "unix-socket", "description": "Debug fig unix sockets", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "verify-codesign", "description": "Debug fig codesign verification", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "accessibility", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "action", "isOptional": true, "suggestions": ["refresh", "reset", "prompt", "open", "status"] } }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "settings", "description": "Customize appearance & behavior", "subcommands": [ { "name": "all", "description": "List all the settings", "options": [ { "name": ["-f", "--format"], "description": "Format of the output", "args": { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } }, { "name": "--version", "description": "Print version information" }, { "name": ["-r", "--remote"], "description": "List the remote settings" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "init", "description": "Reload the settings listener", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "docs", "description": "Get the settings documentation", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "open", "description": "Open the settings file", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "sync", "description": "Sync the current settings", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-f", "--format"], "description": "Format of the output", "args": { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } }, { "name": ["-d", "--delete"], "description": "Delete a value" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "key", "isOptional": true }, { "name": "value", "isOptional": true } ] }, { "name": "install", "description": "Install fig cli components", "options": [ { "name": "--daemon", "description": "Install only the daemon", "exclusiveOn": ["--input-method"] }, { "name": "--dotfiles", "description": "Install only the shell integrations", "exclusiveOn": ["--input-method"] }, { "name": "--input-method", "description": "Prompt input method installation", "exclusiveOn": ["--daemon", "--dotfiles"] }, { "name": "--ssh", "description": "Install only the ssh integration" }, { "name": "--no-confirm", "description": "Don't confirm automatic installation" }, { "name": "--force", "description": "Force installation of fig" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "ssh", "description": "Enable/disable fig SSH integration", "subcommands": [ { "name": "enable", "description": "Enable ssh integration", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "disable", "description": "Disable ssh integration", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "diagnostic", "description": "Run diagnostic tests", "options": [ { "name": ["-f", "--format"], "description": "The format of the output", "args": [ { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } ] }, { "name": "--force", "description": "Force limited diagnostic output" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "init", "description": "Generate the dotfiles for the given shell", "options": [ { "name": "--rcfile", "args": { "name": "rcfile", "isOptional": true } }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "shell", "suggestions": [ { "name": "bash", "description": "Bash shell" }, { "name": "zsh", "description": "Zsh shell" }, { "name": "fish", "description": "Fish shell" } ] }, { "name": "when", "suggestions": ["pre", "post"] } ], "hidden": true }, { "name": ["internal", "_"], "description": "Internal subcommands used for Fig", "hidden": true, "subcommands": [ { "name": "local-state", "description": "Change the local-state file", "subcommands": [ { "name": "all", "description": "List all the settings", "options": [ { "name": ["-f", "--format"], "args": { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } }, { "name": "--help", "description": "Print help information" }, { "name": "--version", "description": "Print version information" } ] }, { "name": "init", "description": "Reload the state listener", "options": [ { "name": "--help", "description": "Print help information" }, { "name": "--version", "description": "Print version information" } ] }, { "name": "open", "description": "Open the state file", "options": [ { "name": "--help", "description": "Print help information" }, { "name": "--version", "description": "Print version information" } ] } ], "options": [ { "name": ["-f", "--format"], "description": "Format of the output", "args": { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } }, { "name": "--version", "description": "Print version information" }, { "name": ["-d", "--delete"], "description": "Delete the state" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "key", "isOptional": true }, { "name": "value", "isOptional": true } ] }, { "name": "install", "description": "Install fig cli", "options": [ { "name": "--daemon", "description": "Install only the daemon", "exclusiveOn": ["--input-method"] }, { "name": "--dotfiles", "description": "Install only the shell integrations", "exclusiveOn": ["--input-method"] }, { "name": "--input-method", "description": "Prompt input method installation", "exclusiveOn": ["--daemon", "--dotfiles"] }, { "name": "--ssh", "description": "Install only the ssh integration" }, { "name": "--version", "description": "Print version information" }, { "name": "--no-confirm", "description": "Don't confirm automatic installation" }, { "name": "--force", "description": "Force installation of fig" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "uninstall", "description": "Uninstall fig cli", "options": [ { "name": "--ssh", "description": "Uninstall only the ssh integration" }, { "name": "--version", "description": "Print version information" }, { "name": "--daemon", "description": "Uninstall only the daemon" }, { "name": "--dotfiles", "description": "Uninstall only the shell integrations" }, { "name": "--binary", "description": "Uninstall only the binary" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "prompt-dotfiles-changed", "description": "Prompt the user that the dotfiles have changes Also use for `fig source` internals", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "callback", "description": "Callback used for the internal psudoterminal", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "handler-id" }, { "name": "filename", "isOptional": true }, { "name": "exit-code", "isOptional": true } ] }, { "name": "warn-user-when-uninstalling-incorrectly", "description": "Notify the user that they are uninstalling incorrectly", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "animation", "options": [ { "name": ["-f", "--filename"], "args": { "name": "filename", "isOptional": true } }, { "name": ["-r", "--rate"], "args": { "name": "rate", "isOptional": true } }, { "name": ["-b", "--before-text"], "args": { "name": "before-text", "isOptional": true } }, { "name": ["-a", "--after-text"], "args": { "name": "after-text", "isOptional": true } }, { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "get-shell", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "plugins", "subcommands": [ { "name": "list", "description": "List all plugins available in the plugin store", "options": [ { "name": ["-f", "--format"], "description": "The output format", "args": [ { "name": "format", "isOptional": true, "suggestions": [ { "name": "plain", "description": "Outputs the results as markdown" }, { "name": "json", "description": "Outputs the results as JSON" }, { "name": "json-pretty", "description": "Outputs the results as pretty print JSON" } ] } ] }, { "name": "--version", "description": "Print version information" }, { "name": ["-i", "--installed"], "description": "Only list plugins that are installed" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "sync", "description": "Sync the current plugins (this will not update plugins that are already installed)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "update", "description": "Update the installed plugins", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "add", "description": "Install a specific plugin from the plugin store", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "plugin" } }, { "name": "remove", "description": "Uninstall a specific plugin", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "plugin" } }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "man", "description": "Open manual page", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "command", "isOptional": true } }, { "name": "app", "description": "Interact with the desktop app", "subcommands": [ { "name": "install", "description": "Install the Fig app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "onboarding", "description": "Run the Fig tutorial again", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "running", "description": "Check if Fig is running", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "launch", "description": "Launch the Fig desktop app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "restart", "description": "Restart the Fig desktop app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "quit", "description": "Quit the Fig desktop app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "set-path", "description": "Set the internal psudo-terminal path", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "uninstall", "description": "Uninstall the Fig app", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "prompts", "description": "Prompts shown on terminal startup", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "hook", "description": "Hook commands", "hidden": true, "subcommands": [ { "name": "editbuffer", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "session-id" }, { "name": "integration" }, { "name": "tty" }, { "name": "pid" }, { "name": "histno" }, { "name": "cursor" }, { "name": "text" } ] }, { "name": "event", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "event-name" } }, { "name": "hide", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "init", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [{ "name": "pid" }, { "name": "tty" }] }, { "name": "integration-ready", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "integration" } }, { "name": "keyboard-focus-changed", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "app-identifier" }, { "name": "focused-session-id" } ] }, { "name": "pre-exec", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [{ "name": "pid" }, { "name": "tty" }] }, { "name": "prompt", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [{ "name": "pid" }, { "name": "tty" }] }, { "name": "ssh", "options": [ { "name": "--version", "description": "Print version information" }, { "name": "--prompt" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": [ { "name": "pid" }, { "name": "tty" }, { "name": "control-path" }, { "name": "remote-dest" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "tips", "description": "Enable/disable fig tips", "subcommands": [ { "name": "enable", "description": "Enable fig tips", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "disable", "description": "Disable fig tips", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "reset", "description": "Reset the tips to the default", "hidden": true, "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "prompt", "description": "Show the tips", "hidden": true, "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "options": [ { "name": "--version", "description": "Print version information" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "uninstall", "description": "Uninstall fig", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "update", "description": "Update dotfiles", "options": [ { "name": ["-y", "--no-confirm"], "description": "Force update" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "daemon", "description": "Run the daemon", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "source", "description": "Sync your latest dotfiles", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "theme", "description": "Get or set theme", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "theme", "isOptional": true } }, { "name": "invite", "description": "Invite friends to Fig", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "tweet", "description": "Tweet about Fig", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ], "icon": "fig://icon?type=twitter" }, { "name": "issue", "description": "Create a new Github issue", "options": [ { "name": ["-f", "--force"], "description": "Force issue creation" }, { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "description", "isOptional": true }, "icon": "fig://icon?type=github" }, { "name": "login", "description": "Login to Fig", "options": [ { "name": ["-r", "--refresh"], "description": "Manually refresh the auth token" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "logout", "description": "Logout of Fig", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "user", "description": "Details about the current user", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "doctor", "description": "Check Fig is properly configured", "options": [ { "name": "--verbose", "description": "Run all doctor tests, with no fixes" }, { "name": "--strict", "description": "Error on warnings" }, { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "completion", "description": "Generate the completion spec for Fig", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "shell", "isOptional": true, "suggestions": [ { "name": "bash", "description": "Bash shell compleations" }, { "name": "fish", "description": "Fish shell completions" }, { "name": "zsh", "description": "Zsh shell completions" }, { "name": "fig", "description": "Fig completion spec" } ] } }, { "name": "launch", "description": "Launch the Fig desktop app", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "quit", "description": "Quit the Fig desktop app", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "restart", "description": "Restart the Fig desktop app", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ], "args": { "name": "process", "isOptional": true, "suggestions": [ { "name": "daemon", "description": "Daemon process" }, { "name": "app", "description": "Fig process" } ] } }, { "name": "alpha", "description": "(LEGACY) Old way to launch mission control", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "onboarding", "description": "Run the Fig tutorial", "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "app:running", "description": "(LEGACY) Old hook that was being used somewhere", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "bg:ssh", "description": "(LEGACY) Old ssh hook that might be in ~/.ssh/config", "hidden": true, "options": [ { "name": ["-h", "--help"], "description": "Print help information" } ] }, { "name": "help", "description": "Print this message or the help of the given subcommand(s)", "args": { "name": "subcommand", "isOptional": true } } ], "options": [ { "name": ["-h", "--help"], "description": "Print help information" }, { "name": ["-V", "--version"], "description": "Print version information" } ] }, "version": "1.3.1" } spec/000077500000000000000000000000001471722043300331365ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/fig-cli1.0.0.js000066400000000000000000001351161471722043300341370ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/fixtures/fig-cli/specconst completion = { name: "fig", description: "The CLI for Fig", subcommands: [ { name: "app", description: "Interact with the desktop app", subcommands: [ { name: "install", description: "Install the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial again", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "running", description: "Check if Fig is running", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "set-path", description: "Set the internal psudo-terminal path", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall the Fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompts", description: "Prompts shown on terminal startup", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "hook", description: "Hook commands", hidden: true, subcommands: [ { name: "editbuffer", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "session-id", }, { name: "integration", }, { name: "tty", }, { name: "pid", }, { name: "histno", }, { name: "cursor", }, { name: "text", }, ], }, { name: "event", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "event-name", }, }, { name: "hide", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "integration-ready", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "integration", }, }, { name: "keyboard-focus-changed", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "app-identifier", }, { name: "focused-session-id", }, ], }, { name: "pre-exec", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "prompt", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, ], }, { name: "ssh", options: [ { name: "--version", description: "Print version information", }, { name: "--prompt", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "pid", }, { name: "tty", }, { name: "control-path", }, { name: "remote-dest", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "debug", description: "Debug Fig", subcommands: [ { name: "app", description: "Debug fig app", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "build", description: "Switch build", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "build", suggestions: ["dev", "prod", "staging"], }, }, { name: "autocomplete-window", description: "Toggle/set autocomplete window debug mode", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "logs", description: "Show fig debug logs", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "files", isOptional: true, }, }, { name: "ime", description: "Fig input method editor", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", suggestions: [ "install", "uninstall", "select", "deselect", "enable", "disable", "status", "register", ], }, }, { name: "prompt-accessibility", description: "Prompt accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sample", description: "Sample fig process", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "unix-socket", description: "Debug fig unix sockets", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "verify-codesign", description: "Debug fig codesign verification", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "shell-integrations", description: "Toggle shell integrations", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "mode", isOptional: true, suggestions: ["on", "off"], }, }, { name: "accessibility", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "action", isOptional: true, suggestions: ["refresh", "reset", "prompt", "open", "status"], }, }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "settings", description: "Customize appearance & behavior", subcommands: [ { name: "init", description: "Reload the settings listener", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "docs", description: "Get the settings documentation", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "open", description: "Open the settings file", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "sync", description: "Sync the current settings", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-d", "--delete"], description: "Delete", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "tips", description: "Enable/disable fig tips", subcommands: [ { name: "enable", description: "Enable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable fig tips", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "reset", description: "Reset the tips to the default", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "prompt", description: "Show the tips", hidden: true, options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "install", description: "Install fig cli components", options: [ { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update dotfiles", options: [ { name: ["-y", "--no-confirm"], description: "Force update", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "daemon", description: "Run the daemon", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", description: "Run diagnostic tests", options: [ { name: ["-f", "--format"], description: "The format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--force", description: "Force limited diagnostic output", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "init", description: "Generate the dotfiles for the given shell", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "shell", suggestions: [ { name: "bash", description: "Bash shell", }, { name: "zsh", description: "Zsh shell", }, { name: "fish", description: "Fish shell", }, ], }, { name: "when", suggestions: ["pre", "post"], }, ], hidden: true, }, { name: "source", description: "Sync your latest dotfiles", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "theme", description: "Get or set theme", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "theme", isOptional: true, }, }, { name: "invite", description: "Invite friends to Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "tweet", description: "Tweet about Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], icon: "fig://icon?type=twitter", }, { name: "issue", description: "Create a new Github issue", options: [ { name: ["-f", "--force"], description: "Force issue creation", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "description", isOptional: true, }, icon: "fig://icon?type=github", }, { name: "login", description: "Login to Fig", options: [ { name: ["-r", "--refresh"], description: "Manually refresh the auth token", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "logout", description: "Logout of Fig", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "user", description: "Details about the current user", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "doctor", description: "Check Fig is properly configured", options: [ { name: "--verbose", description: "Run all doctor tests, with no fixes", }, { name: "--strict", description: "Error on warnings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "completion", description: "Generate the completion spec for Fig", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "shell", isOptional: true, suggestions: [ { name: "bash", description: "Bash shell compleations", }, { name: "fish", description: "Fish shell completions", }, { name: "zsh", description: "Zsh shell completions", }, { name: "fig", description: "Fig completion spec", }, ], }, }, { name: ["internal", "_"], description: "Internal subcommands used for Fig", hidden: true, subcommands: [ { name: "prompt-dotfiles-changed", description: "Prompt the user that the dotfiles have changes Also use for `fig source` internals", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "local-state", description: "Change the local-state file", subcommands: [ { name: "init", description: "Reload the state listener", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, { name: "open", description: "Open the state file", options: [ { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: "--version", description: "Print version information", }, { name: ["-d", "--delete"], description: "Delete the state", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "key", isOptional: true, }, { name: "value", isOptional: true, }, ], }, { name: "callback", description: "Callback used for the internal psudoterminal", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: [ { name: "handler-id", }, { name: "filename", isOptional: true, }, { name: "exit-code", isOptional: true, }, ], }, { name: "install", description: "Install fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Install only the daemon", exclusiveOn: ["--dotfiles"], }, { name: "--dotfiles", description: "Install only the shell integrations", }, { name: "--no-confirm", description: "Don't confirm automatic installation", }, { name: "--force", description: "Force installation of fig", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "uninstall", description: "Uninstall fig cli", options: [ { name: "--version", description: "Print version information", }, { name: "--daemon", description: "Uninstall only the daemon", }, { name: "--dotfiles", description: "Uninstall only the shell integrations", }, { name: "--binary", description: "Uninstall only the binary", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "warn-user-when-uninstalling-incorrectly", description: "Notify the user that they are uninstalling incorrectly", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "animation", options: [ { name: ["-f", "--filename"], args: { name: "filename", isOptional: true, }, }, { name: ["-r", "--rate"], args: { name: "rate", isOptional: true, }, }, { name: ["-b", "--before-text"], args: { name: "before-text", isOptional: true, }, }, { name: ["-a", "--after-text"], args: { name: "after-text", isOptional: true, }, }, { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "get-shell", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "launch", description: "Launch the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "quit", description: "Quit the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "restart", description: "Restart the Fig desktop app", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "process", isOptional: true, suggestions: [ { name: "daemon", description: "Daemon process", }, { name: "app", description: "Fig process", }, ], }, }, { name: "alpha", description: "(LEGACY) Old way to launch mission control", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "onboarding", description: "Run the Fig tutorial", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "plugins", subcommands: [ { name: "sync", description: "Sync the current plugins (this will not update plugins that are already installed)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "update", description: "Update the installed plugins", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "add", description: "Install a specific plugin from the plugin store", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "remove", description: "Uninstall a specific plugin", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "plugin", }, }, { name: "list", description: "List all plugins available in the plugin store", options: [ { name: ["-f", "--format"], description: "The output format", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-i", "--installed"], description: "Only list plugins that are installed", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "app:running", description: "(LEGACY) Old hook that was being used somewhere", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "bg:ssh", description: "(LEGACY) Old ssh hook that might be in ~/.ssh/config", hidden: true, options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, { name: ["-V", "--version"], description: "Print version information", }, ], }; const versions = {}; versions["1.3.0"] = {}; versions["1.3.1"] = { subcommands: [ { name: "debug", subcommands: [ { name: "shell-integrations", remove: true, }, ], }, { name: "settings", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--version", description: "Print version information", }, { name: ["-r", "--remote"], description: "List the remote settings", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: ["-d", "--delete"], description: "Delete a value", }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "ssh", description: "Enable/disable fig SSH integration", subcommands: [ { name: "enable", description: "Enable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "disable", description: "Disable ssh integration", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "help", description: "Print this message or the help of the given subcommand(s)", options: [ { name: "--version", description: "Print version information", }, { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "subcommand", isOptional: true, }, }, ], options: [ { name: ["-h", "--help"], description: "Print help information", }, ], }, { name: "diagnostic", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "init", options: [ { name: "--rcfile", args: { name: "rcfile", isOptional: true, }, }, ], }, { name: ["internal", "_"], subcommands: [ { name: "local-state", subcommands: [ { name: "all", description: "List all the settings", options: [ { name: ["-f", "--format"], args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, { name: "--help", description: "Print help information", }, { name: "--version", description: "Print version information", }, ], }, ], options: [ { name: ["-f", "--format"], description: "Format of the output", args: { name: "format", isOptional: true, suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, { name: "install", options: [ { name: "--daemon", exclusiveOn: ["--input-method"], }, { name: "--dotfiles", exclusiveOn: ["--input-method"], }, { name: "--input-method", description: "Prompt input method installation", exclusiveOn: ["--daemon", "--dotfiles"], }, { name: "--ssh", description: "Install only the ssh integration", }, ], }, { name: "uninstall", options: [ { name: "--ssh", description: "Uninstall only the ssh integration", }, ], }, ], }, { name: "plugins", subcommands: [ { name: "list", options: [ { name: ["-f", "--format"], args: { suggestions: [ { name: "plain", description: "Outputs the results as markdown", }, { name: "json", description: "Outputs the results as JSON", }, { name: "json-pretty", description: "Outputs the results as pretty print JSON", }, ], }, }, ], }, ], }, { name: "man", description: "Open manual page", options: [ { name: ["-h", "--help"], description: "Print help information", }, ], args: { name: "command", isOptional: true, }, }, ], }; exports.versions = versions; exports.completion = completion; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/index.ts000066400000000000000000000033611471722043300305620ustar00rootroot00000000000000import fs from "fs"; import path from "path"; import prettier from "prettier"; import { getVersionFromVersionedSpec } from "../src/versions"; const fixturesPath = path.join(__dirname, "fixtures"); const dirs = fs .readdirSync(fixturesPath, { withFileTypes: true }) .filter((file) => file.isDirectory() && file.name !== ".DS_Store"); async function runFixtures() { let hadErrors = false; for (const dir of dirs) { const fixtureDirPath = path.join(fixturesPath, dir.name); const specVersionPath = path.join(fixtureDirPath, "spec", "1.0.0.js"); const outputSpecPath = path.join(fixtureDirPath, "output.json"); // gitignored const expectedSpecPath = path.join(fixtureDirPath, "expected.json"); const configPath = path.join(fixtureDirPath, "config.json"); const { targetVersion } = JSON.parse(fs.readFileSync(configPath, "utf8")); // eslint-disable-next-line no-await-in-loop const importedModule = await import(specVersionPath); // note this is CJS // eslint-disable-next-line no-await-in-loop const outputSpec = await prettier.format( JSON.stringify( getVersionFromVersionedSpec( importedModule.completion, importedModule.versions, targetVersion ) ), { parser: "json" } ); fs.writeFileSync(outputSpecPath, outputSpec); if (process.env.OVERWRITE || !fs.existsSync(expectedSpecPath)) { fs.copyFileSync(outputSpecPath, expectedSpecPath); } else { const expectedSpec = fs.readFileSync(expectedSpecPath, { encoding: "utf8" }); if (expectedSpec !== outputSpec) { hadErrors = true; console.error(`- Fixture ${fixtureDirPath} is failing.`); } } } if (hadErrors) { process.exit(1); } } runFixtures(); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/test/versions.test.ts000066400000000000000000000025171471722043300323030ustar00rootroot00000000000000import { describe, it, expect } from "vitest"; import { createVersionedSpec } from "../src/versions"; type VersionedSpec = (version?: string) => unknown; describe("test createVersionedSpec", () => { it("test it returns the correct version when versions are correctly sorted", async () => { const versionedSpec = createVersionedSpec("fig", ["1.0.0", "2.0.0", "3.0.0"]) as VersionedSpec; expect(await versionedSpec()).toStrictEqual({ versionedSpecPath: "fig/3.0.0", version: undefined, }); expect(await versionedSpec("1.3.1")).toStrictEqual({ versionedSpecPath: "fig/1.0.0", version: "1.3.1", }); expect(await versionedSpec("2.0.0")).toStrictEqual({ versionedSpecPath: "fig/2.0.0", version: "2.0.0", }); }); it("test it returns the correct version when versions are NOT correctly sorted", async () => { const versionedSpec = createVersionedSpec("fig", ["2.0.0", "1.0.0", "3.0.0"]) as VersionedSpec; expect(await versionedSpec()).toStrictEqual({ versionedSpecPath: "fig/3.0.0", version: undefined, }); expect(await versionedSpec("1.3.1")).toStrictEqual({ versionedSpecPath: "fig/1.0.0", version: "1.3.1", }); expect(await versionedSpec("2.0.0")).toStrictEqual({ versionedSpecPath: "fig/2.0.0", version: "2.0.0", }); }); }); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/helpers/tsconfig.json000066400000000000000000000010171471722043300306270ustar00rootroot00000000000000{ "extends": "@tsconfig/recommended", "compilerOptions": { "lib": ["ESNext", "DOM"], "moduleResolution": "node", "esModuleInterop": true, "sourceMap": true, "allowSyntheticDefaultImports": true, "baseUrl": "./", "declaration": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "noUnusedParameters": true, "types": ["@withfig/autocomplete-types", "node"] }, "exclude": ["node_modules/", "dist/", "test/"], "include": ["./"], } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/000077500000000000000000000000001471722043300256025ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/.gitignore000066400000000000000000000000341471722043300275670ustar00rootroot00000000000000.DS_Store node_modules/ lib/golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/LICENSE000066400000000000000000000020711471722043300266070ustar00rootroot00000000000000MIT License Copyright (c) 2023 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/README.md000066400000000000000000000001351471722043300270600ustar00rootroot00000000000000# @fig/autocomplete-hooks package This package adds hooks to use in autocomplete components.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/index.ts000066400000000000000000000001341471722043300272570ustar00rootroot00000000000000import { useExecuteCommand } from "./src/useExecuteCommand"; export { useExecuteCommand }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/package.json000066400000000000000000000010711471722043300300670ustar00rootroot00000000000000{ "name": "@fig/autocomplete-hooks", "description": "Hooks for building autocomplete components", "version": "1.0.2", "author": "The Fig Team", "license": "MIT", "main": "lib/index.js", "types": "lib/index.d.ts", "files": [ "lib/" ], "scripts": { "build": "tsc" }, "dependencies": { "@withfig/api-bindings": "^0.30.5", "react": "^18.3.1" }, "devDependencies": { "@types/react": "^18.3.5", "@withfig/autocomplete-types": "workspace:^", "typescript": "^5.5.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/src/000077500000000000000000000000001471722043300263715ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/src/useExecuteCommand.ts000066400000000000000000000026671471722043300323720ustar00rootroot00000000000000import { Process } from "@withfig/api-bindings"; import { useEffect, useState } from "react"; type ExecuteCommandOutput = | { status: "loading"; } | { status: "success"; exitCode: number; stdout: string; stderr: string; } | { status: "error"; error: Error; }; export const useExecuteCommand = ( input: { command: string } | { args: string[] } ): ExecuteCommandOutput => { let executable: string; let args: string[]; if ("command" in input && input.command) { executable = "bash"; args = ["-c", input.command]; } else if ("args" in input && input.args.length > 0) { // eslint-disable-next-line prefer-destructuring executable = input.args[0]; args = input.args.slice(1); } else { throw new Error("Invalid input"); } const [output, setOutput] = useState({ status: "loading", }); useEffect(() => { Process.run({ executable, args, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore terminalSessionId: window?.globalTerminalSessionId, }) .then(({ exitCode, stderr, stdout }) => { setOutput({ status: "success", exitCode, stderr, stdout, }); }) .catch((error) => { setOutput({ status: "error", error, }); }); }, [executable, args]); return output; }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/hooks/tsconfig.json000066400000000000000000000005501471722043300303110ustar00rootroot00000000000000{ "compilerOptions": { "target": "es6", "outDir": "lib/", "rootDir": "./", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": true, "types": ["@withfig/autocomplete-types"] }, "exclude": ["node_modules/", "lib/", "test"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/000077500000000000000000000000001471722043300271655ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/000077500000000000000000000000001471722043300307715ustar00rootroot00000000000000CONTRIBUTING.md000066400000000000000000000005061471722043300331440ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse### Publishing new Versions Prereqs: - Create a ~/.pypirc ```toml [testpypi] username = __token__ password = ... ``` (Note that `__token__` is NOT a placeholder) - Setup required deps ```bash make bootstrap ``` 1. Bump the version in `setup.cfg` 2. `make build` 3. `make publish` ### Test the package Run `make test`.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/LICENSE000066400000000000000000000020441471722043300317760ustar00rootroot00000000000000MIT License Copyright (c) 2022 Fig Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/Makefile000066400000000000000000000002551471722043300324330ustar00rootroot00000000000000bootstrap: python3 -m pip install --upgrade twine python3 -m pip install --upgrade build test: python3 -m pytest build: python3 -m build publish: twine upload dist/*golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/README.md000066400000000000000000000016241471722043300322530ustar00rootroot00000000000000## Autogenerate Completions for CLI tools built with `argparse` This package generates [Fig completions](https://github.com/withfig/autocomplete) for CLI tools built with Python's built-in [argparse](https://docs.python.org/3/library/argparse.html) module. ### Installation Install the integration as a dependency using pip: ```bash pip install argparse-complete-fig ``` ### Usage ```python import argparse from argparse_complete_fig import add_completion_spec_command parser = argparse.ArgumentParser(prog='my-cli') # Call on your root-level parser for full completions add_completion_spec_command(parser) ``` Calling the `add_completion_spec_command` function will add a `--generate-fig-spec` argument to the parser. When your CLI is invoked with this flag it will print a Fig spec. To save your completion spec skeleton to a file, run the following: ```bash my-cli --generate-fig-spec > my-cli.ts ``` argparse_complete_fig/000077500000000000000000000000001471722043300352335ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse__init__.py000066400000000000000000000003141471722043300373420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/argparse_complete_figfrom .fig import GenerateFigSpecAction, generate_completion_spec, add_completion_spec_command __all__ = [ 'GenerateFigSpecAction', 'generate_completion_spec', 'add_completion_spec_command' ] fig.py000066400000000000000000000145121471722043300363550ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/argparse_complete_figimport json import argparse REPEATABLE_ACTIONS = ["extend", "append", "append_const", "count"] def get_arg_list(arg): if arg.nargs is None or arg.nargs == 1: return [{}] elif arg.nargs == argparse.OPTIONAL: return [{"isOptional": True}] elif arg.nargs == argparse.ZERO_OR_MORE: return [{"isOptional": True, "isVariadic": True}] elif arg.nargs == argparse.ONE_OR_MORE: return [{}, {"isOptional": True, "isVariadic": True}] elif isinstance(arg.nargs, int): return [{} for i in range(arg.nargs)] else: return [{"isOptional": True, "isVariadic": True}] def get_arg_names(arg, n=None): if n is None: n = len(get_arg_list(arg)) if isinstance(arg.metavar, tuple): return arg.metavar elif arg.metavar is not None: return (arg.metavar,) * n elif arg.dest != argparse.SUPPRESS: return (arg.dest,) * n return None def get_base_suggestion(arg): """Compute properties shared amongst Fig spec options and args.""" result = {} if arg.help is not None: if arg.help == argparse.SUPPRESS: result["hidden"] = True else: result["description"] = str(arg.help) elif arg.dest != argparse.SUPPRESS: result["description"] = str(arg.dest) return result def construct_args(arg, hooks, parser, add_descriptions = True): """Construct Fig arg array given an argparse argument.""" arg_hook = hooks.get("arg") # Construct common base_arg object base_arg = get_base_suggestion(arg) if not add_descriptions and "description" in base_arg: del base_arg["description"] if hasattr(arg.choices, '__iter__'): base_arg["suggestions"] = [str(a) for a in arg.choices] args = get_arg_list(arg) # Get names for each arg names = get_arg_names(arg, len(args)) if names is not None: for name, arg in zip(names, args): arg["name"] = str(name) # post process arg list for arg in args: if arg.get("isVariadic", False): arg["optionsCanBreakVariadicArg"] = True arg.update(base_arg) if arg_hook: arg_hook(arg, parser) return args def construct_option(arg, hooks, parser): """Construct Fig option given an argparse argument.""" option_args = construct_args(arg, hooks, parser, add_descriptions=False) if len(arg.option_strings) > 1: name = [str(name) for name in arg.option_strings] else: name = arg.option_strings[0] option = { "name": name, **get_base_suggestion(arg) } if hasattr(arg, "action") and arg.action in REPEATABLE_ACTIONS: option["isRepeatable"] = True if option_args: option["args"] = option_args if arg.required: option["isRequired"] = True option_hook = hooks.get("option") if option_hook: option_hook(option, parser) return option def construct_subcommand( parser, hooks=None, arg_filter=None, is_root=True ): """Construct Fig subcommand given an argparse parser.""" subcommands = [] options = [] args = [] subcommand = {} hooks = {} if hooks is None else hooks subcommand_hook = hooks.get("subcommand") if is_root: subcommand["name"] = parser.prog for arg in parser._actions: if arg_filter is not None and arg_filter(arg): continue if arg.nargs == argparse.PARSER: subcommand.update(get_base_suggestion(arg)) help_map = {a.dest: a.help for a in arg._choices_actions} nested_subcommands = {} for name, nested_parser in arg.choices.items(): if nested_parser in nested_subcommands: nested_subcommands[nested_parser]["name"].append(name) else: nested_subcommands[nested_parser] = { "name": [name], **construct_subcommand( nested_parser, hooks=hooks, arg_filter=arg_filter, is_root=False ), } if name in help_map and help_map[name] != argparse.SUPPRESS: nested_subcommands[nested_parser]["description"] = str(help_map[name]) for p, nested_subcommand in nested_subcommands.items(): if len(nested_subcommand["name"]) == 1: nested_subcommand["name"] = nested_subcommand["name"][0] if subcommand_hook: subcommand_hook(nested_subcommand, p) subcommands.append(nested_subcommand) elif arg.option_strings: options.append(construct_option(arg, hooks, parser)) else: args.extend(construct_args(arg, hooks, parser)) if subcommands: subcommand["subcommands"] = subcommands if options: subcommand["options"] = options if args: subcommand["args"] = args if is_root and subcommand_hook: subcommand_hook(subcommand, parser) return subcommand def generate_completion_spec( parser, hooks=None, arg_filter=None, tool="argparse_complete_fig" ): """Generate Fig spec file given a root ArgumentParser object.""" spec = construct_subcommand(parser, hooks, arg_filter) return f"""// Autogenerated by {tool} const completionSpec: Fig.Spec = {json.dumps(spec, indent=2)} export default completionSpec;""" class GenerateFigSpecAction(argparse.Action): def __init__( self, option_strings, help="Generate fig completion spec for this parser", *args, **kwargs, ): super(GenerateFigSpecAction, self).__init__( option_strings=option_strings, dest=argparse.SUPPRESS, default=argparse.SUPPRESS, help=help, nargs=0, ) def __call__(self, parser, namespace, values, option_string=None): def option_hook(option, _parser): if option["name"] == "--generate-fig-spec": option["priority"] = 0 hooks = {"option": option_hook} spec = generate_completion_spec(parser, hooks) print(spec) parser.exit() def add_completion_spec_command(parser): parser.add_argument("--generate-fig-spec", action=GenerateFigSpecAction) pyproject.toml000066400000000000000000000014241471722043300336270ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse[build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [project] name = "argparse_complete_fig" version = "1.0.1" authors = [{ name = "Fig Team", email = "hello@fig.io" }] maintainers = [{ name = "Sean Sullivan", email = "sean@fig.io" }] description = "Autogenerate completions for CLI tools built with argparse" readme = "README.md" requires-python = ">=3.5" license = { text = "MIT" } keywords = ["argparse", "fig", "cli", "completions", "terminal", "framework"] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent" ] [project.urls] "Bug Tracker" = "https://github.com/withfig/autocomplete-tools/issues" Homepage = "https://github.com/withfig/autocomplete-tools" golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/setup.py000077500000000000000000000000461471722043300325060ustar00rootroot00000000000000from setuptools import setup setup() golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/tests/000077500000000000000000000000001471722043300321335ustar00rootroot00000000000000test_fig.py000066400000000000000000000055631471722043300342430ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/argparse/testsimport argparse import pytest from argparse_complete_fig import fig import io from contextlib import redirect_stdout import sys ### Fixtures @pytest.fixture def case_1_fixture(): return '''// Autogenerated by argparse_complete_fig const completionSpec: Fig.Spec = { "name": "__main__.py", "options": [ { "name": [ "-h", "--help" ], "description": "show this help message and exit" }, { "name": "--output", "description": "Select output directory", "args": [ { "name": "O" }, { "isOptional": true, "isVariadic": true, "name": "O", "optionsCanBreakVariadicArg": true } ] }, { "name": "--sum", "description": "sum the integers (default: find the max)" } ], "args": [ { "name": "N", "description": "an integer for the accumulator" }, { "isOptional": true, "isVariadic": true, "name": "N", "optionsCanBreakVariadicArg": true, "description": "an integer for the accumulator" } ] } export default completionSpec;''' @pytest.fixture def case_2_fixture(): return '''// Autogenerated by argparse_complete_fig const completionSpec: Fig.Spec = { "name": "__main__.py", "options": [ { "name": [ "-h", "--help" ], "description": "show this help message and exit" }, { "name": [ "-f", "--file" ], "description": "yaml file to process", "args": [ { "name": "file" } ] }, { "name": "--generate-fig-spec", "description": "Generate fig completion spec for this parser", "priority": 0 } ] } export default completionSpec; ''' ### Test cases def test_cli_generate(case_1_fixture): parser = argparse.ArgumentParser(description="A root description") parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator') parser.add_argument('--output', dest='accumulate', metavar="O", type=str, nargs=argparse.ONE_OR_MORE, help="Select output directory") parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') assert fig.generate_completion_spec(parser) == case_1_fixture def test_case_2(case_2_fixture): parser = argparse.ArgumentParser(description='process yaml file.') parser.add_argument('-f', '--file', type=str, help='yaml file to process') fig.add_completion_spec_command(parser) f = io.StringIO() with redirect_stdout(f): def blank_fn(*args, **kwargs): pass exit = sys.exit sys.exit = blank_fn args = parser.parse_args(['--generate-fig-spec']) sys.exit = exit assert f.getvalue() == case_2_fixture golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/000077500000000000000000000000001471722043300304405ustar00rootroot00000000000000CONTRIBUTING.md000066400000000000000000000005571471722043300326210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement### Publishing new Versions Prereqs: - Create a ~/.pypirc ```toml [testpypi] username = __token__ password = ... ``` (Note that `__token__` is NOT a placeholder) - Install `twine` ```bash python3 -m pip install --upgrade twine ``` 1. Bump the version in `setup.cfg` 2. `python3 -m build` 3. `twine upload dist/*` ### Test the package Run `python3 -m pytest`.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/LICENSE000066400000000000000000000020441471722043300314450ustar00rootroot00000000000000MIT License Copyright (c) 2022 Fig Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/README.md000066400000000000000000000041131471722043300317160ustar00rootroot00000000000000## Autogenerate Completions for CLI tools built with `cement` This package generates [Fig completions](https://github.com/withfig/autocomplete) for CLI tools built on [Cement](https://builtoncement.com/). ### Installation Install the integration as a dependency using pip: ```bash pip install cement-complete-fig ``` ### Usage Choose one of the methods below to add the `generate-fig-spec` subcommand to the top level of your CLI tool. #### Method 1: Load as a Cement extension This package provides a [Cement extension](https://docs.builtoncement.com/core-foundation/extensions-1) for convenience called `'cement_complete_fig.ext.ext_complete_fig'` which can be loaded in any of the ways cited in the linked documentation. Repeated here for convenience you can do one of the following: 1. Add the extension to the `Meta` of your `App` object: ```python from cement import App class MyApp(App): class Meta: label = 'myapp' extensions = [ ..., 'cement_complete_fig.ext.ext_complete_fig' ] ``` 2. Manually load the extension before running your app: ```python from cement import App with App('myapp') as app: app.ext.load_extension('cement_complete_fig.ext.ext_complete_fig') app.run() ``` 3. Add the extension to your app configuration file (e.g. `.myapp.conf`): ```toml [myapp] exensions = cement_complete_fig.ext.ext_complete_fig ``` #### Method 2: Bind the controller manually You can also add the `GenerateFigSpecController` manually as a handler to your app: ```python from cement import App from cement_complete_fig import GenerateFigSpecController class MyApp(App): class Meta: label = 'myapp' handlers = [ ..., GenerateFigSpecController ] with MyApp() as app: app.run() ``` ### Generating the spec file Once you've added the integration you will have new subcommand nested under your base handler. When this subcommand is invoked it will print a Fig spec. To save your completion spec skeleton to a file, run the following: ```bash myapp generate-fig-spec > myapp.ts ``` cement_complete_fig/000077500000000000000000000000001471722043300343515ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement__init__.py000066400000000000000000000001331471722043300364570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/cement_complete_figfrom .fig import GenerateFigSpecController __all__ = [ 'GenerateFigSpecController', ] ext/000077500000000000000000000000001471722043300351515ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/cement_complete_fig__init__.py000066400000000000000000000000001471722043300372500ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/cement_complete_fig/extext_complete_fig.py000066400000000000000000000001561471722043300410420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/cement_complete_fig/extfrom .. import GenerateFigSpecController def load(app): app.handler.register(GenerateFigSpecController) fig.py000066400000000000000000000041101471722043300354640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/cement_complete_figfrom cement import Controller from argparse_complete_fig import generate_completion_spec class GenerateFigSpecController(Controller): class Meta: label = 'generate_fig_spec' stacked_on = 'base' stacked_type = 'nested' description = 'Generate a fig completion spec for this CLI tool' hide = True def _pre_argument_parsing(self): controller = self.app.controller meta_by_parser = {} for child in controller._controllers: commands = child._collect_commands() if commands: parent = controller._get_parser_parent_by_controller(child) for command in commands: command_parser = parent._name_parser_map.get( command['label'] ) meta_by_parser[command_parser] = { "meta": command, "type": "command" } if child._meta.stacked_type == "embedded": continue parser = controller._get_parser_by_controller(child) meta_by_parser[parser] = { "meta": child._meta.__dict__, "type": "controller" } def subcommand_hook(subcommand, parser): parser_meta = meta_by_parser.get(parser) if parser_meta is not None: meta = parser_meta["meta"] if meta.get("hide", False): subcommand["hidden"] = True if meta.get("description"): subcommand["description"] = meta["description"] if subcommand["name"] == "generate_fig_spec": subcommand["priority"] = 0 def arg_filter(arg): return arg.dest in ["__dispatch__", "__controller_namespace__"] hooks = {"subcommand": subcommand_hook} spec = generate_completion_spec( controller._parser, hooks, arg_filter, "cement_complete_fig" ) print(spec) def _default(self): pass pyproject.toml000066400000000000000000000015131471722043300332750ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement[build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [project] name = "cement_complete_fig" version = "1.0.0" authors = [{ name = "Fig Team", email = "hello@fig.io" }] maintainers = [{ name = "Sean Sullivan", email = "sean@fig.io" }] description = "Autogenerate completions for CLI tools built with cement" readme = "README.md" requires-python = ">=3.5" license = { text = "MIT" } keywords = ["cement", "fig", "cli", "completions", "terminal", "framework"] dependencies = [ "argparse_complete_fig", "cement" ] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent" ] [project.urls] "Bug Tracker" = "https://github.com/withfig/autocomplete-tools/issues" Homepage = "https://github.com/withfig/autocomplete-tools" golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cement/setup.py000066400000000000000000000000461471722043300321520ustar00rootroot00000000000000from setuptools import setup setup() golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/clap/000077500000000000000000000000001471722043300301045ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/clap/README.md000066400000000000000000000001631471722043300313630ustar00rootroot00000000000000See the integration source code in the [Clap](https://github.com/clap-rs/clap/tree/master/clap_complete_fig) repo. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/000077500000000000000000000000001471722043300302525ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/.gitignore000066400000000000000000000011641471722043300322440ustar00rootroot00000000000000__pycache__/ *.py[cod] *$py.class # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/CONTRIBUTING.md000066400000000000000000000005471471722043300324320ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click### Publishing new Versions Prereqs: - Create a ~/.pypirc ```toml [testpypi] username = __token__ password = ... ``` (Note that `__token__` is NOT a placeholder) - Install `twine` ```bash python3 -m pip install --upgrade twine ``` 1. Bump the version in `setup.cfg` 2. `python3 -m build` 3. `twine upload dist/*` ### Test the package Run `make test`.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/LICENSE000066400000000000000000000020441471722043300312570ustar00rootroot00000000000000MIT License Copyright (c) 2022 Fig Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/Makefile000066400000000000000000000000301471722043300317030ustar00rootroot00000000000000test: python3 -m pytestgolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/README.md000066400000000000000000000021771471722043300315400ustar00rootroot00000000000000## Autogenerate Completions for CLI tools built with `click` ### Add the integration to your CLI tool: ```bash pip install click_complete_fig ``` #### Add new subcommand to your CLI tool. - You must pass in the root level CLI. - The `add_completion_spec_command` function will add a new `generate-fig-spec` to the passed in `cli` ```python from click_complete_fig import fig @click.group() def cli(): pass fig.add_completion_spec_command(cli) ``` > NOTE: be sure to use `add_completion_spec_command` on a `@click.group` wrapped function and not on a `@click.command` wrapped one. > Links: https://click.palletsprojects.com/en/8.0.x/commands/#commands-and-groups You can now automatically generate the completion spec skeleton by running the following command: ```bash $CLI generate-fig-spec > $CLI.ts ``` #### Generate a completion spec without adding a command to the CLI ```python from click_complete_fig import fig @click.command() def cli(): pass fig.generate_completion_spec(cli) # Will print the spec as long as the .py script is run ``` > NOTE: this works both with `@click.group` and `@click.command` wrapped functions. click_complete_fig/000077500000000000000000000000001471722043300337755ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click__init__.py000066400000000000000000000000001471722043300360740ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/click_complete_figfig.py000066400000000000000000000100751471722043300351170ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/click_complete_figimport itertools import click import json import sys def add_completion_spec_command(cli): if isinstance(cli, click.Group): command = click.Command("generate-fig-spec", callback=lambda: print(generate_completion_spec(cli))) cli.add_command(command) else: sys.exit(""" Cannot add the completion spec command to an object which is not a `click.Group` instance. - If you are tring to add the command to a `click.Command` instance use `generate_completion_spec` or convert `click.Command` to a `click.Group` instance. - Useful links: https://click.palletsprojects.com/en/8.0.x/commands/#commands-and-groups """) def generate_completion_spec(cli): with click.Context(cli) as ctx: info = ctx.to_info_dict() out = generate_command(info["command"]) return get_template(out) def get_value(dict, keys): for key in keys: value = dict[key] if value: return value return None def flat_map(fn, iterables): return itertools.chain.from_iterable(map(fn, iterables)) def generate_options(option): opt = { "name": option["opts"], } if option["help"] and len(option["help"]) > 0: opt["description"] = option["help"] if option["required"]: opt["isRequired"] = True if option["multiple"]: opt["isRepeatable"] = True if not option["is_flag"]: opt["args"] = list(generate_args(option["type"], option["nargs"])) if len(option["secondary_opts"]) > 0: opt["exclusiveOn"] = option["secondary_opts"] inverse = opt.copy() inverse["name"] = option["secondary_opts"] inverse["exclusiveOn"] = opt["name"] return [ opt, inverse ] return [ opt ] # https://click.palletsprojects.com/en/8.0.x/parameters/ def generate_args(info, nargs): param_type = info["param_type"] arg = { "name": info.get("name", "argument") } if param_type == "Choice": arg["suggestions"] = info["choices"] elif param_type == "Tuple": return list(map(lambda raw: { "name": raw["name"] }, info["types"]) or []) elif param_type == "File": arg["template"] = "filepaths" elif param_type == "Path": templates = [] if info["dir_okay"]: templates.append("folders") if info["file_okay"]: templates.append("filepaths") if len(templates) > 0: arg["template"] = templates if not info["exists"]: arg["suggestCurrentToken"] = True if nargs == -1: arg["isVariadic"] = True nargs = 1 return [ arg ] * nargs def generate_command(command, integration_command_name="generate-fig-spec"): command_name = command.get("name", "") if command_name == integration_command_name: return None spec = { "name": command_name, } description = get_value(command, ["help", "short_help"]) if description and len(description) > 0: spec["description"] = description if command["deprecated"]: spec["deprecated"] = True if command["hidden"]: spec["hidden"] = True # get options raw_options = filter(lambda param: param["param_type_name"] == "option", command.get("params", [])) options = list(flat_map(lambda raw: generate_options(raw), raw_options) or []) if len(options) > 0: spec["options"] = options # get args raw_args = filter(lambda param: param["param_type_name"] == "argument", command.get("params", [])) args = list(flat_map(lambda raw: generate_args(raw["type"], raw["nargs"]), raw_args) or []) if len(args) > 0: spec["args"] = args # get subcommands subcommands = list(map(lambda raw: generate_command(raw), (command.get("commands", {})).values())) if len(subcommands) > 0: spec["subcommands"] = list(filter(lambda sub: sub != None, subcommands)) return spec def get_template(spec): return """ // Autogenerated by click_complete_fig const completionSpec: Fig.Spec = {} export default completionSpec; """.format(json.dumps(spec, indent=2))pyproject.toml000066400000000000000000000001241471722043300331040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click[build-system] requires = ["setuptools>=42"] build-backend = "setuptools.build_meta"golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/setup.cfg000066400000000000000000000013051471722043300320720ustar00rootroot00000000000000[metadata] name = click_complete_fig version = 1.1.1 author = Fig author_email = hello@fig.io description = Autogenerate Completions for CLI tools built with click long_description = file: README.md long_description_content_type = text/markdown license = MIT keywords = click, cli, completions, framework, terminal, fig url = https://github.com/withfig/autocomplete-tools project_urls = Bug Tracker = https://github.com/withfig/autocomplete-tools/issues classifiers = Programming Language :: Python :: 3 License :: OSI Approved :: MIT License Operating System :: OS Independent [options] packages = find: python_requires = >=3.6 install_requires= click [options.packages.find] where=. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/tests/000077500000000000000000000000001471722043300314145ustar00rootroot00000000000000test_fig.py000066400000000000000000000166161471722043300335250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/click/testsimport pytest from click_complete_fig import fig import click ### Fixtures @pytest.fixture def grouped_spec(): return ''' // Autogenerated by click_complete_fig const completionSpec: Fig.Spec = { "name": "fig", "options": [ { "name": [ "-r", "--root-option" ], "description": "Root option" }, { "name": [ "--help" ], "description": "Show this message and exit." } ], "args": [ { "name": "choice", "suggestions": [ "A", "B" ] } ], "subcommands": [ { "name": "command", "description": "Debug fig", "deprecated": true, "hidden": true, "options": [ { "name": [ "--help" ], "description": "Show this message and exit." } ] }, { "name": "command-with-args", "options": [ { "name": [ "--help" ], "description": "Show this message and exit." } ], "args": [ { "name": "text", "isVariadic": true }, { "name": "text" }, { "name": "text" }, { "name": "filename", "template": "filepaths" }, { "name": "text" }, { "name": "integer" }, { "name": "path", "template": [ "folders", "filepaths" ], "suggestCurrentToken": true }, { "name": "path", "template": [ "folders", "filepaths" ] } ] }, { "name": "command-with-options", "options": [ { "name": [ "-s", "--string-to-echo" ], "args": [ { "name": "text" } ] }, { "name": [ "--multiple" ], "isRepeatable": true }, { "name": [ "-r" ], "description": "Deprecated and required option", "isRequired": true }, { "name": [ "-c" ], "args": [ { "name": "choice", "suggestions": [ "A", "B" ] } ] }, { "name": [ "--arg-repeatable" ], "args": [ { "name": "text" }, { "name": "text" } ] }, { "name": [ "--shout" ], "exclusiveOn": [ "--no-shout" ] }, { "name": [ "--no-shout" ], "exclusiveOn": [ "--shout" ] }, { "name": [ "--help" ], "description": "Show this message and exit." } ] }, { "name": "nested-command", "description": "Nested", "options": [ { "name": [ "--help" ], "description": "Show this message and exit." } ], "subcommands": [ { "name": "double-nested-command", "description": "Double nested command", "options": [ { "name": [ "--help" ], "description": "Show this message and exit." } ], "args": [ { "name": "text" } ] } ] } ] } export default completionSpec; ''' @pytest.fixture def non_grouped_cli_spec(): return ''' // Autogenerated by click_complete_fig const completionSpec: Fig.Spec = { "name": "non-grouped-cli", "description": "Simple program that greets NAME for a total of COUNT times.", "options": [ { "name": [ "--count" ], "description": "Number of greetings.", "args": [ { "name": "integer" } ] }, { "name": [ "--name" ], "description": "The person to greet.", "args": [ { "name": "text" } ] }, { "name": [ "--help" ], "description": "Show this message and exit." } ] } export default completionSpec; ''' @pytest.fixture def add_completion_spec_command_to_non_grouped_cli_thrown_error(): return """ Cannot add the completion spec command to an object which is not a `click.Group` instance. - If you are tring to add the command to a `click.Command` instance use `generate_completion_spec` or convert `click.Command` to a `click.Group` instance. - Useful links: https://click.palletsprojects.com/en/8.0.x/commands/#commands-and-groups """ ### CLI Definitions #### Grouped Spec @click.group("fig") @click.option('-r', '--root-option', help="Root option", is_flag=True) @click.argument("choices", type=click.Choice(['A', 'B'])) def grouped_cli(): pass @grouped_cli.command("command", help="Debug fig", short_help="Debug", deprecated=True, hidden=True) def cmd(): pass @grouped_cli.group("nested-command", short_help="Nested") def nested_command(): pass @nested_command.command("double-nested-command", help="Double nested command") @click.argument("string") def double_nested_command(): pass @grouped_cli.command("command-with-options") @click.option('-s', '--string-to-echo') @click.option('--multiple', multiple=True, is_flag=True) @click.option('-r', required=True, help="Deprecated and required option", is_flag=True) @click.option('-c', type=click.Choice(['A', 'B'])) @click.option('--arg-repeatable', nargs=2) @click.option('--shout/--no-shout', default=False) def command_with_options(): pass @grouped_cli.command("command-with-args") @click.argument('string', nargs=-1) @click.argument('int', nargs=2) @click.argument('filename', type=click.File()) @click.argument('filename', type=click.Tuple([str, int])) @click.argument('filename', type=click.Path(dir_okay=True, file_okay=True)) @click.argument('filename', type=click.Path(dir_okay=True, file_okay=True, exists=True)) def command_with_args(): pass #### Non grouped Spec @click.command() @click.option('--count', default=1, help='Number of greetings.') @click.option('--name', prompt='Your name', help='The person to greet.') def non_grouped_cli(count, name): """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo(f"Hello {name}!") ### Test cases def test_grouped_cli_generate(grouped_spec): assert fig.generate_completion_spec(grouped_cli) == grouped_spec def test_non_grouped_cli_generate(non_grouped_cli_spec): assert fig.generate_completion_spec(non_grouped_cli) == non_grouped_cli_spec def test_add_completion_spec_command_to_grouped_cli(): try: fig.add_completion_spec_command(grouped_cli) except: assert False, f"An exception was raised" def test_add_completion_spec_command_to_non_grouped_cli( add_completion_spec_command_to_non_grouped_cli_thrown_error ): with pytest.raises(SystemExit) as err: fig.add_completion_spec_command(non_grouped_cli) assert str(err.value) == add_completion_spec_command_to_non_grouped_cli_thrown_error golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/000077500000000000000000000000001471722043300302535ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/LICENSE000066400000000000000000000020711471722043300312600ustar00rootroot00000000000000MIT License Copyright (c) 2022 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/README.md000066400000000000000000000010561471722043300315340ustar00rootroot00000000000000# Fig // Cobra CLI This Go package is Fig's integration with popular CLI framework [Cobra](https://cobra.dev/). See Fig's docs for how to integrate: [https://fig.io/docs/guides/autocomplete-for-teams/cobra](https://fig.io/docs/guides/autocomplete-for-teams/cobra) ### Contributors This integration was built by [Ethan Orlander](https://github.com/ethanOrlander/). Please see his repo for the original docs, git history, and additional customization information: [https://github.com/EthanOrlander/genFigSpec](https://github.com/EthanOrlander/genFigSpec). golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/fig.go000066400000000000000000000122321471722043300313470ustar00rootroot00000000000000package cobracompletefig import ( "fmt" "strings" ) type BaseSuggestion struct { displayName string description string isDangerous bool hidden bool } type SuggestionType int const ( FOLDER SuggestionType = iota FILE ARG SUBCOMMAND OPTION SPECIAL SHORTCUT ) type Suggestion struct { *BaseSuggestion name string suggestionType SuggestionType } type Names []string type Subcommand struct { *BaseSuggestion name Names subcommands Subcommands options Options args Args } type Subcommands []Subcommand type Options []Option type Args []Arg type Spec struct { *Subcommand name string } type Option struct { *BaseSuggestion name Names args Args isRequired bool isRepeatable bool isPersistent bool exclusiveOn []string dependsOn []string } type Arg struct { name string description string isDangerous bool suggestions []Suggestion //or maybe []string template []Template isVariadic bool isOptional bool isCommand bool isModule bool isScript bool defaultVal string //This is default in the fig spec, but that word is reserved in go } type Template int const ( FOLDERS Template = iota FILEPATHS ) func sanitize(str string) string { sanitized := str sanitized = strings.ReplaceAll(sanitized, "\"", "\\\"") sanitized = strings.ReplaceAll(sanitized, "'", "\\'") sanitized = strings.ReplaceAll(sanitized, "\n", " ") return sanitized } func (names *Names) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, name := range *names { sb.WriteString(fmt.Sprintf(`"%v",`, name)) } sb.WriteString("]") return sb.String() } func (spec *Spec) ToTypescript() string { var sb strings.Builder sb.WriteString("const completionSpec: Fig.Spec = {") sb.WriteString(fmt.Sprintf(`name: "%v",`, spec.name)) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(spec.description))) if len(spec.subcommands) > 0 { sb.WriteString(fmt.Sprintf(`subcommands: %v,`, spec.subcommands.ToTypescript())) } if len(spec.options) > 0 { sb.WriteString(fmt.Sprintf(`options: %v,`, spec.options.ToTypescript())) } if len(spec.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, spec.args.ToTypescript())) } sb.WriteString("}; export default completionSpec;") return sb.String() } func (subcommands *Subcommands) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, subcommand := range *subcommands { sb.WriteString(fmt.Sprintf(`%v,`, subcommand.ToTypescript())) } sb.WriteString("]") return sb.String() } func (subcommand *Subcommand) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: %v,`, subcommand.name.ToTypescript())) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(subcommand.description))) if subcommand.hidden { sb.WriteString(fmt.Sprintf(`hidden: %t,`, subcommand.hidden)) } if len(subcommand.subcommands) > 0 { sb.WriteString(fmt.Sprintf(`subcommands: %v,`, subcommand.subcommands.ToTypescript())) } if len(subcommand.options) > 0 { sb.WriteString(fmt.Sprintf(`options: %v,`, subcommand.options.ToTypescript())) } if len(subcommand.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, subcommand.args.ToTypescript())) } sb.WriteString("}") return sb.String() } func (options *Options) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, option := range *options { sb.WriteString(fmt.Sprintf(`%v,`, option.ToTypescript())) } sb.WriteString("]") return sb.String() } func (option *Option) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: %v,`, option.name.ToTypescript())) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(option.description))) if option.isPersistent { sb.WriteString(fmt.Sprintf(`isPersistent: %t,`, option.isPersistent)) } if option.hidden { sb.WriteString(fmt.Sprintf(`hidden: %t,`, option.hidden)) } if option.isRepeatable { sb.WriteString(fmt.Sprintf(`isRepeatable: %t,`, option.isRepeatable)) } if option.displayName != "" { sb.WriteString(fmt.Sprintf(`displayName: "%v",`, sanitize(option.displayName))) } if len(option.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, option.args.ToTypescript())) } if option.isRequired { sb.WriteString(`isRequired: true,`) } sb.WriteString("}") return sb.String() } func (args *Args) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, arg := range *args { sb.WriteString(fmt.Sprintf(`%v,`, arg.ToTypescript())) } sb.WriteString("]") return sb.String() } func (arg *Arg) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: "%v",`, arg.name)) if arg.description != "" { sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(arg.description))) } if arg.defaultVal != "" { sb.WriteString(fmt.Sprintf(`default: "%v",`, arg.defaultVal)) } if len(arg.template) > 0 { sb.WriteString(`template: [`) for _, val := range arg.template { switch val { case FOLDERS: sb.WriteString(`"folders",`) case FILEPATHS: sb.WriteString(`"filepaths",`) } } sb.WriteString(`],`) } sb.WriteString("}") return sb.String() } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/go.mod000066400000000000000000000003251471722043300313610ustar00rootroot00000000000000module github.com/withfig/autocomplete-tools/integrations/cobra go 1.17 require ( github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 ) require github.com/inconshreveable/mousetrap v1.0.0 // indirect golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/go.sum000066400000000000000000002236711471722043300314210ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/cobra/main.go000066400000000000000000000121241471722043300315260ustar00rootroot00000000000000package cobracompletefig import ( "fmt" "strings" "github.com/spf13/cobra" "github.com/spf13/pflag" ) var includeHidden bool var figGenCmdUse string = "" var generateCommandArgs func(*cobra.Command) Args type Opts struct { Use string Short string Visible bool Long string commandArgGenerator func(*cobra.Command) Args } func CreateCompletionSpecCommand(options ...Opts) * cobra.Command { Use := "generate-fig-spec" Aliases := []string{"generateFigSpec", "genFigSpec"} Short := "Generate a fig spec" Hidden := true Long := ` Fig is a tool for your command line that adds autocomplete. This command generates a TypeScript file with the skeleton Fig autocomplete spec for your Cobra CLI. ` if len(options) > 0 { if options[0].Use != "" { Use = options[0].Use } if options[0].Short != "" { Short = options[0].Short } if options[0].Long != "" { Long = options[0].Long } if options[0].Visible { Hidden = false } if options[0].commandArgGenerator != nil { generateCommandArgs = options[0].commandArgGenerator } } figGenCmdUse = Use var cmd = &cobra.Command{ Use: Use, Aliases: Aliases, Short: Short, Hidden: Hidden, Long: Long, Run: func(cmd *cobra.Command, args []string) { root := cmd.Root() spec := GenerateCompletionSpec(root) fmt.Println(spec.ToTypescript()) }, } cmd.Flags().BoolVar( &includeHidden, "include-hidden", false, "Include hidden commands in generated Fig autocomplete spec") return cmd } func GenerateCompletionSpec(root *cobra.Command) Spec { opts := append(options(root.LocalNonPersistentFlags(), false), options(root.PersistentFlags(), true)...) opts = append(opts, makeHelpOption()) spec := Spec{ Subcommand: &Subcommand{ BaseSuggestion: &BaseSuggestion{ description: root.Short, }, options: opts, subcommands: append(subcommands(root, false, Options{}), makeHelpCommand(root)), // We assume CLI is using default help command args: commandArguments(root), }, name: root.Name(), } return spec } func subcommands(cmd *cobra.Command, overrideOptions bool, overrides Options) Subcommands { var subs []Subcommand for _, sub := range cmd.Commands() { if sub.Name() == "help" || (!includeHidden && sub.Hidden) || (sub.Use == figGenCmdUse) { continue } var opts Options if overrideOptions { opts = overrides } else { opts = append(options(sub.LocalNonPersistentFlags(), false), options(sub.PersistentFlags(), true)...) } subs = append(subs, Subcommand{ BaseSuggestion: &BaseSuggestion{ description: sub.Short, hidden: sub.Hidden, }, name: append(sub.Aliases, sub.Name()), options: opts, subcommands: subcommands(sub, overrideOptions, overrides), args: commandArguments(sub), }) } return subs } func isFlagRepeatable(flag *pflag.Flag) bool { return strings.Contains(flag.Value.Type(), "Slice") || strings.Contains(flag.Value.Type(), "Array") } func options(flagSet *pflag.FlagSet, persistent bool) []Option { var opts []Option attachFlags := func(flag *pflag.Flag) { option := Option{ BaseSuggestion: &BaseSuggestion{ description: flag.Usage, hidden: flag.Hidden, }, name: []string{fmt.Sprintf("--%v", flag.Name)}, isRepeatable: isFlagRepeatable(flag), } if flag.Shorthand != "" { option.name = append(option.name, fmt.Sprintf("-%v", flag.Shorthand)) } if persistent != false { option.isPersistent = true } requiredAnnotation, found := flag.Annotations[cobra.BashCompOneRequiredFlag] if found && requiredAnnotation[0] == "true" { option.isRequired = true } option.args = flagArguments(flag) opts = append(opts, option) } flagSet.VisitAll(attachFlags) return opts } /* * In Cobra, you only specify the number of arguments. * Not sure how we want to handle this (if at all) * https://github.com/spf13/cobra/blob/v1.2.1/user_guide.md#positional-and-custom-arguments */ func commandArguments(cmd *cobra.Command) []Arg { if generateCommandArgs != nil { return generateCommandArgs(cmd) } return []Arg{} } func flagArguments(flag *pflag.Flag) []Arg { var args []Arg defaultVal := flag.DefValue if defaultVal == "[]" { defaultVal = "" } if flag.Value.Type() != "bool" { arg := Arg{ name: flag.Name, defaultVal: defaultVal, } _, foundFilenameAnnotation := flag.Annotations[cobra.BashCompFilenameExt] if foundFilenameAnnotation { arg.template = append(arg.template, FILEPATHS) } _, foundDirectoryAnnotation := flag.Annotations[cobra.BashCompSubdirsInDir] if foundDirectoryAnnotation { arg.template = append(arg.template, FOLDERS) } args = append(args, arg) } return args } func makeHelpCommand(root *cobra.Command) Subcommand { return Subcommand{ BaseSuggestion: &BaseSuggestion{ description: "Help about any command", }, name: []string{"help"}, subcommands: subcommands(root, true, []Option{}), } } func makeHelpOption() Option { return Option{ BaseSuggestion: &BaseSuggestion{ description: fmt.Sprintf("Display help"), }, isPersistent: true, name: []string{"--help", "-h"}, } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/000077500000000000000000000000001471722043300311325ustar00rootroot00000000000000.gitignore000066400000000000000000000001071471722043300330410ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander.DS_Store node_modules/ lib/ # Fixture files test/fixtures/*/output.tsgolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/LICENSE000066400000000000000000000020601471722043300321350ustar00rootroot00000000000000MIT License Copyright (c) 2021 Federico Ciardi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. MIGRATION.md000066400000000000000000000013201471722043300327220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander# Migration docs ## @withfig/commander@1 to @fig/complete-commander@2 The first granted thing you can note is that we renamed the package to use the `@fig` namespace and a more significative name. This is not the only change occurred because we also changed the name, the signature, the options and the effects of the `generateFigSpec` function: - In v1 the main function was `generateFigSpec` while now it is named `generateCompletionSpec` - In v1 you had to specify a file as the destination of the spec while in v2 the spec gets returned as a `string` from `generateCompletionSpec`. - In v1 the name of the default command added to the commander program was `generateFigSpec` while in v2 it is `generate-fig-spec` golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/README.md000066400000000000000000000064461471722043300324230ustar00rootroot00000000000000# Commander integration A tool to speed up the workflow of converting [Commander](https://github.com/tj/commander.js) commands to [Fig](https://github.com/withfig/autocomplete) completion spec files. --- ## Docs ```ts generateCompletionSpec(command[, options]): string ``` Generate a completion spec from the provided command and return it a string. - `command`: a `commander.Command` object - [`options`](#options): an object containing the following optional properties: - [`figSpecCommandName`](#specify-the-fig-command-name): specify the name of the command used to generate the fig spec ([see](#custom-command)). It defaults to `'generate-fig-spec'` ```ts addCompletionSpecCommand(command): void ``` Add a new Subcommand to the provided command that will print a spec generated when invoked through `$CLI generate-fig-spec`. - `command`: a `commander.Command` object ## Usage Using this library is as simple as calling a function. The snippet of code below generates a new spec each time the executable file is run. ```js import { program } from 'commander' import { generateCompletionSpec } from '@fig/complete-commander' program .name('babel') .description('The compiler for writing next generation JavaScript') .version('7.16.0') .argument('', 'file to compile') // Do not generate if production env if (process.env.NODE_ENV === 'development') { const spec = generateCompletionSpec(program) // write the generated spec to a file or print it to the console } ``` ### Custom command You can also provide a custom command that generates a spec file when called. For example, the program below generates the Fig spec when `eslint generate-fig-spec` is run from a Terminal. ```js import { program } from 'commander' import { addCompletionSpecCommand } from '@fig/complete-commander' program .name('eslint') .description('Find and fix problems in your JavaScript code') .version('8.0.0') .argument('', 'file to lint') if (process.env.NODE_ENV === 'development') { addCompletionSpecCommand(program) } program.parse() ``` > _NOTE: the command can be called whatever you want, but if you specify a name different from `'generate-fig-spec'` you should set the [`figSpecCommandName`](#specify-the-fig-command-name) option._ ## Options for `generateCompletionSpec` ### Specify the fig command name When creating a [custom command](#custom-command) to generate a Fig spec whose name is different from `'generateCompletionSpec'` you want to avoid including it in the generated file. This option helps you do that. ```js program .name('eslint') .description('Find and fix problems in your JavaScript code') .version('8.0.0') .argument('', 'file to lint') if (process.env.NODE_ENV === 'development') { program .command('createSpec') // this command will not be included in the generated spec .description('Generate a fig spec') .action(() => { generateCompletionSpec(program, { figSpecCommandName: 'createSpec' }) }) } program.parse() ``` --- _p.s. this tool has been written for `commander@8`, but should work in the most of the previous versions too._ ## Contributors This integration was built by [Federico Ciardi](https://github.com/fedeci/). Please see his repo for previous git history: [https://github.com/fedeci/commander-to-fig](https://github.com/fedeci/commander-to-fig). package.json000066400000000000000000000022301471722043300333360ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander{ "name": "@fig/complete-commander", "version": "3.2.0", "description": "Export commander command as a Fig spec", "main": "lib/index.js", "scripts": { "build": "tsc", "test": "tsx test/index.ts", "test:overwrite": "OVERWRITE=true yarn test", "clean:test": "git clean -Xf test", "prepack": "pnpm build" }, "repository": { "type": "git", "url": "git+https://github.com/withfig/autocomplete-tools.git" }, "keywords": [ "commander", "fig", "spec", "generator", "plugin", "integration" ], "files": [ "lib/" ], "author": "Federico Ciardi ", "license": "MIT", "bugs": { "url": "https://github.com/withfig/autocomplete-tools/issues" }, "homepage": "https://github.com/withfig/autocomplete-tools#readme", "peerDependencies": { "commander": "^11.1.0" }, "dependencies": { "prettier": "^3.3.3" }, "devDependencies": { "@types/node": "^22.5.2", "@withfig/autocomplete-types": "workspace:^", "chalk": "^5.3.0", "commander": "^11.1.0", "tsx": "^4.19.0", "typescript": "^5.5.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/src/000077500000000000000000000000001471722043300317215ustar00rootroot00000000000000index.ts000066400000000000000000000125561471722043300333320ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/src/* eslint-disable @typescript-eslint/no-explicit-any */ import { Argument, Command, Option } from "commander"; import prettier from "prettier"; export interface Options { figSpecCommandName?: string; } const DEFAULT_FIG_SUBCOMMAND_NAME = "generate-fig-spec"; function convertDefaultValue(v: unknown) { if (typeof v === "string") return v; if (Array.isArray(v)) return v.join(","); if (typeof v === "object") return undefined; return String(v); } async function getTemplate(spec: Fig.Spec): Promise { return prettier.format( ` // Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = ${JSON.stringify(spec)} export default completionSpec; `, { parser: "typescript" } ); } function generateArg(_arg: Argument & Record): Fig.Arg { const { _name: name, description, required, variadic, defaultValue } = _arg; const arg: Fig.Arg = { name }; if (description) arg.description = description; if (!required) arg.isOptional = true; if (variadic) arg.isVariadic = true; if (defaultValue) arg.default = convertDefaultValue(defaultValue); return arg; } function generateOption(_option: Option & Record): Fig.Option { const { short, long, flags, description, mandatory, required, optional, variadic, argChoices, defaultValue, } = _option; const name = new Set(); if (short) name.add(short); if (long) name.add(long); const option: Fig.Option = { name: Array.from(name) }; if (description) option.description = description; if (mandatory) option.isRequired = true; // Option argument e.g. "-f, --flag " // If required and optional are both false it does not have an argument if (required || optional) { // eslint-disable-next-line no-useless-escape const matches = flags.match(/.*[\[<](.*)[\]>]/); // !!! This is all but an useless escape. It is required to make the regex working const arg: Fig.Arg = { name: matches ? matches[1].replace(/\./g, "") : "", }; if (optional) arg.isOptional = true; if (variadic) arg.isVariadic = true; if (argChoices) arg.suggestions = argChoices; if (defaultValue) arg.default = convertDefaultValue(defaultValue); option.args = arg; } return option; } interface ExtendedCommand extends Command { _name: string; _description: string; _aliases: string[]; _args: Argument[]; options: Option[]; _helpDescription: string; _helpShortFlag: string; _helpLongFlag: string; _addImplicitHelpCommandL?: boolean; // Deliberately undefined, not decided whether true or false _helpCommandName: string; _helpCommandnameAndArgs: string; _helpCommandDescription: string; _hasHelpOption: boolean; _hidden: boolean; } function helpSubcommand({ _helpCommandName, // 'help' _helpCommandDescription, _helpCommandnameAndArgs, // 'help [cmd]' }: ExtendedCommand): Fig.Subcommand { const [, arg] = _helpCommandnameAndArgs.split(" "); return { name: _helpCommandName, description: _helpCommandDescription, priority: 49, ...(arg && { args: { name: arg.slice(1, -1), isOptional: true, template: "help", }, }), }; } function helpOption({ _helpDescription, _helpShortFlag, _helpLongFlag, }: ExtendedCommand): Fig.Option { return { name: [_helpShortFlag, _helpLongFlag], description: _helpDescription, priority: 49, }; } function generateCommand( _command: Command & Record, figSpecCommandName: string ): Fig.Subcommand | undefined { const { _name, _description, _aliases, commands, _args, options, _addImplicitHelpCommandL, _hasHelpOption, _hidden, } = _command as ExtendedCommand; if (_name === figSpecCommandName) return undefined; const name = _aliases.length > 0 ? Array.from(new Set([_name, ..._aliases])) : _name; const command: Fig.Subcommand = { name }; if (_description) command.description = _description; if (_hidden) command.hidden = true; // Subcommands if (commands.length) { command.subcommands = []; for (const cmd of commands) { const subcommand = generateCommand(cmd, figSpecCommandName); if (subcommand) command.subcommands.push(subcommand); } if (_addImplicitHelpCommandL !== false) { command.subcommands.push(helpSubcommand(_command as ExtendedCommand)); } } // Options command.options = []; if (options.length) { command.options = options.map(generateOption); } if (_hasHelpOption) { command.options.push(helpOption(_command as ExtendedCommand)); } // Args if (_args.length) { command.args = _args.map(generateArg); } return command; } export async function generateCompletionSpec( command: Command, options?: Options ): Promise { const figSpecCommandName = options?.figSpecCommandName || DEFAULT_FIG_SUBCOMMAND_NAME; // The first subcommand will never have the name of the `figSpecCommandName` // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const spec = getTemplate(generateCommand(command, figSpecCommandName)!); return spec; } export function addCompletionSpecCommand(command: Command) { command .command(DEFAULT_FIG_SUBCOMMAND_NAME) .description("Print the Fig completion spec") .action(async () => { const spec = await generateCompletionSpec(command); console.log(spec); }); } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/000077500000000000000000000000001471722043300321115ustar00rootroot00000000000000fixtures/000077500000000000000000000000001471722043300337035ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/testargument-choices/000077500000000000000000000000001471722043300371405ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000005011471722043300411220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argument-choicesimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program.addArgument( new commander.Argument("", "drink cup size").choices(["small", "medium", "large"]) ); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000010071471722043300413070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argument-choices// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "drink-size", description: "drink cup size" }], }; export default completionSpec; argument-default/000077500000000000000000000000001471722043300371475ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000004661471722043300411430ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argument-defaultimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program.addArgument( new commander.Argument("[timeout]", "timeout in seconds").default(60, "one minute") ); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000011171471722043300413200ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argument-default// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "timeout", description: "timeout in seconds", isOptional: true, default: "60", }, ], }; export default completionSpec; argument/000077500000000000000000000000001471722043300355255ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000006101471722043300375100ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argumentimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .version("0.1.0") .argument("", "user to login") .argument("[password]", "password for user, if required", "no password given") .description("example program for argument"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000014371471722043300377030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argument// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", description: "example program for argument", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "username", description: "user to login" }, { name: "password", description: "password for user, if required", isOptional: true, default: "no password given", }, ], }; export default completionSpec; arguments/000077500000000000000000000000001471722043300357105ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000003751471722043300377030ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/argumentsimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program.version("0.1.0").arguments(" [password]"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000011331471722043300400570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/arguments// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "username" }, { name: "password", isOptional: true }], }; export default completionSpec; babel-cli/000077500000000000000000000000001471722043300355155ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000072641471722043300375140ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/babel-cliimport { program } from "commander"; import { addCompletionSpecCommand } from "../../../src"; program.option( "-f, --filename [filename]", "The filename to use when reading from stdin. This will be used in source-maps, errors etc." ); program.option("--presets [list]", "A comma-separated list of preset names."); program.option("--plugins [list]", "A comma-separated list of plugin names."); program.option("--config-file [path]", "Path to a .babelrc file to use."); program.option( "--env-name [name]", "The name of the 'env' to use when loading configs and plugins. " + "Defaults to the value of BABEL_ENV, or else NODE_ENV, or else 'development'." ); program.option( "--root-mode [mode]", "The project-root resolution mode. " + "One of 'root' (the default), 'upward', or 'upward-optional'." ); program.option("--source-type [script|module]", ""); program.option("--no-babelrc", "Whether or not to look up .babelrc and .babelignore files."); program.option("--ignore [list]", "List of glob paths to **not** compile."); program.option("--only [list]", "List of glob paths to **only** compile."); program.option( "--no-highlight-code", "Enable or disable ANSI syntax highlighting of code frames. (on by default)" ); program.option("--no-comments", "Write comments to generated output. (true by default)"); program.option("--retain-lines", "Retain line numbers. This will result in really ugly code."); program.option( "--compact [true|false|auto]", "Do not include superfluous whitespace characters and line terminators." ); program.option("--minified", "Save as many bytes when printing. (false by default)"); program.option( "--auxiliary-comment-before [string]", "Print a comment before any injected non-user code." ); program.option( "--auxiliary-comment-after [string]", "Print a comment after any injected non-user code." ); program.option("-s, --source-maps [true|false|inline|both]", ""); program.option("--source-map-target [string]", "Set `file` on returned source map."); program.option("--source-file-name [string]", "Set `sources[0]` on returned source map."); program.option("--source-root [filename]", "The root from which all sources are relative."); program.option( "-x, --extensions [extensions]", `List of extensions to compile when a directory has been the input. [${[ "js", "ts", "jsx", "tsx", ].join()}]` ); program.option("--keep-file-extension", "Preserve the file extensions of the input files."); program.option("-w, --watch", "Recompile files on changes."); program.option("--skip-initial-build", "Do not compile files before watching."); program.option("-o, --out-file [out]", "Compile all input files into a single file."); program.option( "-d, --out-dir [out]", "Compile an input directory of modules into an output directory." ); program.option( "--relative", "Compile into an output directory relative to input directory or file. Requires --out-dir [out]" ); program.option("-D, --copy-files", "When compiling a directory copy over non-compilable files."); program.option( "--include-dotfiles", "Include dotfiles when compiling and copying non-compilable files." ); program.option("--no-copy-ignored", "Exclude ignored files when copying non-compilable files."); program.option("--verbose", "Log everything. This option conflicts with --quiet"); program.option("--quiet", "Don't log anything. This option conflicts with --verbose"); program.option("--delete-dir-on-start", "Delete the out directory before compilation."); program.option("--out-file-extension [string]", "Use a specific extension for the output files"); program.version("7.15.0"); program.usage("[options] "); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000133011471722043300376640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/babel-cli// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-f", "--filename"], description: "The filename to use when reading from stdin. This will be used in source-maps, errors etc.", args: { name: "filename", isOptional: true }, }, { name: ["--presets"], description: "A comma-separated list of preset names.", args: { name: "list", isOptional: true }, }, { name: ["--plugins"], description: "A comma-separated list of plugin names.", args: { name: "list", isOptional: true }, }, { name: ["--config-file"], description: "Path to a .babelrc file to use.", args: { name: "path", isOptional: true }, }, { name: ["--env-name"], description: "The name of the 'env' to use when loading configs and plugins. Defaults to the value of BABEL_ENV, or else NODE_ENV, or else 'development'.", args: { name: "name", isOptional: true }, }, { name: ["--root-mode"], description: "The project-root resolution mode. One of 'root' (the default), 'upward', or 'upward-optional'.", args: { name: "mode", isOptional: true }, }, { name: ["--source-type"], args: { name: "script|module", isOptional: true }, }, { name: ["--no-babelrc"], description: "Whether or not to look up .babelrc and .babelignore files.", }, { name: ["--ignore"], description: "List of glob paths to **not** compile.", args: { name: "list", isOptional: true }, }, { name: ["--only"], description: "List of glob paths to **only** compile.", args: { name: "list", isOptional: true }, }, { name: ["--no-highlight-code"], description: "Enable or disable ANSI syntax highlighting of code frames. (on by default)", }, { name: ["--no-comments"], description: "Write comments to generated output. (true by default)", }, { name: ["--retain-lines"], description: "Retain line numbers. This will result in really ugly code.", }, { name: ["--compact"], description: "Do not include superfluous whitespace characters and line terminators.", args: { name: "true|false|auto", isOptional: true }, }, { name: ["--minified"], description: "Save as many bytes when printing. (false by default)", }, { name: ["--auxiliary-comment-before"], description: "Print a comment before any injected non-user code.", args: { name: "string", isOptional: true }, }, { name: ["--auxiliary-comment-after"], description: "Print a comment after any injected non-user code.", args: { name: "string", isOptional: true }, }, { name: ["-s", "--source-maps"], args: { name: "true|false|inline|both", isOptional: true }, }, { name: ["--source-map-target"], description: "Set `file` on returned source map.", args: { name: "string", isOptional: true }, }, { name: ["--source-file-name"], description: "Set `sources[0]` on returned source map.", args: { name: "string", isOptional: true }, }, { name: ["--source-root"], description: "The root from which all sources are relative.", args: { name: "filename", isOptional: true }, }, { name: ["-x", "--extensions"], description: "List of extensions to compile when a directory has been the input. [js,ts,jsx,tsx]", args: { name: "extensions", isOptional: true }, }, { name: ["--keep-file-extension"], description: "Preserve the file extensions of the input files.", }, { name: ["-w", "--watch"], description: "Recompile files on changes." }, { name: ["--skip-initial-build"], description: "Do not compile files before watching.", }, { name: ["-o", "--out-file"], description: "Compile all input files into a single file.", args: { name: "out", isOptional: true }, }, { name: ["-d", "--out-dir"], description: "Compile an input directory of modules into an output directory.", args: { name: "out", isOptional: true }, }, { name: ["--relative"], description: "Compile into an output directory relative to input directory or file. Requires --out-dir [out]", }, { name: ["-D", "--copy-files"], description: "When compiling a directory copy over non-compilable files.", }, { name: ["--include-dotfiles"], description: "Include dotfiles when compiling and copying non-compilable files.", }, { name: ["--no-copy-ignored"], description: "Exclude ignored files when copying non-compilable files.", }, { name: ["--verbose"], description: "Log everything. This option conflicts with --quiet", }, { name: ["--quiet"], description: "Don't log anything. This option conflicts with --verbose", }, { name: ["--delete-dir-on-start"], description: "Delete the out directory before compilation.", }, { name: ["--out-file-extension"], description: "Use a specific extension for the output files", args: { name: "string", isOptional: true }, }, { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; command-alias/000077500000000000000000000000001471722043300364105ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000007611471722043300404020ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/command-aliasimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .version("0.0.1") .description("Fake package manager") .addCommand( new Command("install").argument("[name]").description("install one or more packages").alias("i") ) .addCommand( new Command("search").argument("[query]").description("search with optional query").alias("s") ); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000022201471722043300405550ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/command-alias// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", description: "Fake package manager", subcommands: [ { name: ["install", "i"], description: "install one or more packages", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "name", isOptional: true }], }, { name: ["search", "s"], description: "search with optional query", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "query", isOptional: true }], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; command-description-version/000077500000000000000000000000001471722043300413255ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000004701471722043300433140ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/command-description-versionimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .version("0.0.1") .description("Application simple description") .option("-f, --foo", "enable some foo"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000012031471722043300434720ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/command-description-version// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", description: "Application simple description", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-f", "--foo"], description: "enable some foo" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; custom-command-class/000077500000000000000000000000001471722043300377345ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000011371471722043300417240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-command-class/* eslint-disable class-methods-use-this */ import { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; class CommandWithTrace extends Command { createCommand(name: string) { const cmd = new Command(name); cmd.option("-t, --trace", "display extra information when run command"); return cmd; } } const program = new CommandWithTrace("program").option("-v, ---verbose"); program.command("serve [params...]").option("-p, --port ", "port number"); program.command("build "); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000025111471722043300421040ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-command-class// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "program", subcommands: [ { name: "serve", options: [ { name: ["-t", "--trace"], description: "display extra information when run command", }, { name: ["-p", "--port"], description: "port number", args: { name: "number" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "params", isOptional: true, isVariadic: true }], }, { name: "build", options: [ { name: ["-t", "--trace"], description: "display extra information when run command", }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "target" }], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-v", "---verbose"] }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; custom-help/000077500000000000000000000000001471722043300361435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000010201471722043300401220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-helpimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .helpOption("-c, --HELP", "custom help message") .option("-s, --sessions", "add session support") .option("-t, --template ", "specify template engine (jade|ejs) [jade]", "jade") .addHelpCommand("hlp [argument]", "some nice description"); program.command("child").option("--gender", "specific gender of child"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000016501471722043300403160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-help// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "child", options: [ { name: ["--gender"], description: "specific gender of child" }, { name: ["-c", "--HELP"], description: "custom help message", priority: 49, }, ], }, { name: "hlp", description: "some nice description", priority: 49, args: { name: "argument", isOptional: true, template: "help" }, }, ], options: [ { name: ["-s", "--sessions"], description: "add session support" }, { name: ["-t", "--template"], description: "specify template engine (jade|ejs) [jade]", args: { name: "engine", default: "jade" }, }, { name: ["-c", "--HELP"], description: "custom help message", priority: 49, }, ], }; export default completionSpec; custom-version/000077500000000000000000000000001471722043300367005ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000006221471722043300406660ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-versionimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .version("0.0.1", "-v, --VERSION", "new version message") .option("-s, --sessions", "add session support") .option("-t, --template ", "specify template engine (jade|ejs) [jade]", "jade"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000013651471722043300410560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/custom-version// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-v", "--VERSION"], description: "new version message" }, { name: ["-s", "--sessions"], description: "add session support" }, { name: ["-t", "--template"], description: "specify template engine (jade|ejs) [jade]", args: { name: "engine", default: "jade" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; default-command/000077500000000000000000000000001471722043300367435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000007401471722043300407320ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/default-commandimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program.command("build").description("build web site for deployment"); program.command("deploy").description("deploy web site to production"); program .command("serve", { isDefault: true }) .description("launch web server") .option("-p,--port ", "web port"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000024241471722043300411160ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/default-command// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "build", description: "build web site for deployment", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "deploy", description: "deploy web site to production", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "serve", description: "launch web server", options: [ { name: ["-p", "--port"], description: "web port", args: { name: "port_number" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; generate-from-cli/000077500000000000000000000000001471722043300372035ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000012121471722043300411650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/generate-from-cliimport { Command } from "commander"; import { generateCompletionSpec } from "../../../src"; const program = new Command(); program .version("0.1.0") .argument("", "user to login") .argument("[password]", "password for user, if required", "no password given") .description("example program for argument") .command("generateCompletionSpec") .description("Generate a fig spec for the current program") .action(async () => { console.log(await generateCompletionSpec(program)); }); program.command("remove", "Remove user"); // this should appear even if it is added after `generateCompletionSpec` command program.parse(); expected.ts000066400000000000000000000024211471722043300413530ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/generate-from-cli// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", description: "example program for argument", subcommands: [ { name: "generateCompletionSpec", description: "Generate a fig spec for the current program", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "remove", description: "Remove user", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "username", description: "user to login" }, { name: "password", description: "password for user, if required", isOptional: true, default: "no password given", }, ], }; export default completionSpec; options.json000066400000000000000000000000601471722043300415650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/generate-from-cli{ "subcommandName": "generateCompletionSpec" }hidden-command/000077500000000000000000000000001471722043300365525ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000007771471722043300405530ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/hidden-commandimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program .command("build", { hidden: true, }) .description("build web site for deployment"); program.command("deploy").description("deploy web site to production"); program .command("serve", { isDefault: true }) .description("launch web server") .option("-p,--port ", "web port"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000024501471722043300407240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/hidden-command// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "build", description: "build web site for deployment", hidden: true, options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "deploy", description: "deploy web site to production", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "serve", description: "launch web server", options: [ { name: ["-p", "--port"], description: "web port", args: { name: "port_number" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; implicit-help/000077500000000000000000000000001471722043300364435ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000006341471722043300404340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/implicit-helpimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program .version("0.1.0") .argument("", "user to login") .argument("[password]", "password for user, if required", "no password given") .description("example program for argument") .addHelpCommand(); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000014371471722043300406210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/implicit-help// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", description: "example program for argument", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "username", description: "user to login" }, { name: "password", description: "password for user, if required", isOptional: true, default: "no password given", }, ], }; export default completionSpec; nested-commands/000077500000000000000000000000001471722043300367645ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000007151471722043300407550ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/nested-commandsimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); const brew = program.command("brew"); brew.command("tea"); brew.command("coffee"); function makeHeatCommand() { const heat = new commander.Command("heat"); heat.command("jug"); heat.command("pot"); return heat; } program.addCommand(makeHeatCommand()); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000042211471722043300411340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/nested-commands// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "brew", subcommands: [ { name: "tea", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "coffee", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "heat", subcommands: [ { name: "jug", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "pot", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options-choices/000077500000000000000000000000001471722043300370115ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000005031471722043300407750ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-choicesimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program.addOption( new commander.Option("-d, --drink ", "drink cup size").choices(["small", "medium", "large"]) ); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000011401471722043300411560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-choices// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-d", "--drink"], description: "drink cup size", args: { name: "size", suggestions: ["small", "medium", "large"] }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options-default/000077500000000000000000000000001471722043300370205ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000013101471722043300410010ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-defaultimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program .option("-c, --color ", "specify the color", "blue") .addOption(new commander.Option("-n, --number ").default(1)) .addOption(new commander.Option("-s, --string ").default("hello")) .addOption(new commander.Option("-b, --bool ").default(true)) .addOption(new commander.Option("-a, --arr ").default([1, 2, 3])) .addOption(new commander.Option("-o, --obj ").default({ test: "val" })) .addOption(new commander.Option("-m, --map ").default(new Map())); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000017351471722043300411770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-default// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-c", "--color"], description: "specify the color", args: { name: "type", default: "blue" }, }, { name: ["-n", "--number"], args: { name: "type", default: "1" } }, { name: ["-s", "--string"], args: { name: "type", default: "hello" } }, { name: ["-b", "--bool"], args: { name: "type", default: "true" } }, { name: ["-a", "--arr"], args: { name: "type", default: "1,2,3" } }, { name: ["-o", "--obj"], args: { name: "type" } }, { name: ["-m", "--map"], args: { name: "type" } }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options-negatable/000077500000000000000000000000001471722043300373165ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000005521471722043300413060ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-negatableimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program .option("--no-sauce", "Remove sauce") .option("--cheese ", "cheese flavour", "mozzarella") .option("--no-cheese", "plain with no cheese"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000013111471722043300414630ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-negatable// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["--no-sauce"], description: "Remove sauce" }, { name: ["--cheese"], description: "cheese flavour", args: { name: "flavour", default: "mozzarella" }, }, { name: ["--no-cheese"], description: "plain with no cheese" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options-required/000077500000000000000000000000001471722043300372145ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000004211471722043300411770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-requiredimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program.requiredOption("-c, --cheese ", "pizza must have cheese"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000011261471722043300413650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-required// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-c", "--cheese"], description: "pizza must have cheese", isRequired: true, args: { name: "type" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options.json000066400000000000000000000000441471722043300416000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-required{ "flags": "--cheese mozzarella" }options-variadic/000077500000000000000000000000001471722043300371565ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000005011471722043300411400ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-variadicimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program .option("-n, --number ", "specify numbers") .option("-l, --letter [value...]", "specify letters"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000013401471722043300413250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options-variadic// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-n", "--number"], description: "specify numbers", args: { name: "value", isVariadic: true }, }, { name: ["-l", "--letter"], description: "specify letters", args: { name: "value", isOptional: true, isVariadic: true }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; options/000077500000000000000000000000001471722043300353765ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000007671471722043300373760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/optionsimport commander from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new commander.Command(); program .option("-f, --float ", "float argument") .option("-i, --integer ", "integer argument") .option("-v, --verbose [level]", "verbosity that can be increased", "1") .option("-c, --collect ", "repeatable value") .option("-l, --list ", "comma separated list"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000020701471722043300375460ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/options// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-f", "--float"], description: "float argument", args: { name: "number" }, }, { name: ["-i", "--integer"], description: "integer argument", args: { name: "number" }, }, { name: ["-v", "--verbose"], description: "verbosity that can be increased", args: { name: "level", isOptional: true, default: "1" }, }, { name: ["-c", "--collect"], description: "repeatable value", args: { name: "value" }, }, { name: ["-l", "--list"], description: "comma separated list", args: { name: "items" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; pass-through-options/000077500000000000000000000000001471722043300400205ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000004421471722043300420060ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/pass-through-optionsimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program.argument("").argument("[args...]").passThroughOptions().option("-d, --dry-run"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000011131471722043300421650ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/pass-through-options// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-d", "--dry-run"] }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "utility" }, { name: "args", isOptional: true, isVariadic: true }, ], }; export default completionSpec; positional-options/000077500000000000000000000000001471722043300375555ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixturescommand.ts000066400000000000000000000005221471722043300415420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/positional-optionsimport { Command } from "commander"; import { addCompletionSpecCommand } from "../../../src"; const program = new Command(); program.enablePositionalOptions().option("-p, --progress"); program.command("upload ").option("-p, --port ", "port number", "80"); addCompletionSpecCommand(program); program.parse(process.argv); expected.ts000066400000000000000000000015311471722043300417260ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/fixtures/positional-options// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "command", subcommands: [ { name: "upload", options: [ { name: ["-p", "--port"], description: "port number", args: { name: "number", default: "80" }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "file" }], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true, template: "help" }, }, ], options: [ { name: ["-p", "--progress"] }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; index.ts000066400000000000000000000035651471722043300335220ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/testimport path from "path"; import fs from "fs"; import child from "child_process"; import { report } from "./utils"; const fixturesPath = path.resolve(__dirname, "fixtures"); function runFixtures() { let hadErrors = false; const fixtures = fs.readdirSync(fixturesPath, { withFileTypes: true }); for (const fixture of fixtures) { if (!fixture.isDirectory()) continue; const fixturePath = path.resolve(fixturesPath, fixture.name); const command = path.resolve(fixturePath, "command.ts"); const expected = path.resolve(fixturePath, "expected.ts"); const output = path.resolve(fixturePath, "output.ts"); const options = path.resolve(fixturePath, "options.json"); const args: string[] = []; if (fs.existsSync(options)) { const parsedOptions = JSON.parse(fs.readFileSync(options, { encoding: "utf8" })); if (parsedOptions.flags) args.push(parsedOptions.flags); args.push(parsedOptions.subcommandName || "generate-fig-spec"); } else { args.push("generate-fig-spec"); // default generate subcommand } if (!fs.existsSync(command)) { hadErrors = true; continue; } try { const cmd = `node -r tsx/cjs ${command} ${args.join(" ")} > ${output}`; child.execSync(cmd); } catch { report(fixture.name, "errored"); hadErrors = true; continue; } if (!fs.existsSync(expected) || process.env.OVERWRITE) { fs.copyFileSync(output, expected); report(fixture.name, process.env.OVERWRITE ? "regenerated" : "generated"); continue; } const outputFile = fs.readFileSync(output); const expectedFile = fs.readFileSync(expected); const successful = outputFile.equals(expectedFile); if (!successful) { hadErrors = true; } report(fixture.name, successful ? "successful" : "failed"); } if (hadErrors) { process.exit(1); } } runFixtures(); utils.ts000066400000000000000000000015331471722043300335440ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander/test/* eslint-disable import/no-extraneous-dependencies */ import chalk from "chalk"; type ReportStatus = "successful" | "failed" | "errored" | "regenerated" | "generated"; export function report(fixtureName: string, status: ReportStatus): void { let message; switch (status) { case "successful": message = chalk.bgGreen(` ✓ Successfully run ${chalk.underline(fixtureName)} `); break; case "failed": message = chalk.bgRed(` × Failed running ${chalk.underline(fixtureName)} `); break; case "errored": message = chalk.bgBlackBright(` - Encountered error when trying to run ${fixtureName}`); break; default: message = chalk.bgYellow( ` - ${status === "regenerated" ? "Regenerated" : "Generated"} ${chalk.underline( fixtureName )} ` ); } console.log(message); } tsconfig.json000066400000000000000000000005631471722043300335660ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/commander{ "compilerOptions": { "target": "es6", "outDir": "lib/", "rootDir": "src/", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": true, "types": ["@withfig/autocomplete-types", "node"] }, "exclude": ["test/", "node_modules/", "lib/"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/000077500000000000000000000000001471722043300302615ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/.gitignore000066400000000000000000000001251471722043300322470ustar00rootroot00000000000000*-debug.log *-error.log /.nyc_output /dist /lib /package-lock.json /tmp node_modules golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/LICENSE000066400000000000000000000020711471722043300312660ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/MIGRATION.md000066400000000000000000000004761471722043300321430ustar00rootroot00000000000000# Migration docs ## @withfig/oclif@2 to @fig/complete-oclif@3 The first granted thing you can note is that we renamed the package to use the `@fig` namespace and a more significative name. In this major we changed the name of the subcommand that gets added to the CLI from `generateFigSpec` to `generate-fig-spec`. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/README.md000066400000000000000000000004211471722043300315350ustar00rootroot00000000000000# Fig // oclif CLI This Javascript package is Fig's integration with popular CLI framework [Oclif](https://oclif.io/). See Fig's docs for how to integrate: [https://fig.io/docs/guides/autocomplete-for-teams/oclif](https://fig.io/docs/guides/autocomplete-for-teams/oclif) golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/bin/000077500000000000000000000000001471722043300310315ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/bin/run000077500000000000000000000001351471722043300315620ustar00rootroot00000000000000#!/usr/bin/env node require('@oclif/command').run() .catch(require('@oclif/errors/handle')) golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/bin/run.cmd000066400000000000000000000000371471722043300323220ustar00rootroot00000000000000@echo off node "%~dp0\run" %* golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/package.json000066400000000000000000000021701471722043300325470ustar00rootroot00000000000000{ "name": "@fig/complete-oclif", "description": "Generate Fig completion spec from oclif", "version": "2.0.1", "author": "Matt Schrage @mattschrage", "bugs": "https://github.com/withfig/autocomplete-tools/issues", "dependencies": { "@oclif/core": "^2.16.0", "prettier": "^3.3.3" }, "devDependencies": { "@types/node": "^22.5.2", "@withfig/autocomplete-types": "workspace:^", "oclif": "^3.17.2", "tslib": "^2.7.0", "typescript": "^5.5.4" }, "files": [ "/lib", "/oclif.manifest.json" ], "homepage": "https://github.com/withfig/autocomplete-tools/tree/main/integrations/oclif", "repository": "github:withfig/autocomplete-tools", "keywords": [ "oclif-plugin" ], "license": "MIT", "oclif": { "commands": "./lib/commands", "bin": "oclif-example", "devPlugins": [ "@oclif/plugin-help" ] }, "scripts": { "build": "rm -rf lib && tsc", "postpack": "rm -f oclif.manifest.json", "prepack": "pnpm build && oclif manifest && oclif readme", "version": "oclif readme && git add README.md" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/src/000077500000000000000000000000001471722043300310505ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/src/commands/000077500000000000000000000000001471722043300326515ustar00rootroot00000000000000generate-fig-spec.ts000066400000000000000000000054301471722043300364310ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/src/commandsimport { Command } from "@oclif/core"; import * as fs from "node:fs"; import * as prettier from "prettier"; function getFigArgs(args: Command.Arg.Cached[]): Fig.Arg[] { const figArgs: Fig.Arg[] = []; for (const arg of args) { if (arg.hidden) continue; figArgs.push({ name: arg.name, ...(arg.description && { description: arg.description }), ...(arg.default && { default: `${arg.default}` }), ...(arg.options?.length && { suggestions: arg.options }), ...(arg.required === false && { isOptional: true }), }); } return figArgs; } function getFigOptions(options: Command.Flag.Cached[]): Fig.Option[] { const figOptions: Fig.Option[] = []; for (const flag of options) { figOptions.push({ name: flag.char ? [`-${flag.char}`, `--${flag.name}`] : `--${flag.name}`, ...(flag.description && { description: flag.description }), ...(flag.type === "option" && { args: { description: flag.helpValue, ...(flag.options?.length && { suggestions: flag.options }), ...(flag.default && { default: `${flag.default}` }), }, }), ...(flag.required === true && { isRequired: true }), ...(flag.type === "boolean" && flag.allowNo && { exclusiveOn: [`--no-${flag.name}`] }), hidden: flag.hidden, }); if (flag.type === "boolean" && flag.allowNo) { figOptions.push({ name: `--no-${flag.name}`, }); } } return figOptions; } function getFigSubcommands(commands: Command.Loadable[]): Fig.Subcommand[] { const subcommands: Fig.Subcommand[] = []; for (const command of commands) { // skip this command if (command.id === "generate-fig-spec") continue; const options: Fig.Option[] = getFigOptions(Object.values(command.flags)); const args: Fig.Arg[] = getFigArgs(Object.values(command.args)); subcommands.push({ name: command.id, ...(command.description && { description: command.description }), ...(options.length && { options }), ...(args.length && { args }), hidden: command.hidden, }); } return subcommands; } export class GenerateFigSpecCommand extends Command { static description = "Generate a Fig completion spec"; async run() { const { flags: parsedFlags } = await this.parse(GenerateFigSpecCommand); const spec: Fig.Spec = { name: this.config.name, subcommands: getFigSubcommands(this.config.commands), }; const template = await prettier.format( `// Autogenerated by @fig/complete-oclif const completionSpec: Fig.Spec = ${JSON.stringify(spec)}; export default completionSpec; `, { parser: "typescript" } ); if (parsedFlags.output) { fs.writeFileSync(parsedFlags.output, template); } else { this.log(template); } } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/src/index.ts000066400000000000000000000001511471722043300325240ustar00rootroot00000000000000import { GenerateFigSpecCommand } from "./commands/generate-fig-spec"; export = GenerateFigSpecCommand; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/oclif/tsconfig.json000066400000000000000000000005031471722043300327660ustar00rootroot00000000000000{ "compilerOptions": { "declaration": true, "importHelpers": true, "module": "commonjs", "outDir": "lib/", "rootDir": "src/", "strict": true, "target": "es6", "types": ["@withfig/autocomplete-types", "node"], "skipLibCheck": true }, "exclude": ["test/", "node_modules/", "lib/"] } swift-argument-parser/000077500000000000000000000000001471722043300333545ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrationsREADME.md000066400000000000000000000001331471722043300346300ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/integrations/swift-argument-parserSee [fig-swift-argument-parser repo](https://github.com/withfig/fig-swift-argument-parser).golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/000077500000000000000000000000001471722043300255565ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/.gitignore000066400000000000000000000000551471722043300275460ustar00rootroot00000000000000lib/ node_modules/ test/fixtures/*/updated.tsgolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/.npmignore000066400000000000000000000000051471722043300275500ustar00rootroot00000000000000test/golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/LICENSE000066400000000000000000000020711471722043300265630ustar00rootroot00000000000000MIT License Copyright (c) 2022 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/README.md000066400000000000000000000001541471722043300270350ustar00rootroot00000000000000# @fig/autocomplete-merge package This package provides a merge tool to join two versions of the same spec.golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/index.ts000066400000000000000000000000741471722043300272360ustar00rootroot00000000000000export * from "./src/presets"; export * from "./src/merge"; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/package.json000066400000000000000000000016201471722043300300430ustar00rootroot00000000000000{ "name": "@fig/autocomplete-merge", "version": "1.4.0", "description": "Package to merge two specs together", "author": "The Fig Team", "scripts": { "build": "tsc", "prepack": "pnpm build", "test": "tsx test/index.ts" }, "license": "MIT", "main": "./lib/index.js", "types": "./lib/index.d.ts", "dependencies": { "prettier": "^3.3.3", "ts-morph": "^23.0.0", "typescript": "^5.5.4" }, "files": [ "lib/" ], "devDependencies": { "@tsconfig/recommended": "^1.0.7", "@types/node": "^22.5.2", "@withfig/autocomplete-types": "workspace:^", "tsx": "^4.19.0" }, "fig": { "build": { "description": "Typecheck and build the project", "icon": "🛠" }, "prepack": { "description": "Run build before packing the package for publishing", "icon": "🛠" } }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/src/000077500000000000000000000000001471722043300263455ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/src/errors.ts000066400000000000000000000014041471722043300302300ustar00rootroot00000000000000export const Errors = { MissingDefaultExport: (file: string) => new Error(`A Fig spec file should \`export default\` a completion spec object (file: ${file})`), NoDirectDefaultExport: (file: string) => new Error( `The completion spec object should not be default exported directly, but it needs to be assigned to a variable before (file: ${file})` ), DefaultExportShouldBeAnIdentifier: (file: string) => new Error( `The default export of a Fig spec file should be an identifier referencing the completion spec object (file: ${file})` ), MissingSpecVariableDeclaration: (file: string) => new Error( `The spec file must contain exactly one variable declaration containing the spec object (file: ${file})` ), } as const; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/src/merge.ts000066400000000000000000000350611471722043300300210ustar00rootroot00000000000000/* eslint-disable @typescript-eslint/no-use-before-define */ import { Project, ts, SourceFile, Node, Symbol as TSMSymbol, ArrayLiteralExpression, ObjectLiteralExpression, Expression, ObjectLiteralElementLike, ExportAssignment, } from "ts-morph"; import * as prettier from "prettier"; import { defaultPreset, presets } from "./presets"; import type { PresetName, Preset } from "./presets"; import { Errors } from "./errors"; const project = new Project(); function parseFile(filePath: string, input: string): SourceFile { return project.createSourceFile(filePath, input, { overwrite: true }); } function setupFile( path: string, file: string, getDefaultExport?: true ): [sourceFile: SourceFile, defaultExport: TSMSymbol]; function setupFile(path: string, file: string, getDefaultExport: false): [sourceFile: SourceFile]; function setupFile(path: string, file: string, getDefaultExport = true) { const sourceFile = parseFile(path, file); if (getDefaultExport) { const sourceFileDefaultExport = sourceFile.getDefaultExportSymbol(); if (!sourceFileDefaultExport) throw Errors.MissingDefaultExport(path); return [sourceFile, sourceFileDefaultExport]; } return [sourceFile]; } function isSpecObject(statement: Node, name: string): boolean { if (Node.isVariableStatement(statement)) { const declarations = statement.getDeclarationList().getDeclarations(); return declarations.some((declaration) => declaration.getName() === name); } return false; } /** * @returns {ts.Node[]} the node path of the specified node, it should be read from the end to the start */ // TODO: find a way to avoid recalculating this every time. It may be expensive for complex specs function generateNodePath(node: ts.PropertyAssignment | ts.ShorthandPropertyAssignment): ts.Node[] { let currentNode: ts.Node = node; const path: ts.Node[] = []; do { path.push(currentNode); currentNode = currentNode.parent; } while (!ts.isVariableDeclaration(currentNode)); return path; } function compareObjectLiteralElementLike( nodeA: ts.ObjectLiteralElementLike, nodeB: ObjectLiteralElementLike ): boolean { if (nodeA.kind !== nodeB.getKind()) return false; if (Node.isPropertyAssignment(nodeB)) { return expressionsAreEqual( (nodeA as ts.PropertyAssignment).initializer, nodeB.getInitializer() ); } // true for ShorthandPropertyAssignment, SpreadAssignment return true; } /** * Checks if A is a literal contained in B (ArrayLiteral) * @param expressionA * @param expressionB */ function expressionAIsSubsetOfB(expressionA?: ts.Expression, expressionB?: ts.Expression): boolean { if (!expressionA || !expressionB) return false; if ( expressionB.kind === ts.SyntaxKind.ArrayLiteralExpression && (expressionA.kind === ts.SyntaxKind.StringLiteral || expressionA.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral || expressionA.kind === ts.SyntaxKind.NumericLiteral) ) { const expressionAText = expressionA.getText(); return (expressionB as ts.ArrayLiteralExpression).elements.some( (node) => node.getText() === expressionAText ); } return false; } function expressionsAreEqual( expressionA?: ts.Expression, expressionB?: Expression ): boolean { if (!expressionA || !expressionB) return false; if (expressionA.kind !== expressionB.getKind()) return false; if (Node.isArrayLiteralExpression(expressionB)) { const elementsA = (expressionA as ts.ArrayLiteralExpression).elements; const elementsB = expressionB.getElements(); return ( elementsA.length === elementsB.length && elementsA.every((element, index) => expressionsAreEqual(element, elementsB[index])) ); } if ( Node.isStringLiteral(expressionB) || Node.isNoSubstitutionTemplateLiteral(expressionB) || Node.isNumericLiteral(expressionB) ) { // @ts-expect-error return expressionB.getLiteralText() === expressionA.text; } if (Node.isObjectLiteralExpression(expressionB)) { const propertiesA = (expressionA as ts.ObjectLiteralExpression).properties; const propertiesB = expressionB.getProperties(); return ( propertiesA.length === propertiesB.length && propertiesA.every((property, index) => { const propertyText = property.name?.getText(); // if the properties at the same index has the same name we avoid an useless search if (propertyText === propertiesB[index].compilerNode.name?.getText()) { return compareObjectLiteralElementLike(property, propertiesB[index]); } // otherwise we need to search an eventual property with the same name const foundProperty = propertiesB.find( (prop) => propertyText === prop.compilerNode.name?.getText() ); if (!foundProperty) return false; return compareObjectLiteralElementLike(property, foundProperty); }) ); } // fallback for all other nodes that should just have the same kind e.g. FalseNode and TrueNode return true; } function resolveArrayLiteral(path: ts.Node[], arrayNode: ArrayLiteralExpression): Node | undefined { const newPath = path.slice(0, -1); const currentPathItem = newPath[newPath.length - 1]; const elements = arrayNode.getElements(); // The assertion below is an identity, we just use it for type casting if (ts.isObjectLiteralExpression(currentPathItem)) { // Check if the object has a name property and get its value const nameToFind = currentPathItem.properties.filter( (prop): prop is ts.PropertyAssignment => ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === "name" )[0]?.initializer; if (nameToFind) { for (const element of elements) { if (Node.isObjectLiteralExpression(element)) { const nameProp = element.getProperty("name"); if (nameProp && Node.isPropertyAssignment(nameProp)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const initializer = nameProp.getInitializer()!; // getInitializer on PropertyAssignment never returns undefined if ( expressionsAreEqual(nameToFind, initializer) || // if nameToFind is StringLiteral and initializer is ArrayLiteralExpression // e.g. '--name' and ['--name', '-n'] expressionAIsSubsetOfB(nameToFind, initializer.compilerNode) || expressionAIsSubsetOfB(initializer.compilerNode, nameToFind) ) { return resolve(newPath, element); } } } } } else { // check which is the index of currentPathItem in the parent ArrayExpression const foundIndex = (currentPathItem.parent as ts.ArrayLiteralExpression).elements.findIndex( (arrayElement) => arrayElement === currentPathItem ); const element = elements[foundIndex]; if (element && Node.isObjectLiteralExpression(element)) { return resolve(newPath, element); } } } return undefined; } function resolveObjectLiteral( path: ts.Node[], objectNode: ObjectLiteralExpression ): Node | undefined { const newPath = path.slice(0, -1); const currentPathItem = newPath[newPath.length - 1]; // expect child item of an ObjectLiteral to be a PropertyAssignment if (!(ts.isPropertyAssignment(currentPathItem) && ts.isIdentifier(currentPathItem.name))) { return undefined; } const propNameToFind = currentPathItem.name.text; const props = objectNode.getProperties(); for (const prop of props) { if (Node.isPropertyAssignment(prop) && prop.getName() === propNameToFind) { // if there is a matching prop and this is the last one item of the path return the prop. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return resolve(newPath.slice(0, -1), prop.getInitializer()!); // getInitializer on PropertyAssignment never returns undefined } } if (newPath.length === 1) { // if the last property of the path is only in the old spec (still needs to be added to the new one) return objectNode; } return undefined; } // The first item of a path is always a PropertyAssignment (the first is effectively the last item, the one we are looking for) function resolve(path: ts.Node[], baseNode: Node): Node | undefined { if (!path.length) return baseNode; const currentItem = path[path.length - 1]; if (ts.isObjectLiteralExpression(currentItem) && Node.isObjectLiteralExpression(baseNode)) { return resolveObjectLiteral(path, baseNode); } if (ts.isArrayLiteralExpression(currentItem) && Node.isArrayLiteralExpression(baseNode)) { return resolveArrayLiteral(path, baseNode); } return undefined; } function resolveAndUpdateNodePath( path: ts.Node[], newSpec: SourceFile, nodeToAdd: { name: string; initializer: string }, newFileName: string ): boolean { // TODO: we currently assume we have just one declaration in the new file since it should be autogenerated by some kind of tool const statement = newSpec.getFirstDescendantByKind(ts.SyntaxKind.VariableDeclaration); if (!statement) throw Errors.MissingSpecVariableDeclaration(newFileName); const statementInitializer = statement.getInitializer(); if (statementInitializer && Node.isObjectLiteralExpression(statementInitializer)) { const out = resolve(path, statementInitializer); if (out && Node.isObjectLiteralExpression(out)) { out.addPropertyAssignment(nodeToAdd); return true; } // if Node.isPropertyAssignement(out) -> the property already exist at the specified path. We keep the updated one. return false; } throw Errors.MissingSpecVariableDeclaration(newFileName); } function getFirstParentProperty(nodePath: ts.Node[]): ts.PropertyAssignment | undefined { let i = 1; // exclude the first element as we know it is a property (the leaf property) while (i <= nodePath.length - 1) { const node = nodePath[i]; if (ts.isPropertyAssignment(node)) { return node; } i += 1; } return undefined; } function getObservedSet( updatable: Preset, parentProperty?: ts.PropertyAssignment ): Set | undefined { if (!parentProperty) return updatable.commandProps; // we are handling a top-level command if (ts.isIdentifier(parentProperty.name)) { const parentPropText = parentProperty.name.text; // eslint-disable-next-line no-nested-ternary return parentPropText === "subcommands" ? updatable.commandProps : parentPropText === "options" ? updatable.optionProps : updatable.argProps; // parentPropText === "args" } return undefined; } // `statement` can only be one of the top-level statements function traverseSpecs( statement: Node, destination: SourceFile, updatableProps: Preset, newFileName: string ) { statement.transform((traversal) => { const node = traversal.visitChildren(); if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) { const nodePath = generateNodePath(node); const parentProperty = getFirstParentProperty(nodePath); const observedSet = getObservedSet(updatableProps, parentProperty); if (observedSet && !observedSet.has(node.name.text)) { resolveAndUpdateNodePath( nodePath, destination, { name: node.name.text, initializer: node.initializer.getText(), }, newFileName ); } } return node; }); } export interface MergeOptions { ignore?: { commandProps?: string[]; optionProps?: string[]; argProps?: string[]; commonProps?: string[]; }; preset?: PresetName; prettifyOutput?: boolean; oldFileName?: string; newFileName?: string; } function getPreset({ preset, ignore = {} }: MergeOptions): Preset { // Props updated by the eventual CLI tool integration (preset) let updatableProps = preset ? presets[preset] : undefined; // If no preset was specified we default to the defaultPreset adding all props the user ignored if (!updatableProps) { updatableProps = defaultPreset(); const { commandProps = [], optionProps = [], argProps = [], commonProps = [] } = ignore; for (const commandProp of commandProps) { updatableProps.commandProps.add(commandProp); } for (const optionProp of optionProps) { updatableProps.optionProps.add(optionProp); } for (const argProp of argProps) { updatableProps.argProps.add(argProp); } for (const commonProp of commonProps) { updatableProps.commandProps.add(commonProp); updatableProps.optionProps.add(commonProp); updatableProps.argProps.add(commonProp); } } return updatableProps; } export async function merge( oldFileContent: string, newFileContent: string, options: MergeOptions ): Promise { const oldFileName = options.oldFileName ?? "oldfile.ts"; const newFileName = options.newFileName ?? "newfile.ts"; const updatableProps = getPreset(options); const [oldSourceFile, oldSourceFileDefaultExport] = setupFile(oldFileName, oldFileContent); const [newSourceFile] = setupFile(newFileName, newFileContent, false); /// MARK: Work on old source file by extracting top level statements let specNodeName: string; // It should contain exactly one declaration since it is a default export const exportDeclaration = oldSourceFileDefaultExport.getDeclarations()[0] as ExportAssignment; const exportDeclarationExpression = exportDeclaration.getExpression(); if (Node.isIdentifier(exportDeclarationExpression)) { specNodeName = exportDeclarationExpression.getText(); } else if (Node.isObjectLiteralExpression(exportDeclarationExpression)) { throw Errors.NoDirectDefaultExport(oldFileName); } else { throw Errors.DefaultExportShouldBeAnIdentifier(oldFileName); } const diffTopLevelNodes: [start: string, middle: string, end: string] = ["", "", ""]; const statements = oldSourceFile.getStatements(); let state = 0; for (const statement of statements) { if (isSpecObject(statement, specNodeName)) { traverseSpecs(statement, newSourceFile, updatableProps, newFileName); state += 1; } else if (statement === exportDeclaration) { state += 1; } else { diffTopLevelNodes[state] += statement.print(); } } /// MARK: Save top level statements of the old file to the new source file newSourceFile.insertStatements(2, diffTopLevelNodes[2]); newSourceFile.insertStatements(1, diffTopLevelNodes[1]); newSourceFile.insertStatements(0, diffTopLevelNodes[0]); const outputFile = ts.createPrinter().printFile(newSourceFile.compilerNode); if (options.prettifyOutput ?? true) { return prettier.format(outputFile, { parser: "typescript" }); } return outputFile; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/src/presets.ts000066400000000000000000000063401471722043300304050ustar00rootroot00000000000000// The presets in this file contain lists of props that are considered as updated // automatically between a older spec and a new one, so every prop from the new one // can override the one of the old one. All the props not contained here are overridden // if and only if they are not present in the new spec at the same location export type Preset = { commandProps: Set; optionProps: Set; argProps: Set; }; export function defaultPreset(): Preset { return { commandProps: new Set(["name", "description", "args", "subcommands", "options"]), optionProps: new Set(["name", "description", "args"]), argProps: new Set(["name", "description"]), }; } export type PresetName = | "commander" | "oclif" | "cobra" | "clap" | "swift-argument-parser" | "click" | "cement" | "argparse"; const argparsePreset = { commandProps: new Set(["name", "subcommands", "options", "args", "hidden", "description"]), optionProps: new Set(["name", "hidden", "description", "isRepeatable", "args", "isRequired"]), argProps: new Set(["name", "isVariadic", "isOptional", "hidden", "description", "suggestion"]), }; export const presets: Record = { commander: { commandProps: new Set(["name", "description", "subcommands", "options", "args", "hidden"]), optionProps: new Set(["name", "description", "isRequired", "args"]), argProps: new Set([ "name", "description", "isOptional", "isVariadic", "suggestions", "default", ]), }, oclif: { commandProps: new Set(["name", "description", "subcommands", "options", "args"]), optionProps: new Set(["name", "description", "isRequired", "args", "exclusiveOn"]), argProps: new Set(["name", "description", "isOptional", "suggestions", "default"]), }, cobra: { commandProps: new Set(["name", "description", "subcommands", "options", "args"]), optionProps: new Set([ "name", "description", "displayName", "isRepeatable", "isRequired", "args", ]), argProps: new Set(["name", "description", "template", "default"]), }, clap: { commandProps: new Set(["name", "description", "subcommands", "options", "args", "hidden"]), optionProps: new Set([ "name", "description", "args", "isRepeatable", "exclusiveOn", "hidden", "requiresEquals", ]), argProps: new Set(["name", "isVariadic", "isOptional", "suggestions", "template", "isCommand"]), }, "swift-argument-parser": { commandProps: new Set(["name", "description", "subcommands", "options", "args"]), optionProps: new Set(["name", "isRequired", "isRepeatable", "description", "hidden"]), argProps: new Set(["name", "description", "default", "isVariadic", "isOptional"]), }, click: { commandProps: new Set([ "name", "description", "options", "subcommands", "args", "hidden", "deprecated", ]), optionProps: new Set([ "name", "description", "isRepeatable", "isRequired", "exclusiveOn", "args", ]), argProps: new Set(["name", "suggestions", "template", "suggestCurrentToken", "isVariadic"]), }, argparse: argparsePreset, cement: argparsePreset, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/000077500000000000000000000000001471722043300265355ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/000077500000000000000000000000001471722043300304065ustar00rootroot00000000000000autocomplete-tools-cli/000077500000000000000000000000001471722043300347335ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesconfig.json000066400000000000000000000000331471722043300370670ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/autocomplete-tools-cli{ "preset": "commander" }expected.ts000066400000000000000000000132001471722043300371000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/autocomplete-tools-cli// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "@withfig/autocomplete-tools", description: "Dev tools for fig's autocomplete", subcommands: [ { name: "init", description: "initialize fig custom spec boilerplate in current directory", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "create-spec", description: "create spec with given name", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "name", isOptional: true }], }, { name: "compile", description: "compile specs in the current directory", options: [ { name: ["-w", "--watch"], description: "Watch files and re-compile on change", }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "dev", description: "watch for changes and compile specs", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "merge", description: "deep merge new spec into old spec", options: [ { name: ["-n", "--new-file"], description: "Create a new spec file instead of updating the old one", args: { name: "path", template: "filepaths" }, }, { name: ["-i", "--ignore-props"], description: "The props that should always be overridden.", args: { name: "props" }, exclusiveOn: ["--preset"], }, { name: ["--ignore-command-props"], description: "The command props that should always be overridden.", args: { name: "props" }, exclusiveOn: ["--preset"], }, { name: ["--ignore-option-props"], description: "The option props that should always be overridden.", args: { name: "props" }, exclusiveOn: ["--preset"], }, { name: ["--ignore-arg-props"], description: "The arg props that should always be overridden.", args: { name: "props" }, exclusiveOn: ["--preset"], }, { name: ["-p", "--preset"], description: "Use a preset", args: { name: "name", suggestions: [ "commander", "oclif", "cobra", "clap", "swift-argument-parser", ], }, priority: 76, exclusiveOn: [ "--ignore-props", "--ignore-command-props", "--ignore-option-props", "--ignore-arg-props", ], }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "oldspec", template: "filepaths" }, { name: "newspec", template: "filepaths" }, ], }, { name: "version", subcommands: [ { name: "add-diff", description: "generate version diff from new spec and add into old spec", options: [ { name: ["-n", "--new-path"], description: "Create a new spec folder instead of overwriting the old one", args: { name: "path" }, }, { name: ["--use-minor-base"], description: "Create a new version file per minor version", }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [ { name: "specName" }, { name: "newSpecFile" }, { name: "diffVersion" }, ], }, { name: "init-spec", description: "generate versioned spec in folder specified by path", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "path" }], }, { name: "precompute-specs", description: "[Unimplemented] Precompute versioned specs before publishing the specs repo (unimplemented)", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "files", isVariadic: true }], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], icon: "https://fig.io/icons/fig-light.png", }; export default completionSpec; new.ts000066400000000000000000000117571471722043300361070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/autocomplete-tools-cli// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "@withfig/autocomplete-tools", description: "Dev tools for fig's autocomplete", subcommands: [ { name: "init", description: "initialize fig custom spec boilerplate in current directory", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "create-spec", description: "create spec with given name", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "name", isOptional: true }], }, { name: "compile", description: "compile specs in the current directory", options: [ { name: ["-w", "--watch"], description: "Watch files and re-compile on change", }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "dev", description: "watch for changes and compile specs", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "merge", description: "deep merge new spec into old spec", options: [ { name: ["-n", "--new-file"], description: "Create a new spec file instead of updating the old one", args: { name: "path" }, }, { name: ["-i", "--ignore-props"], description: "The props that should always be overridden.", args: { name: "props" }, }, { name: ["--ignore-command-props"], description: "The command props that should always be overridden.", args: { name: "props" }, }, { name: ["--ignore-option-props"], description: "The option props that should always be overridden.", args: { name: "props" }, }, { name: ["--ignore-arg-props"], description: "The arg props that should always be overridden.", args: { name: "props" }, }, { name: ["-p", "--preset"], description: "Use a preset", args: { name: "name", suggestions: ["commander", "oclif", "cobra", "clap", "swift-argument-parser"], }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "oldspec" }, { name: "newspec" }], }, { name: "version", subcommands: [ { name: "add-diff", description: "generate version diff from new spec and add into old spec", options: [ { name: ["-n", "--new-path"], description: "Create a new spec folder instead of overwriting the old one", args: { name: "path" }, }, { name: ["--use-minor-base"], description: "Create a new version file per minor version", }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "specName" }, { name: "newSpecFile" }, { name: "diffVersion" }], }, { name: "init-spec", description: "generate versioned spec in folder specified by path", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "path" }], }, { name: "precompute-specs", description: "[Unimplemented] Precompute versioned specs before publishing the specs repo (unimplemented)", options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], args: [{ name: "files", isVariadic: true }], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true }, }, ], options: [ { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }, { name: "help", description: "display help for command", priority: 49, args: { name: "command", isOptional: true }, }, ], options: [ { name: ["-V", "--version"], description: "output the version number" }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; old.ts000066400000000000000000000054771471722043300360760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/autocomplete-tools-cliconst completionSpec: Fig.Spec = { name: "@withfig/autocomplete-tools", description: "Dev tools for fig's autocomplete", icon: "https://fig.io/icons/fig-light.png", subcommands: [ { name: "init", description: "Install one or more packages", }, { name: "create-spec", description: "Create a new spec in the src/ folder", args: { name: "name", description: "The name of the new spec", }, }, { name: "compile", description: "Compile specs in the current directory", }, { name: "dev", description: "Compile specs in the current directory and watch for changes", }, { name: "merge", description: "Deep merge new spec into old spec", args: [ { name: "oldspec", description: "The path to the spec in which deep merge the new one", template: "filepaths", }, { name: "newspec", description: "The path of the new spec", template: "filepaths", }, ], options: [ { name: ["-p", "--preset"], description: "Use the preset of a given integration tool", args: { name: "name", suggestions: [ "commander", "oclif", "cobra", "clap", "swift-argument-parser", ], }, priority: 76, exclusiveOn: [ "--ignore-props", "--ignore-command-props", "--ignore-option-props", "--ignore-arg-props", ], }, { name: ["-i", "--ignore-props"], description: "A comma separated list of props not to be preserved", args: { name: "props", }, exclusiveOn: ["--preset"], }, { name: "--ignore-command-props", description: "The command props that should always be overridden", args: { name: "props", }, exclusiveOn: ["--preset"], }, { name: "--ignore-option-props", description: "The option props that should always be overridden", args: { name: "props", }, exclusiveOn: ["--preset"], }, { name: "--ignore-arg-props", description: "The arg props that should always be overridden", args: { name: "props", }, exclusiveOn: ["--preset"], }, { name: ["-n", "--new-file"], description: "Create a new spec file instead of updating the old one", args: { name: "path", template: "filepaths", }, }, ], }, ], }; export default completionSpec; commander-preset/000077500000000000000000000000001471722043300335745ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesconfig.json000066400000000000000000000000331471722043300357300ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/commander-preset{ "preset": "commander" }expected.ts000066400000000000000000000011641471722043300357470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/commander-preset// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "", options: [ { name: ["-n", "--number"], description: "specify numbers", args: { name: "value", isVariadic: true, template: ["filepaths"] }, }, { name: ["-l", "--letter"], description: "specify letters", args: { name: "value", isOptional: true, isVariadic: true, suggestions: ["zoo", "baz"], }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; new.ts000066400000000000000000000011341471722043300347340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/commander-preset// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "", options: [ { name: ["-n", "--number"], description: "specify numbers", args: { name: "value", isVariadic: true }, }, { name: ["-l", "--letter"], description: "specify letters", args: { name: "value", isOptional: true, isVariadic: true, suggestions: ["zoo", "baz"], }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; old.ts000066400000000000000000000011741471722043300347250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/commander-preset// Autogenerated by @fig/complete-commander const completionSpec: Fig.Spec = { name: "", options: [ { name: ["-n", "--number"], description: "specify numbers", args: { name: "value", isVariadic: true, template: ["filepaths"] }, }, { name: ["-l", "--letter"], description: "specify letters", args: { name: "value", isOptional: true, isVariadic: true, suggestions: ["foo", "bar", "baz"], }, }, { name: ["-h", "--help"], description: "display help for command", priority: 49, }, ], }; export default completionSpec; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/expo-cli/000077500000000000000000000000001471722043300321265ustar00rootroot00000000000000expected.ts000066400000000000000000004566101471722043300342340ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/expo-cliconst _gen: Record = { npm: { script(context) { if (context[context.length - 1] === "") return ""; const searchTerm = context[context.length - 1]; return `curl -s -H "Accept: application/json" "https://api.npms.io/v2/search?q=${searchTerm}&size=20"`; }, postProcess(script: string) { try { const { results } = JSON.parse(script); return results.map((item) => ({ name: item.package.name, description: item.package.description, })) as Fig.Suggestion[]; } catch (e) { return []; } }, }, "xcode-configuration": { script: "xcodebuild -project ios/*.xcodeproj -list -json", postProcess: (script: string) => JSON.parse(script).project.configurations.map((name) => ({ name })), }, "xcode-scheme": { script: "xcodebuild -project ios/*.xcodeproj -list -json", postProcess: (script: string) => JSON.parse(script).project.schemes.map((name) => ({ name })), }, "xcode-devices": { script: "xcrun xctrace list devices", postProcess: (script: string) => script .split("\n") .filter((item) => !item.match(/^=/)) .filter(Boolean) .map((item) => item.split(/(.*?) (\(([0-9.]+)\) )?\(([0-9A-F-]+)\)/i)) // filter catalyst .filter((item: string[] | null) => !!item?.[3]) .map(([, name, , osVersion, udid]) => ({ displayName: `${name.trim()} (${osVersion})`, name: udid, })), }, "max-workers": { script: "sysctl -n hw.ncpu", postProcess: (script: string) => { const count = Number(script); return Array.from({ length: count }, (_, i) => { const v = count - i; return { priority: v, name: String(v), }; }); }, }, }; const completionSpec: Fig.Spec = { name: "expo-cli", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", description: "Tools for creating, running, and deploying Universal Expo and React Native apps", options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-V", "--version"], description: "Output the version number", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", priority: 1, }, ], subcommands: [ { name: ["build:ios", "bi"], hidden: false, description: "Build and sign a standalone IPA for the Apple App Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear all credentials stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-dist-cert", description: "Remove Distribution Certificate stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-key", description: "Remove Push Notifications Key stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-cert", description: "Remove Push Notifications Certificate stored on Expo servers. Use of Push Notifications Certificates is deprecated", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-provisioning-profile", description: "Remove Provisioning Profile stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-r", "--revoke-credentials"], description: "Revoke credentials on developer.apple.com, select appropriate using --clear-* options", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-t", "--type"], description: "Type of build: [archive|simulator]", args: { name: "archive|simulator", isOptional: false, suggestions: [ { name: "archive", }, { name: "simulator", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after scheduling build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--team-id", description: "Apple Team ID", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--dist-p12-path", description: "Path to your Distribution Certificate P12 (set password as EXPO_IOS_DIST_P12_PASSWORD environment variable)", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--push-id", description: "Push Key ID (ex: 123AB4C56D)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--push-p8-path", description: "Path to your Push Key .p8 file", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--provisioning-profile-path", description: "Path to your Provisioning Profile", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-credentials-check", description: "Skip checking credentials", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["build:android", "ba"], hidden: false, description: "Build and sign a standalone APK or App Bundle for the Google Play Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear stored credentials", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after triggering build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--keystore-path", description: "Path to your Keystore: *.jks", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--keystore-alias", description: "Keystore Alias", args: { name: "alias", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--generate-keystore", description: "[deprecated] Generate Keystore if one does not exist", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-t", "--type"], description: "Type of build: [app-bundle|apk]", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "build:web", hidden: false, description: "Build the web app for production", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear"], description: "Clear all cached build files and assets", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--no-pwa", description: "Prevent webpack from generating the manifest.json and injecting meta into the index.html head", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-d", "--dev"], description: "Turns dev flag on before bundling", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webpack.png", }, { name: ["build:status", "bs"], hidden: false, description: "Get the status of the latest build for the project", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, { name: "bundle-assets", hidden: true, description: "Bundle assets for a detached app. This command should be executed from xcode or gradle", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dest", description: "Destination directory for assets", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: "client:ios", hidden: false, description: "Experimental: build a custom version of Expo Go for iOS using your own Apple credentials", priority: 52, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/download.png", }, { name: "client:install:ios", hidden: false, description: "Install Expo Go for iOS on the simulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignoring the current project version", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "client:install:android", hidden: false, description: "Install Expo Go for Android on a connected device or emulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-d", "--device"], description: "Device name to install the client on", args: { name: "device", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignore the current project version", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "config", hidden: false, description: "Show the project config", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--type"], description: "Type of config to show", args: { name: "public|prebuild|introspect", isOptional: false, suggestions: [ { name: "public", }, { name: "prebuild", }, { name: "introspect", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--full", description: "Include all project config data", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/config.png", }, { name: "credentials:manager", hidden: false, description: "Manage your credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-p", "--platform"], description: "Platform: [android|ios]", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/list.png", }, { name: "customize:web", hidden: false, description: "Eject the default web files for customization", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-f", "--force"], description: "Allows replacing existing files", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/force.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/customize.png", }, { name: "diagnostics", hidden: false, description: "Log environment info to the console", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/diagnostics.png", }, { name: "doctor", hidden: false, description: "Diagnose issues with the project", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/doctor.png", }, { name: "eject", hidden: false, description: "Create native iOS and Android project files. Learn more: https://docs.expo.dev/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/eject.png", }, { name: "export", hidden: false, description: "Export the static files of the app for hosting it on a web server", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--platform", description: "Platforms: android, ios, all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--public-url"], description: "The public url that will host the static files (required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--output-dir", description: "The directory to export the static files to", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: ["-a", "--asset-url"], description: "The absolute or relative url that will host the asset files", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-d", "--dump-assetmap"], description: "Dump the asset map for further processing", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--dev", description: "Configure static files for developing locally using a non-https server", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: ["-s", "--dump-sourcemap"], description: "Dump the source map for debugging the JS bundle", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-t", "--target"], description: "Target environment for which this export is intended", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--merge-src-dir", description: "A repeatable source dir to merge in", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--merge-src-url", description: "A repeatable source tar.gz file URL to merge in", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, generators: _gen[`max-workers`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--experimental-bundle", description: "Export bundles for use with EAS updates", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "fetch:ios:certs", hidden: false, description: "Download the project's iOS standalone app signing credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "fetch:android:keystore", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:hashes", hidden: false, description: "Compute and log the project's Android key hashes", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:upload-cert", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["init", "i"], hidden: false, description: "Create a new Expo project", priority: 64, args: { isOptional: true, name: "name", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--template"], description: 'Specify which template to use. Valid options are "blank", "tabs", "bare-minimum" or a package on npm (e.g. "expo-template-bare-minimum") that includes an Expo project template', args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when Yarn is installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, { name: "--no-install", description: "Skip installing npm packages or CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--name", description: "The name of your app visible on the home screen", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--yes", description: 'Use default options. Same as "expo init . --template blank', args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/init.png", }, { name: ["install", "add"], hidden: false, description: "Install a unimodule or other package to a project", priority: 64, args: { isOptional: true, isVariadic: true, name: "packages", debounce: true, generators: _gen.npm, }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, ], icon: "fig://icon?type=npm", }, { name: ["login", "signin"], hidden: false, description: "Login to an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-u", "--username"], description: "Username", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--password"], description: "Password", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--otp", description: "One-time password from your 2FA device", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/login.png", }, { name: "logout", hidden: false, description: "Logout of an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/logout.png", }, { name: "prebuild", hidden: false, description: "Experimental: Create native iOS and Android project files before building natively. Learn more: https://docs.expo.dev/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--clean", description: "Delete the native folders and regenerate them before applying changes", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--template", description: "Project template to clone from. File path pointing to a local tar file or a github repo", args: { name: "template", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skip-dependency-update", description: "Preserves versions of listed packages in package.json (comma separated list)", args: { name: "dependencies", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/prebuild.png", }, { name: "prepare-detached-build", hidden: true, description: "Prepare a detached project for building", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skipXcodeConfig", description: "[iOS only] if true, do not configure Xcode project", args: { name: "bool", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: ["publish", "p"], hidden: false, description: "Deploy a project to Expo hosting", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output from the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-s", "--send-to"], description: "A phone number or email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-t", "--target"], description: "Target environment for which this publish is intended. Options are `managed` or `bare`", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, generators: _gen[`max-workers`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--release-channel", description: "The release channel to publish to. Default is 'default'", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:set", "ps"], hidden: false, description: "Specify the channel to serve a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "The channel to set the published release. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--publish-id"], description: "The id of the published release to serve from the channel. (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:rollback", "pr"], hidden: false, description: "Undo an update to a channel", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--channel-id", description: "This flag is deprecated", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--release-channel"], description: "The channel to rollback from. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-s", "--sdk-version"], description: "The sdk version to rollback. (Required)", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-p", "--platform"], description: "The platform to rollback", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish-rollback.png", }, { name: ["publish:history", "ph"], hidden: false, description: "Log the project's releases", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "Filter by release channel. If this flag is not included, the most recent publications will be shown", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--count", description: "Number of logs to view, maximum 100, default 5", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-p", "--platform"], description: "Filter by platform, android or ios. Defaults to both platforms", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-s", "--sdk-version"], description: "Filter by SDK version e.g. 35.0.0", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:details", "pd"], hidden: false, description: "Log details of a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--publish-id", description: "Publication id. (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: "push:android:upload", hidden: false, description: "Upload an FCM key for Android push notifications", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--api-key", description: "Server API key for FCM", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:show", hidden: false, description: "Log the value currently in use for FCM notifications for this project", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:clear", hidden: false, description: "Delete a previously uploaded FCM credential", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push-clear.png", }, { name: "register", hidden: false, description: "Sign up for a new Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/register.png", }, { name: "run:android", hidden: false, description: "Run the Android app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name to build the app on", args: { name: "device", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--variant", description: "(Android) build variant", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "run:ios", hidden: false, description: "Run the iOS app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing dependencies", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name or UDID to build the app on", args: { name: "device", isOptional: false, generators: _gen[`xcode-devices`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--scheme", description: "Scheme to build", args: { name: "scheme", isOptional: true, generators: _gen[`xcode-scheme`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--configuration", description: "Xcode configuration to use. Debug or Release. Default: Debug", args: { name: "configuration", isOptional: false, generators: _gen[`xcode-configuration`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "send", hidden: false, description: "Share the project's URL to an email address", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "Email address to send the URL to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["start", "r"], hidden: false, description: "Start a local dev server for the app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, generators: _gen[`max-workers`], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: ["-p", "--port"], description: "Port to start the native Metro bundler on (does not apply to web or tunnel). Default: 19000", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play.png", }, { name: ["start:web", "web"], hidden: false, description: "Start a Webpack dev server for the web app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-p", "--port"], description: "Port to start the Webpack bundler on. Default: 19006", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["upgrade", "update"], hidden: false, description: "Upgrade the project packages and config for the given SDK version", priority: 61, args: { isOptional: true, name: "sdk-version", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/upgrade.png", }, { name: ["upload:android", "ua"], hidden: false, description: "Upload an Android binary to the Google Play Store", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .apk/.aab file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--key", description: "Path to the JSON key used to authenticate with Google Play", args: { name: "key", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--android-package", description: "Android package name (using expo.android.package from app.json by default)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "--type", description: "Archive type: apk, aab", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--track", description: "The track of the application to use, choose from: production, beta, alpha, internal, rollout", args: { name: "track", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-status", description: "Release status (used when uploading new apks/aabs), choose from: completed, draft, halted, inProgress", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--use-submission-service", description: "Experimental: Use Submission Service for uploading your app. The upload process will happen on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--verbose", description: "Always print logs from Submission Service", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/verbose.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: ["upload:ios", "ui"], hidden: false, description: "Unsupported: Use eas submit or Transporter app instead", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build (default)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .ipa file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id", description: "Your Apple ID username (you can also set EXPO_APPLE_ID env variable)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--itc-team-id", description: "App Store Connect Team ID - this option is deprecated, the proper ID is resolved automatically", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id-password", description: "Your Apple ID password (you can also set EXPO_APPLE_PASSWORD env variable)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--app-name", description: "The name of your app as it will appear on the App Store, this can't be longer than 30 characters (default: expo.name from app.json)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--company-name", description: "The name of your company, needed only for the first upload of any app to App Store", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--sku", description: "A unique ID for your app that is not visible on the App Store, will be generated unless provided", args: { name: "sku", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--language", description: "Primary language (e.g. English, German; run `expo upload:ios --help` to see the list of available languages)", args: { name: "language", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: ["url", "u"], hidden: false, description: "Log a URL for opening the project in Expo Go", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/url.png", }, { name: "url:ipa", hidden: false, description: "Log the download URL for the standalone iOS binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: "url:apk", hidden: false, description: "Log the download URL for the standalone Android binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: "webhooks", hidden: false, description: "List all webhooks for a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook.png", }, { name: "webhooks:add", hidden: false, description: "Add a webhook to a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--url", description: "URL to request. (Required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build] (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-add.png", }, { name: "webhooks:remove", hidden: false, description: "Delete a webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to remove", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-remove.png", }, { name: "webhooks:update", hidden: false, description: "Update an existing webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to update", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--url", description: "URL the webhook will request", args: { name: "url", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build]", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-update.png", }, { name: ["whoami", "w"], hidden: false, description: "Return the currently authenticated account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, ], }; export default completionSpec; new.ts000066400000000000000000003264241471722043300332230ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/expo-cliconst completionSpec: Fig.Spec = { name: "expo-cli", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", description: "Tools for creating, running, and deploying Universal Expo and React Native apps", options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-V", "--version"], description: "Output the version number", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", priority: 1, }, ], subcommands: [ { name: ["build:ios", "bi"], hidden: false, description: "Build and sign a standalone IPA for the Apple App Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear all credentials stored on Expo servers", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-dist-cert", description: "Remove Distribution Certificate stored on Expo servers", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-key", description: "Remove Push Notifications Key stored on Expo servers", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-cert", description: "Remove Push Notifications Certificate stored on Expo servers. Use of Push Notifications Certificates is deprecated", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-provisioning-profile", description: "Remove Provisioning Profile stored on Expo servers", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-r", "--revoke-credentials"], description: "Revoke credentials on developer.apple.com, select appropriate using --clear-* options", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-t", "--type"], description: "Type of build: [archive|simulator]", args: { name: "archive|simulator", isOptional: false, suggestions: [ { name: "archive", }, { name: "simulator", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after scheduling build", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--team-id", description: "Apple Team ID", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--dist-p12-path", description: "Path to your Distribution Certificate P12 (set password as EXPO_IOS_DIST_P12_PASSWORD environment variable)", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--push-id", description: "Push Key ID (ex: 123AB4C56D)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--push-p8-path", description: "Path to your Push Key .p8 file", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--provisioning-profile-path", description: "Path to your Provisioning Profile", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-credentials-check", description: "Skip checking credentials", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["build:android", "ba"], hidden: false, description: "Build and sign a standalone APK or App Bundle for the Google Play Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear stored credentials", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after triggering build", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--keystore-path", description: "Path to your Keystore: *.jks", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--keystore-alias", description: "Keystore Alias", args: { name: "alias", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--generate-keystore", description: "[deprecated] Generate Keystore if one does not exist", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-t", "--type"], description: "Type of build: [app-bundle|apk]", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "build:web", hidden: false, description: "Build the web app for production", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear"], description: "Clear all cached build files and assets", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--no-pwa", description: "Prevent webpack from generating the manifest.json and injecting meta into the index.html head", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-d", "--dev"], description: "Turns dev flag on before bundling", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webpack.png", }, { name: ["build:status", "bs"], hidden: false, description: "Get the status of the latest build for the project", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, { name: "bundle-assets", hidden: true, description: "Bundle assets for a detached app. This command should be executed from xcode or gradle", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dest", description: "Destination directory for assets", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: "client:ios", hidden: false, description: "Experimental: build a custom version of Expo Go for iOS using your own Apple credentials", priority: 52, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/download.png", }, { name: "client:install:ios", hidden: false, description: "Install Expo Go for iOS on the simulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignoring the current project version", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "client:install:android", hidden: false, description: "Install Expo Go for Android on a connected device or emulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-d", "--device"], description: "Device name to install the client on", args: { name: "device", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignore the current project version", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "config", hidden: false, description: "Show the project config", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--type"], description: "Type of config to show", args: { name: "public|prebuild|introspect", isOptional: false, suggestions: [ { name: "public", }, { name: "prebuild", }, { name: "introspect", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--full", description: "Include all project config data", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/config.png", }, { name: "credentials:manager", hidden: false, description: "Manage your credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-p", "--platform"], description: "Platform: [android|ios]", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/list.png", }, { name: "customize:web", hidden: false, description: "Eject the default web files for customization", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-f", "--force"], description: "Allows replacing existing files", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/force.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/customize.png", }, { name: "diagnostics", hidden: false, description: "Log environment info to the console", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/diagnostics.png", }, { name: "doctor", hidden: false, description: "Diagnose issues with the project", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/doctor.png", }, { name: "eject", hidden: false, description: "Create native iOS and Android project files. Learn more: https://docs.expo.dev/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", }, icon: "fig://icon?type=npm", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/eject.png", }, { name: "export", hidden: false, description: "Export the static files of the app for hosting it on a web server", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--platform", description: "Platforms: android, ios, all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--public-url"], description: "The public url that will host the static files (required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--output-dir", description: "The directory to export the static files to", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: ["-a", "--asset-url"], description: "The absolute or relative url that will host the asset files", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-d", "--dump-assetmap"], description: "Dump the asset map for further processing", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--dev", description: "Configure static files for developing locally using a non-https server", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: ["-s", "--dump-sourcemap"], description: "Dump the source map for debugging the JS bundle", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-t", "--target"], description: "Target environment for which this export is intended", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--merge-src-dir", description: "A repeatable source dir to merge in", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--merge-src-url", description: "A repeatable source tar.gz file URL to merge in", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--experimental-bundle", description: "Export bundles for use with EAS updates", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "fetch:ios:certs", hidden: false, description: "Download the project's iOS standalone app signing credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "fetch:android:keystore", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:hashes", hidden: false, description: "Compute and log the project's Android key hashes", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:upload-cert", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["init", "i"], hidden: false, description: "Create a new Expo project", priority: 64, args: { isOptional: true, name: "name", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--template"], description: 'Specify which template to use. Valid options are "blank", "tabs", "bare-minimum" or a package on npm (e.g. "expo-template-bare-minimum") that includes an Expo project template', args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when Yarn is installed)", args: { name: "boolean", }, icon: "fig://icon?type=yarn", }, { name: "--no-install", description: "Skip installing npm packages or CocoaPods", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--name", description: "The name of your app visible on the home screen", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--yes", description: 'Use default options. Same as "expo init . --template blank', args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/init.png", }, { name: ["install", "add"], hidden: false, description: "Install a unimodule or other package to a project", priority: 64, args: { isOptional: true, isVariadic: true, name: "packages", debounce: true, }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", }, icon: "fig://icon?type=yarn", }, ], icon: "fig://icon?type=npm", }, { name: ["login", "signin"], hidden: false, description: "Login to an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-u", "--username"], description: "Username", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--password"], description: "Password", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--otp", description: "One-time password from your 2FA device", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/login.png", }, { name: "logout", hidden: false, description: "Logout of an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/logout.png", }, { name: "prebuild", hidden: false, description: "Experimental: Create native iOS and Android project files before building natively. Learn more: https://docs.expo.dev/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--clean", description: "Delete the native folders and regenerate them before applying changes", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", }, icon: "fig://icon?type=npm", }, { name: "--template", description: "Project template to clone from. File path pointing to a local tar file or a github repo", args: { name: "template", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skip-dependency-update", description: "Preserves versions of listed packages in package.json (comma separated list)", args: { name: "dependencies", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/prebuild.png", }, { name: "prepare-detached-build", hidden: true, description: "Prepare a detached project for building", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skipXcodeConfig", description: "[iOS only] if true, do not configure Xcode project", args: { name: "bool", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: ["publish", "p"], hidden: false, description: "Deploy a project to Expo hosting", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output from the Metro bundler", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-s", "--send-to"], description: "A phone number or email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-t", "--target"], description: "Target environment for which this publish is intended. Options are `managed` or `bare`", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--release-channel", description: "The release channel to publish to. Default is 'default'", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:set", "ps"], hidden: false, description: "Specify the channel to serve a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "The channel to set the published release. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--publish-id"], description: "The id of the published release to serve from the channel. (Required)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:rollback", "pr"], hidden: false, description: "Undo an update to a channel", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--channel-id", description: "This flag is deprecated", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--release-channel"], description: "The channel to rollback from. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-s", "--sdk-version"], description: "The sdk version to rollback. (Required)", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-p", "--platform"], description: "The platform to rollback", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish-rollback.png", }, { name: ["publish:history", "ph"], hidden: false, description: "Log the project's releases", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "Filter by release channel. If this flag is not included, the most recent publications will be shown", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--count", description: "Number of logs to view, maximum 100, default 5", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-p", "--platform"], description: "Filter by platform, android or ios. Defaults to both platforms", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-s", "--sdk-version"], description: "Filter by SDK version e.g. 35.0.0", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:details", "pd"], hidden: false, description: "Log details of a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--publish-id", description: "Publication id. (Required)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: "push:android:upload", hidden: false, description: "Upload an FCM key for Android push notifications", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--api-key", description: "Server API key for FCM", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:show", hidden: false, description: "Log the value currently in use for FCM notifications for this project", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:clear", hidden: false, description: "Delete a previously uploaded FCM credential", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push-clear.png", }, { name: "register", hidden: false, description: "Sign up for a new Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/register.png", }, { name: "run:android", hidden: false, description: "Run the Android app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name to build the app on", args: { name: "device", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--variant", description: "(Android) build variant", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "run:ios", hidden: false, description: "Run the iOS app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing dependencies", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name or UDID to build the app on", args: { name: "device", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--scheme", description: "Scheme to build", args: { name: "scheme", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--configuration", description: "Xcode configuration to use. Debug or Release. Default: Debug", args: { name: "configuration", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "send", hidden: false, description: "Share the project's URL to an email address", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "Email address to send the URL to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["start", "r"], hidden: false, description: "Start a local dev server for the app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: ["-p", "--port"], description: "Port to start the native Metro bundler on (does not apply to web or tunnel). Default: 19000", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play.png", }, { name: ["start:web", "web"], hidden: false, description: "Start a Webpack dev server for the web app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-p", "--port"], description: "Port to start the Webpack bundler on. Default: 19006", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["upgrade", "update"], hidden: false, description: "Upgrade the project packages and config for the given SDK version", priority: 61, args: { isOptional: true, name: "sdk-version", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", }, icon: "fig://icon?type=yarn", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/upgrade.png", }, { name: ["upload:android", "ua"], hidden: false, description: "Upload an Android binary to the Google Play Store", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .apk/.aab file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--key", description: "Path to the JSON key used to authenticate with Google Play", args: { name: "key", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--android-package", description: "Android package name (using expo.android.package from app.json by default)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "--type", description: "Archive type: apk, aab", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--track", description: "The track of the application to use, choose from: production, beta, alpha, internal, rollout", args: { name: "track", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-status", description: "Release status (used when uploading new apks/aabs), choose from: completed, draft, halted, inProgress", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--use-submission-service", description: "Experimental: Use Submission Service for uploading your app. The upload process will happen on Expo servers", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--verbose", description: "Always print logs from Submission Service", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/verbose.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: ["upload:ios", "ui"], hidden: false, description: "Unsupported: Use eas submit or Transporter app instead", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build (default)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .ipa file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id", description: "Your Apple ID username (you can also set EXPO_APPLE_ID env variable)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--itc-team-id", description: "App Store Connect Team ID - this option is deprecated, the proper ID is resolved automatically", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id-password", description: "Your Apple ID password (you can also set EXPO_APPLE_PASSWORD env variable)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--app-name", description: "The name of your app as it will appear on the App Store, this can't be longer than 30 characters (default: expo.name from app.json)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--company-name", description: "The name of your company, needed only for the first upload of any app to App Store", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--sku", description: "A unique ID for your app that is not visible on the App Store, will be generated unless provided", args: { name: "sku", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--language", description: "Primary language (e.g. English, German; run `expo upload:ios --help` to see the list of available languages)", args: { name: "language", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: ["url", "u"], hidden: false, description: "Log a URL for opening the project in Expo Go", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/url.png", }, { name: "url:ipa", hidden: false, description: "Log the download URL for the standalone iOS binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: "url:apk", hidden: false, description: "Log the download URL for the standalone Android binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: "webhooks", hidden: false, description: "List all webhooks for a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook.png", }, { name: "webhooks:add", hidden: false, description: "Add a webhook to a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--url", description: "URL to request. (Required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build] (Required)", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-add.png", }, { name: "webhooks:remove", hidden: false, description: "Delete a webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to remove", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-remove.png", }, { name: "webhooks:update", hidden: false, description: "Update an existing webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to update", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--url", description: "URL the webhook will request", args: { name: "url", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build]", args: { name: "boolean", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-update.png", }, { name: ["whoami", "w"], hidden: false, description: "Return the currently authenticated account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, ], }; export default completionSpec; old.ts000066400000000000000000004526031471722043300332070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/expo-cliconst _gen: Record = { npm: { script(context) { if (context[context.length - 1] === "") return ""; const searchTerm = context[context.length - 1]; return `curl -s -H "Accept: application/json" "https://api.npms.io/v2/search?q=${searchTerm}&size=20"`; }, postProcess(script: string) { try { const { results } = JSON.parse(script); return results.map((item) => ({ name: item.package.name, description: item.package.description, })) as Fig.Suggestion[]; } catch (e) { return []; } }, }, "xcode-configuration": { script: "xcodebuild -project ios/*.xcodeproj -list -json", postProcess: (script: string) => JSON.parse(script).project.configurations.map((name) => ({ name })), }, "xcode-scheme": { script: "xcodebuild -project ios/*.xcodeproj -list -json", postProcess: (script: string) => JSON.parse(script).project.schemes.map((name) => ({ name })), }, "xcode-devices": { script: "xcrun xctrace list devices", postProcess: (script: string) => script .split("\n") .filter((item) => !item.match(/^=/)) .filter(Boolean) .map((item) => item.split(/(.*?) (\(([0-9.]+)\) )?\(([0-9A-F-]+)\)/i)) // filter catalyst .filter((item: string[] | null) => !!item?.[3]) .map(([, name, , osVersion, udid]) => ({ displayName: `${name.trim()} (${osVersion})`, name: udid, })), }, "max-workers": { script: "sysctl -n hw.ncpu", postProcess: (script: string) => { const count = Number(script); return Array.from({ length: count }, (_, i) => { const v = count - i; return { priority: v, name: String(v), }; }); }, }, }; const completionSpec: Fig.Spec = { name: "expo-cli", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", description: "Tools for creating, running, and deploying Universal Expo and React Native apps", options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-V", "--version"], description: "Output the version number", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", priority: 1, }, ], subcommands: [ { name: ["build:ios", "bi"], hidden: false, description: "Build and sign a standalone IPA for the Apple App Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear all credentials stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-dist-cert", description: "Remove Distribution Certificate stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-key", description: "Remove Push Notifications Key stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-push-cert", description: "Remove Push Notifications Certificate stored on Expo servers. Use of Push Notifications Certificates is deprecated", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--clear-provisioning-profile", description: "Remove Provisioning Profile stored on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-r", "--revoke-credentials"], description: "Revoke credentials on developer.apple.com, select appropriate using --clear-* options", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-t", "--type"], description: "Type of build: [archive|simulator]", args: { name: "archive|simulator", isOptional: false, suggestions: [ { name: "archive", }, { name: "simulator", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after scheduling build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--team-id", description: "Apple Team ID", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--dist-p12-path", description: "Path to your Distribution Certificate P12 (set password as EXPO_IOS_DIST_P12_PASSWORD environment variable)", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--push-id", description: "Push Key ID (ex: 123AB4C56D)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--push-p8-path", description: "Path to your Push Key .p8 file", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--provisioning-profile-path", description: "Path to your Provisioning Profile", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-credentials-check", description: "Skip checking credentials", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["build:android", "ba"], hidden: false, description: "Build and sign a standalone APK or App Bundle for the Google Play Store", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear-credentials"], description: "Clear stored credentials", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--release-channel", description: "Pull from specified release channel", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--no-publish", description: "Disable automatic publishing before building", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--no-wait", description: "Exit immediately after triggering build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--keystore-path", description: "Path to your Keystore: *.jks", args: { name: "path", isOptional: false, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--keystore-alias", description: "Keystore Alias", args: { name: "alias", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--generate-keystore", description: "[deprecated] Generate Keystore if one does not exist", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--skip-workflow-check", description: "Skip warning about build service bare workflow limitations", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-t", "--type"], description: "Type of build: [app-bundle|apk]", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "build:web", hidden: false, description: "Build the web app for production", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--clear"], description: "Clear all cached build files and assets", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--no-pwa", description: "Prevent webpack from generating the manifest.json and injecting meta into the index.html head", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-d", "--dev"], description: "Turns dev flag on before bundling", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webpack.png", }, { name: ["build:status", "bs"], hidden: false, description: "Get the status of the latest build for the project", priority: 59, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, { name: "bundle-assets", hidden: true, description: "Bundle assets for a detached app. This command should be executed from xcode or gradle", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dest", description: "Destination directory for assets", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: "client:ios", hidden: false, description: "Experimental: build a custom version of Expo Go for iOS using your own Apple credentials", priority: 52, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--apple-id", description: "Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable)", args: { name: "login", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/download.png", }, { name: "client:install:ios", hidden: false, description: "Install Expo Go for iOS on the simulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignoring the current project version", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "client:install:android", hidden: false, description: "Install Expo Go for Android on a connected device or emulator", priority: 62, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Install the latest version of Expo Go, ignore the current project version", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "config", hidden: false, description: "Show the project config", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--type"], description: "Type of config to show", args: { name: "public|prebuild|introspect", isOptional: false, suggestions: [ { name: "public", }, { name: "prebuild", }, { name: "introspect", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--full", description: "Include all project config data", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/config.png", }, { name: "credentials:manager", hidden: false, description: "Manage your credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-p", "--platform"], description: "Platform: [android|ios]", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/list.png", }, { name: "customize:web", hidden: false, description: "Eject the default web files for customization", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-f", "--force"], description: "Allows replacing existing files", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/force.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/customize.png", }, { name: "diagnostics", hidden: false, description: "Log environment info to the console", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/diagnostics.png", }, { name: "doctor", hidden: false, description: "Diagnose issues with the project", priority: 61, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/doctor.png", }, { name: "eject", hidden: false, description: "Create native iOS and Android project files. Learn more: https://docs.expo.io/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/eject.png", }, { name: "export", hidden: false, description: "Export the static files of the app for hosting it on a web server", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-p", "--public-url"], description: "The public url that will host the static files. (Required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--output-dir", description: "The directory to export the static files to. Default directory is `dist`", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: ["-a", "--asset-url"], description: "The absolute or relative url that will host the asset files. Default is './assets', which will be resolved against the public-url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-d", "--dump-assetmap"], description: "Dump the asset map for further processing", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--dev", description: "Configure static files for developing locally using a non-https server", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: ["-s", "--dump-sourcemap"], description: "Dump the source map for debugging the JS bundle", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-t", "--target"], description: "Target environment for which this export is intended", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--merge-src-dir", description: "A repeatable source dir to merge in", args: { name: "dir", isOptional: false, template: "folders", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--merge-src-url", description: "A repeatable source tar.gz file URL to merge in", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { generators: _gen[`max-workers`], name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--experimental-bundle", description: "Export bundles for use with EAS updates", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "fetch:ios:certs", hidden: false, description: "Download the project's iOS standalone app signing credentials", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "fetch:android:keystore", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:hashes", hidden: false, description: "Compute and log the project's Android key hashes", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "fetch:android:upload-cert", hidden: false, description: "Download the project's Android keystore", priority: 58, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["init", "i"], hidden: false, description: "Create a new Expo project", priority: 64, args: { isOptional: true, name: "name", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-t", "--template"], description: 'Specify which template to use. Valid options are "blank", "tabs", "bare-minimum" or a package on npm (e.g. "expo-template-bare-minimum") that includes an Expo project template', args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when Yarn is installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, { name: "--no-install", description: "Skip installing npm packages or CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--name", description: "The name of your app visible on the home screen", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--yes", description: 'Use default options. Same as "expo init . --template blank', args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/init.png", }, { name: ["install", "add"], hidden: false, description: "Install a unimodule or other package to a project", priority: 64, args: { generators: _gen.npm, isOptional: true, name: "packages", isVariadic: true, debounce: true, }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, ], icon: "fig://icon?type=npm", }, { name: ["login", "signin"], hidden: false, description: "Login to an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-u", "--username"], description: "Username", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--password"], description: "Password", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--otp", description: "One-time password from your 2FA device", args: { name: "string", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/login.png", }, { name: "logout", hidden: false, description: "Logout of an Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/logout.png", }, { name: "prebuild", hidden: false, description: "Experimental: Create native iOS and Android project files before building natively. Learn more: https://docs.expo.io/workflow/customizing/", priority: 53, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-install", description: "Skip installing npm packages and CocoaPods", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--clean", description: "Delete the native folders and regenerate them before applying changes", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when Yarn is not installed)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--template", description: "Project template to clone from. File path pointing to a local tar file or a github repo", args: { name: "template", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/export.png", }, { name: ["-p", "--platform"], description: "Platforms to sync: ios, android, all. Default: all", args: { name: "platform", isOptional: false, suggestions: [ { name: "all", }, { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skip-dependency-update", description: "Preserves versions of listed packages in package.json (comma separated list)", args: { name: "dependencies", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/prebuild.png", }, { name: "prepare-detached-build", hidden: true, description: "Prepare a detached project for building", priority: 51, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--platform", description: "Detached project platform", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--skipXcodeConfig", description: "[iOS only] if true, do not configure Xcode project", args: { name: "bool", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], }, { name: ["publish", "p"], hidden: false, description: "Deploy a project to Expo hosting", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-q", "--quiet"], description: "Suppress verbose output from the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/quiet.png", }, { name: ["-s", "--send-to"], description: "A phone number or email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: ["-t", "--target"], description: "Target environment for which this publish is intended. Options are `managed` or `bare`", args: { name: "managed|bare", isOptional: false, suggestions: [ { name: "managed", }, { name: "bare", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { generators: _gen[`max-workers`], name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--release-channel", description: "The release channel to publish to. Default is 'default'", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:set", "ps"], hidden: false, description: "Specify the channel to serve a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "The channel to set the published release. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-p", "--publish-id"], description: "The id of the published release to serve from the channel. (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:rollback", "pr"], hidden: false, description: "Undo an update to a channel", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--channel-id", description: "This flag is deprecated", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-c", "--release-channel"], description: "The channel to rollback from. (Required)", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-s", "--sdk-version"], description: "The sdk version to rollback. (Required)", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-p", "--platform"], description: "The platform to rollback", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish-rollback.png", }, { name: ["publish:history", "ph"], hidden: false, description: "Log the project's releases", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-c", "--release-channel"], description: "Filter by release channel. If this flag is not included, the most recent publications will be shown", args: { name: "name", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--count", description: "Number of logs to view, maximum 100, default 5", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-p", "--platform"], description: "Filter by platform, android or ios. Defaults to both platforms", args: { name: "platform", isOptional: false, suggestions: [ { name: "android", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "ios", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-s", "--sdk-version"], description: "Filter by SDK version e.g. 35.0.0", args: { name: "version", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/expo.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: ["publish:details", "pd"], hidden: false, description: "Log details of a published release", priority: 60, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--publish-id", description: "Publication id. (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: ["-r", "--raw"], description: "Produce some raw output", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/publish.png", }, { name: "push:android:upload", hidden: false, description: "Upload an FCM key for Android push notifications", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--api-key", description: "Server API key for FCM", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:show", hidden: false, description: "Log the value currently in use for FCM notifications for this project", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push.png", }, { name: "push:android:clear", hidden: false, description: "Delete a previously uploaded FCM credential", priority: 57, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/push-clear.png", }, { name: "register", hidden: false, description: "Sign up for a new Expo account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/register.png", }, { name: "run:android", hidden: false, description: "Run the Android app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name to build the app on", args: { name: "device", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--variant", description: "(Android) build variant", args: { name: "name", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "run:ios", hidden: false, description: "Run the iOS app binary locally", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--no-bundler", description: "Skip starting the Metro bundler", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/metro.png", }, { name: ["-d", "--device"], description: "Device name or UDID to build the app on", args: { generators: _gen[`xcode-devices`], name: "device", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/devices.png", }, { name: ["-p", "--port"], description: "Port to start the Metro bundler on. Default: 8081", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--scheme", description: "Scheme to build", args: { generators: _gen[`xcode-scheme`], name: "scheme", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--configuration", description: "Xcode configuration to use. Debug or Release. Default: Debug", args: { generators: _gen[`xcode-configuration`], name: "configuration", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "send", hidden: false, description: "Share the project's URL to an email address", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "Email address to send the URL to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["start", "r"], hidden: false, description: "Start a local dev server for the app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: ["-c", "--clear"], description: "Clear the Metro bundler cache", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/clear.png", }, { name: "--max-workers", description: "Maximum number of tasks to allow Metro to spawn", args: { generators: _gen[`max-workers`], name: "Number of workers", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: ["-p", "--port"], description: "Port to start the native Metro bundler on (does not apply to web or tunnel). Default: 19000", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play.png", }, { name: ["start:web", "web"], hidden: false, description: "Start a Webpack dev server for the web app", priority: 64, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev", description: "Turn development mode on", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--no-dev", description: "Turn development mode off", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--minify", description: "Minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/minify.png", }, { name: "--no-minify", description: "Do not minify code", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: "--https", description: "To start webpack with https protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--no-https", description: "To start webpack with http protocol", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/skip.png", }, { name: ["-p", "--port"], description: "Port to start the Webpack bundler on. Default: 19006", args: { name: "port", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/number.png", }, { name: ["-s", "--send-to"], description: "An email address to send a link to", args: { name: "dest", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/send.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["upgrade", "update"], hidden: false, description: "Upgrade the project packages and config for the given SDK version", priority: 61, args: { isOptional: true, name: "sdk-version", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--npm", description: "Use npm to install dependencies. (default when package-lock.json exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=npm", }, { name: "--yarn", description: "Use Yarn to install dependencies. (default when yarn.lock exists)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "fig://icon?type=yarn", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/upgrade.png", }, { name: ["upload:android", "ua"], hidden: false, description: "Upload an Android binary to the Google Play Store", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .apk/.aab file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--key", description: "Path to the JSON key used to authenticate with Google Play", args: { name: "key", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/key.png", }, { name: "--android-package", description: "Android package name (using expo.android.package from app.json by default)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: "--type", description: "Archive type: apk, aab", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--track", description: "The track of the application to use, choose from: production, beta, alpha, internal, rollout", args: { name: "track", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--release-status", description: "Release status (used when uploading new apks/aabs), choose from: completed, draft, halted, inProgress", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--use-submission-service", description: "Experimental: Use Submission Service for uploading your app. The upload process will happen on Expo servers", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--verbose", description: "Always print logs from Submission Service", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/verbose.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: ["upload:ios", "ui"], hidden: false, description: "Unsupported: Use eas submit or Transporter app instead", priority: 54, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--latest", description: "Upload the latest build (default)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/latest.png", }, { name: "--id", description: "Id of the build to upload", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--path", description: "Path to the .ipa file", args: { name: "path", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/path.png", }, { name: "--url", description: "App archive url", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id", description: "Your Apple ID username (you can also set EXPO_APPLE_ID env variable)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--itc-team-id", description: "App Store Connect Team ID - this option is deprecated, the proper ID is resolved automatically", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--apple-id-password", description: "Your Apple ID password (you can also set EXPO_APPLE_PASSWORD env variable)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: "--app-name", description: "The name of your app as it will appear on the App Store, this can't be longer than 30 characters (default: expo.name from app.json)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--company-name", description: "The name of your company, needed only for the first upload of any app to App Store", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--sku", description: "A unique ID for your app that is not visible on the App Store, will be generated unless provided", args: { name: "sku", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--language", description: "Primary language (e.g. English, German; run `expo upload:ios --help` to see the list of available languages)", args: { name: "language", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: ["url", "u"], hidden: false, description: "Log a URL for opening the project in Expo Go", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--dev-client", description: "Experimental: Starts the bundler for use with the expo-development-client", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/dev.png", }, { name: "--scheme", description: "Custom URI protocol to use with a dev client", args: { name: "scheme", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/scheme.png", }, { name: ["-a", "--android"], description: "Opens your app in Expo Go on a connected Android device", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/android.png", }, { name: ["-i", "--ios"], description: "Opens your app in Expo Go in a currently running iOS simulator on your computer", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/apple.png", }, { name: ["-w", "--web"], description: "Opens your app in a web browser", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/web.png", }, { name: ["-m", "--host"], description: 'Lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks', args: { name: "mode", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--tunnel", description: "Same as --host tunnel", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/tunnel.png", }, { name: "--lan", description: "Same as --host lan", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lan.png", }, { name: "--localhost", description: "Same as --host localhost", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/localhost.png", }, { name: "--offline", description: "Allows this command to run while offline", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/offline.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/url.png", }, { name: "url:ipa", hidden: false, description: "Log the download URL for the standalone iOS binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/app-store.png", }, { name: "url:apk", hidden: false, description: "Log the download URL for the standalone Android binary", priority: 56, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--public-url", description: "The URL of an externally hosted manifest (for self-hosted apps)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/play-store.png", }, { name: "webhooks", hidden: false, description: "List all webhooks for a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook.png", }, { name: "webhooks:add", hidden: false, description: "Add a webhook to a project", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--url", description: "URL to request. (Required)", args: { name: "url", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build] (Required)", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-add.png", }, { name: "webhooks:remove", hidden: false, description: "Delete a webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to remove", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-remove.png", }, { name: "webhooks:update", hidden: false, description: "Update an existing webhook", priority: 55, args: { isOptional: true, template: "folders", name: "path", }, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, { name: "--id", description: "ID of the webhook to update", args: { name: "id", isOptional: false, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--url", description: "URL the webhook will request", args: { name: "url", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--event", description: "Event type that triggers the webhook. [build]", args: { name: "boolean", suggestions: [ { name: "true", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/true.png", }, { name: "false", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/false.png", }, ], }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/string.png", }, { name: "--secret", description: "Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header", args: { name: "secret", isOptional: true, }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/lock.png", }, { name: "--config", description: "Deprecated: Use app.config.js to switch config files instead", args: { name: "file", isOptional: true, template: "filepaths", }, icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/block.png", priority: 2, }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/webhook-update.png", }, { name: ["whoami", "w"], hidden: false, description: "Return the currently authenticated account", priority: 63, options: [ { name: ["-h", "--help"], priority: 1, description: "Output usage information", icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/help.png", }, ], icon: "https://raw.githubusercontent.com/expo/expo-cli/master/assets/fig/info.png", }, ], }; export default completionSpec; ignored-props/000077500000000000000000000000001471722043300331175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesconfig.json000066400000000000000000000000731471722043300352570ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/ignored-props{ "ignoreProps": [ "default", "displayName" ] }expected.ts000066400000000000000000000004071471722043300352710ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/ignored-propsconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a", default: true }], subcommands: [ { name: "bar", displayName: "bar", hidden: true }, { name: "foo", default: false }, ], }; export default spec; new.ts000066400000000000000000000003721471722043300342620ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/ignored-propsconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a", default: true }], subcommands: [ { name: "bar", displayName: "bar" }, { name: "foo", default: false }, ], }; export default spec; old.ts000066400000000000000000000004161471722043300342460ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/ignored-propsconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a", displayName: "-aaa" }], subcommands: [ { name: "bar", displayName: "barbar", hidden: true }, { name: "foo", default: true }, ], }; export default spec; keep-around-code/000077500000000000000000000000001471722043300334515ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000005031471722043300356200ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-around-codefunction foo() { return 1; } const a = 100; const spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; function bar() { return "hello"; } export default spec; function zoo() { return {}; } new.ts000066400000000000000000000002721471722043300346130ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-around-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000005061471722043300346000ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-around-codefunction foo() { return 1; } const a = 100; const spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; function bar() { return "hello"; } export default spec; function zoo() { return {}; } keep-display-name/000077500000000000000000000000001471722043300336345ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000003451471722043300360070ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-display-nameconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a", displayName: "-aaa" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; new.ts000066400000000000000000000002721471722043300347760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-display-nameconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000003441471722043300347630ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-display-nameconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a", displayName: "-aaa" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; keep-end-code/000077500000000000000000000000001471722043300327275ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000003761471722043300351060ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-end-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; function foo() { return 1; } const a = 100; new.ts000066400000000000000000000002721471722043300340710ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-end-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000003771471722043300340640ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-end-codeconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; function foo() { return 1; } const a = 100; keep-generators/000077500000000000000000000000001471722043300334225ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000015171471722043300355770ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-generatorsconst generator: Fig.Generator = { custom: async (tokens) => [ { name: tokens[0], }, ], }; const generatorMap = { foo: { script: ["foo"], } as Fig.Generator, }; const spec: Fig.Spec = { name: "foo", description: "An updated description", options: [ { name: "-a", args: { name: "push", generators: { script: ["foo"], postProcess: (out) => [ { name: out, }, ], }, }, }, ], subcommands: [ { name: "bar", args: { name: "baz", generators: generator }, displayName: "barbar", }, { name: "foo", options: [ { name: "-a", args: { name: "push", generators: generatorMap.foo }, }, ], }, ], }; export default spec; new.ts000066400000000000000000000005501471722043300345630ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-generatorsconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a", args: { name: "push" } }], subcommands: [ { name: "bar", args: { name: "baz" } }, { name: "foo", options: [ { name: "-a", args: { name: "push" }, }, ], }, ], }; export default spec; old.ts000066400000000000000000000015201471722043300345460ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-generatorsconst generator: Fig.Generator = { custom: async (tokens) => [ { name: tokens[0], }, ], }; const generatorMap = { foo: { script: ["foo"], } as Fig.Generator, }; const spec: Fig.Spec = { name: "foo", description: "A simple description", options: [ { name: "-a", args: { name: "push", generators: { script: ["foo"], postProcess: (out) => [ { name: out, }, ], }, }, }, ], subcommands: [ { name: "bar", displayName: "barbar", args: { name: "baz", generators: generator }, }, { name: "foo", options: [ { name: "-a", args: { name: "push", generators: generatorMap.foo }, }, ], }, ], }; export default spec; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-icon/000077500000000000000000000000001471722043300322605ustar00rootroot00000000000000expected.ts000066400000000000000000000003471471722043300343560ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-iconconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [ { name: "bar", icon: "it should still be here" }, { name: "foo" }, ], }; export default spec; new.ts000066400000000000000000000002721471722043300333430ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-iconconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000003311471722043300333240ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-iconconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a" }], subcommands: [{ name: "bar", icon: "it should still be here" }, { name: "foo" }], }; export default spec; keep-middle-code/000077500000000000000000000000001471722043300334175ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000003761471722043300355760ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-middle-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; function foo() { return 1; } const a = 100; export default spec; new.ts000066400000000000000000000002721471722043300345610ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-middle-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000003771471722043300345540ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-middle-codeconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; function foo() { return 1; } const a = 100; export default spec; keep-start-code/000077500000000000000000000000001471722043300333165ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000003761471722043300354750ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-start-codefunction foo() { return 1; } const a = 100; const spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; new.ts000066400000000000000000000002721471722043300344600ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-start-codeconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a" }], subcommands: [{ name: "bar" }, { name: "foo" }], }; export default spec; old.ts000066400000000000000000000003771471722043300344530ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/keep-start-codefunction foo() { return 1; } const a = 100; const spec: Fig.Spec = { name: "foo", description: "A simple description", options: [{ name: "-a" }], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; no-name-object-item-of-array/000077500000000000000000000000001471722043300355775ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixturesexpected.ts000066400000000000000000000006071471722043300377530ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/no-name-object-item-of-arrayconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [ { name: "-a", args: [ {}, { generators: () => {}, }, { isCommand: true, }, ], displayName: "-aaa", }, ], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "baz" }], }; export default spec; new.ts000066400000000000000000000003161471722043300367400ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/no-name-object-item-of-arrayconst spec: Fig.Spec = { name: "foo", description: "An updated description", options: [{ name: "-a", args: [{}, {}, {}] }], subcommands: [{ name: "bar" }, { name: "baz" }], }; export default spec; old.ts000066400000000000000000000004771471722043300367350ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/fixtures/no-name-object-item-of-arrayconst spec: Fig.Spec = { name: "foo", description: "A simple description", options: [ { name: "-a", displayName: "-aaa", args: [{}, { generators: () => {} }, { isCommand: true }], }, ], subcommands: [{ name: "bar", displayName: "barbar" }, { name: "foo" }], }; export default spec; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/index.ts000066400000000000000000000035251471722043300302210ustar00rootroot00000000000000import fs from "node:fs"; import path from "node:path"; import { merge } from "../src/merge"; const fixturesPath = path.join(__dirname, "fixtures"); const dirs = fs .readdirSync(fixturesPath, { withFileTypes: true }) .filter((file) => file.isDirectory() && file.name !== ".DS_Store"); async function runFixtures() { let hadErrors = false; for (const dir of dirs) { const fixtureDirPath = path.join(fixturesPath, dir.name); const oldSpecPath = path.join(fixtureDirPath, "old.ts"); const newSpecPath = path.join(fixtureDirPath, "new.ts"); const updatedSpecPath = path.join(fixtureDirPath, "updated.ts"); // gitignored const expectedSpecPath = path.join(fixtureDirPath, "expected.ts"); const configPath = path.join(fixtureDirPath, "config.json"); let ignoreProps; let preset; if (fs.existsSync(configPath)) { const config = JSON.parse(fs.readFileSync(configPath, "utf8")); preset = config.preset; ignoreProps = config.ignoreProps; } const oldSpec = fs.readFileSync(oldSpecPath, { encoding: "utf-8" }); const newSpec = fs.readFileSync(newSpecPath, { encoding: "utf-8" }); // eslint-disable-next-line no-await-in-loop const updatedSpec = await merge(oldSpec, newSpec, { ...(preset && { preset }), ...(ignoreProps && Array.isArray(ignoreProps) && { ignore: { commonProps: ignoreProps } }), }); fs.writeFileSync(updatedSpecPath, updatedSpec); if (process.env.OVERWRITE || !fs.existsSync(expectedSpecPath)) { fs.copyFileSync(updatedSpecPath, expectedSpecPath); } else { const expectedSpec = fs.readFileSync(expectedSpecPath); if (!Buffer.from(updatedSpec).equals(expectedSpec)) { hadErrors = true; console.error(`- Fixture ${fixtureDirPath} is failing.`); } } } if (hadErrors) { process.exit(1); } } runFixtures(); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/test/tsconfig.json000066400000000000000000000003111471722043300312370ustar00rootroot00000000000000{ "extends": "@tsconfig/recommended/tsconfig.json", "compilerOptions": { "noEmit": true, "types": ["@types/node", "@withfig/autocomplete-types"] }, "exclude": ["node_modules", "lib"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/merge/tsconfig.json000066400000000000000000000002601471722043300302630ustar00rootroot00000000000000{ "extends": "@tsconfig/recommended/tsconfig.json", "compilerOptions": { "outDir": "./lib", "declaration": true }, "exclude": ["node_modules", "test", "lib"] } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/package.json000066400000000000000000000025231471722043300267470ustar00rootroot00000000000000{ "name": "root", "private": true, "devDependencies": { "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", "eslint": "^8.57.1", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.2.1", "husky": "^9.1.6", "lint-staged": "^15.2.10", "prettier": "3.3.3", "turbo": "^2.1.3" }, "scripts": { "lint": "eslint .", "lint:fix": "pnpm lint --fix", "build": "pnpm run -r build", "test": "pnpm run -r test", "test:overwrite": "pnpm run -r test:overwrite", "postinstall": "husky install && pnpm build", "pre-commit": "lint-staged && pnpm test", "clean": "git clean -Xdf ." }, "packageManager": "pnpm@9.4.0", "workspaces": [ "eslint/*", "types", "types/docs-generator", "shared", "generators", "helpers", "hooks", "merge", "integrations/oclif", "integrations/commander", "cli/create-completion-spec", "cli/publish-spec", "cli/tools-cli" ], "lint-staged": { "*.{ts,js,tsx}": "eslint --fix" }, "fig": { "lint": { "description": "Lint the code and find errors", "icon": "🔍" }, "lint:fix": { "description": "Lint the code and fix errors", "icon": "🧰" } } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/000077500000000000000000000000001471722043300262355ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/000077500000000000000000000000001471722043300273235ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/LICENSE000066400000000000000000000020711471722043300303300ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/README.md000066400000000000000000000015011471722043300305770ustar00rootroot00000000000000# Fig // Cobra CLI ## IMPORTANT: This package has been deprecated and will be removed in the future. Please use `go get github.com/withfig/autocomplete-tools/integrations/cobra` to install the new package. ## For maintainers: update this package in the `integrations/cobra/` instead of here. This Go package is Fig's integration with popular CLI framework [Cobra](https://cobra.dev/). See Fig's docs for how to integrate: [https://fig.io/docs/guides/autocomplete-for-teams/cobra](https://fig.io/docs/guides/autocomplete-for-teams/cobra) ### Contributors This integration was built by [Ethan Orlander](https://github.com/ethanOrlander/). Please see his repo for the original docs, git history, and additional customization information: [https://github.com/EthanOrlander/genFigSpec](https://github.com/EthanOrlander/genFigSpec). golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/fig.go000066400000000000000000000124701471722043300304230ustar00rootroot00000000000000/* * * NOTE: This package directory has been deprecated and won't be updated anymore, * update this package in the `integrations/cobra/` instead of here * */ package genFigSpec import ( "fmt" "strings" ) type BaseSuggestion struct { displayName string description string isDangerous bool hidden bool } type SuggestionType int const ( FOLDER SuggestionType = iota FILE ARG SUBCOMMAND OPTION SPECIAL SHORTCUT ) type Suggestion struct { *BaseSuggestion name string suggestionType SuggestionType } type Names []string type Subcommand struct { *BaseSuggestion name Names subcommands Subcommands options Options args Args } type Subcommands []Subcommand type Options []Option type Args []Arg type Spec struct { *Subcommand name string } type Option struct { *BaseSuggestion name Names args Args isRequired bool isRepeatable bool isPersistent bool exclusiveOn []string dependsOn []string } type Arg struct { name string description string isDangerous bool suggestions []Suggestion //or maybe []string template []Template isVariadic bool isOptional bool isCommand bool isModule bool isScript bool defaultVal string //This is default in the fig spec, but that word is reserved in go } type Template int const ( FOLDERS Template = iota FILEPATHS ) func sanitize(str string) string { sanitized := str sanitized = strings.ReplaceAll(sanitized, "\"", "\\\"") sanitized = strings.ReplaceAll(sanitized, "'", "\\'") sanitized = strings.ReplaceAll(sanitized, "\n", " ") return sanitized } func (names *Names) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, name := range *names { sb.WriteString(fmt.Sprintf(`"%v",`, name)) } sb.WriteString("]") return sb.String() } func (spec *Spec) ToTypescript() string { var sb strings.Builder sb.WriteString("const completionSpec: Fig.Spec = {") sb.WriteString(fmt.Sprintf(`name: "%v",`, spec.name)) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(spec.description))) if len(spec.subcommands) > 0 { sb.WriteString(fmt.Sprintf(`subcommands: %v,`, spec.subcommands.ToTypescript())) } if len(spec.options) > 0 { sb.WriteString(fmt.Sprintf(`options: %v,`, spec.options.ToTypescript())) } if len(spec.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, spec.args.ToTypescript())) } sb.WriteString("}; export default completionSpec;") return sb.String() } func (subcommands *Subcommands) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, subcommand := range *subcommands { sb.WriteString(fmt.Sprintf(`%v,`, subcommand.ToTypescript())) } sb.WriteString("]") return sb.String() } func (subcommand *Subcommand) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: %v,`, subcommand.name.ToTypescript())) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(subcommand.description))) if subcommand.hidden { sb.WriteString(fmt.Sprintf(`hidden: %t,`, subcommand.hidden)) } if len(subcommand.subcommands) > 0 { sb.WriteString(fmt.Sprintf(`subcommands: %v,`, subcommand.subcommands.ToTypescript())) } if len(subcommand.options) > 0 { sb.WriteString(fmt.Sprintf(`options: %v,`, subcommand.options.ToTypescript())) } if len(subcommand.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, subcommand.args.ToTypescript())) } sb.WriteString("}") return sb.String() } func (options *Options) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, option := range *options { sb.WriteString(fmt.Sprintf(`%v,`, option.ToTypescript())) } sb.WriteString("]") return sb.String() } func (option *Option) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: %v,`, option.name.ToTypescript())) sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(option.description))) if option.isPersistent { sb.WriteString(fmt.Sprintf(`isPersistent: %t,`, option.isPersistent)) } if option.hidden { sb.WriteString(fmt.Sprintf(`hidden: %t,`, option.hidden)) } if option.isRepeatable { sb.WriteString(fmt.Sprintf(`isRepeatable: %t,`, option.isRepeatable)) } if option.displayName != "" { sb.WriteString(fmt.Sprintf(`displayName: "%v",`, sanitize(option.displayName))) } if len(option.args) > 0 { sb.WriteString(fmt.Sprintf(`args: %v,`, option.args.ToTypescript())) } if option.isRequired { sb.WriteString(`isRequired: true,`) } sb.WriteString("}") return sb.String() } func (args *Args) ToTypescript() string { var sb strings.Builder sb.WriteString("[") for _, arg := range *args { sb.WriteString(fmt.Sprintf(`%v,`, arg.ToTypescript())) } sb.WriteString("]") return sb.String() } func (arg *Arg) ToTypescript() string { var sb strings.Builder sb.WriteString("{") sb.WriteString(fmt.Sprintf(`name: "%v",`, arg.name)) if arg.description != "" { sb.WriteString(fmt.Sprintf(`description: "%v",`, sanitize(arg.description))) } if arg.defaultVal != "" { sb.WriteString(fmt.Sprintf(`default: "%v",`, arg.defaultVal)) } if len(arg.template) > 0 { sb.WriteString(`template: [`) for _, val := range arg.template { switch val { case FOLDERS: sb.WriteString(`"folders",`) case FILEPATHS: sb.WriteString(`"filepaths",`) } } sb.WriteString(`],`) } sb.WriteString("}") return sb.String() } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/go.mod000066400000000000000000000003211471722043300304250ustar00rootroot00000000000000module github.com/withfig/autocomplete-tools/packages/cobra go 1.17 require ( github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 ) require github.com/inconshreveable/mousetrap v1.0.0 // indirect golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/go.sum000066400000000000000000002325461471722043300304720ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/packages/cobra/main.go000066400000000000000000000130731471722043300306020ustar00rootroot00000000000000/* * * NOTE: This package directory has been deprecated and won't be updated anymore, * update this package in the `integrations/cobra/` instead of here * */ package genFigSpec import ( "fmt" "strings" "github.com/spf13/cobra" "github.com/spf13/pflag" ) var includeHidden bool var figGenCmdUse string = "" var generateCommandArgs func(*cobra.Command) Args type Opts struct { Use string Short string Visible bool Long string commandArgGenerator func(*cobra.Command) Args } func CreateCompletionSpecCommand(options ...Opts) * cobra.Command { Use := "generate-fig-spec" Aliases := []string{"generateFigSpec", "genFigSpec"} Short := "Generate a fig spec" Hidden := true Long := ` Fig is a tool for your command line that adds autocomplete. This command generates a TypeScript file with the skeleton Fig autocomplete spec for your Cobra CLI. ` if len(options) > 0 { if options[0].Use != "" { Use = options[0].Use } if options[0].Short != "" { Short = options[0].Short } if options[0].Long != "" { Long = options[0].Long } if options[0].Visible { Hidden = false } if options[0].commandArgGenerator != nil { generateCommandArgs = options[0].commandArgGenerator } } figGenCmdUse = Use var cmd = &cobra.Command{ Use: Use, Aliases: Aliases, Short: Short, Hidden: Hidden, Long: Long, Run: func(cmd *cobra.Command, args []string) { root := cmd.Root() spec := GenerateCompletionSpec(root) fmt.Println(spec.ToTypescript()) }, } cmd.Flags().BoolVar( &includeHidden, "include-hidden", false, "Include hidden commands in generated Fig autocomplete spec") return cmd } // Deprecated: // this function has been renamed to `CreateCompletionSpecCommand` and may not be available in future releases func NewCmdGenFigSpec(options ...Opts) *cobra.Command { return CreateCompletionSpecCommand(options...) } func GenerateCompletionSpec(root *cobra.Command) Spec { opts := append(options(root.LocalNonPersistentFlags(), false), options(root.PersistentFlags(), true)...) opts = append(opts, makeHelpOption()) spec := Spec{ Subcommand: &Subcommand{ BaseSuggestion: &BaseSuggestion{ description: root.Short, }, options: opts, subcommands: append(subcommands(root, false, Options{}), makeHelpCommand(root)), // We assume CLI is using default help command args: commandArguments(root), }, name: root.Name(), } return spec } // Deprecated: // this function has been renamed to `GenerateCompletionSpec` and may not be available in future releases func MakeFigSpec(root *cobra.Command) Spec { return GenerateCompletionSpec(root) } func subcommands(cmd *cobra.Command, overrideOptions bool, overrides Options) Subcommands { var subs []Subcommand for _, sub := range cmd.Commands() { if sub.Name() == "help" || (!includeHidden && sub.Hidden) || (sub.Use == figGenCmdUse) { continue } var opts Options if overrideOptions { opts = overrides } else { opts = append(options(sub.LocalNonPersistentFlags(), false), options(sub.PersistentFlags(), true)...) } subs = append(subs, Subcommand{ BaseSuggestion: &BaseSuggestion{ description: sub.Short, hidden: sub.Hidden, }, name: append(sub.Aliases, sub.Name()), options: opts, subcommands: subcommands(sub, overrideOptions, overrides), args: commandArguments(sub), }) } return subs } func options(flagSet *pflag.FlagSet, persistent bool) []Option { var opts []Option attachFlags := func(flag *pflag.Flag) { option := Option{ BaseSuggestion: &BaseSuggestion{ description: flag.Usage, hidden: flag.Hidden, }, name: []string{fmt.Sprintf("--%v", flag.Name)}, isRepeatable: strings.Contains(strings.ToLower(flag.Value.Type()), "array"), } if flag.Shorthand != "" { option.name = append(option.name, fmt.Sprintf("-%v", flag.Shorthand)) } if persistent != false { option.isPersistent = true } requiredAnnotation, found := flag.Annotations[cobra.BashCompOneRequiredFlag] if found && requiredAnnotation[0] == "true" { option.isRequired = true } option.args = flagArguments(flag) opts = append(opts, option) } flagSet.VisitAll(attachFlags) return opts } /* * In Cobra, you only specify the number of arguments. * Not sure how we want to handle this (if at all) * https://github.com/spf13/cobra/blob/v1.2.1/user_guide.md#positional-and-custom-arguments */ func commandArguments(cmd *cobra.Command) []Arg { if generateCommandArgs != nil { return generateCommandArgs(cmd) } return []Arg{} } func flagArguments(flag *pflag.Flag) []Arg { var args []Arg defaultVal := flag.DefValue if defaultVal == "[]" { defaultVal = "" } if flag.Value.Type() != "bool" { arg := Arg{ name: flag.Name, defaultVal: defaultVal, } _, foundFilenameAnnotation := flag.Annotations[cobra.BashCompFilenameExt] if foundFilenameAnnotation { arg.template = append(arg.template, FILEPATHS) } _, foundDirectoryAnnotation := flag.Annotations[cobra.BashCompSubdirsInDir] if foundDirectoryAnnotation { arg.template = append(arg.template, FOLDERS) } args = append(args, arg) } return args } func makeHelpCommand(root *cobra.Command) Subcommand { return Subcommand{ BaseSuggestion: &BaseSuggestion{ description: "Help about any command", }, name: []string{"help"}, subcommands: subcommands(root, true, []Option{}), } } func makeHelpOption() Option { return Option{ BaseSuggestion: &BaseSuggestion{ description: fmt.Sprintf("Display help"), }, isPersistent: true, name: []string{"--help", "-h"}, } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/pnpm-lock.yaml000066400000000000000000011720051471722043300272510ustar00rootroot00000000000000lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: .: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.18.0 version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) eslint: specifier: ^8.57.1 version: 8.57.1 eslint-config-airbnb: specifier: ^19.0.4 version: 19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.34.2(eslint@8.57.1))(eslint@8.57.1) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.1 version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) husky: specifier: ^9.1.6 version: 9.1.6 lint-staged: specifier: ^15.2.10 version: 15.2.10 prettier: specifier: 3.3.3 version: 3.3.3 turbo: specifier: ^2.1.3 version: 2.1.3 cli/create-completion-spec: dependencies: commander: specifier: ^11.1.0 version: 11.1.0 picocolors: specifier: ^1.1.0 version: 1.1.0 devDependencies: '@fig/complete-commander': specifier: workspace:^ version: link:../../integrations/commander '@types/node': specifier: ^22.5.2 version: 22.5.2 tsx: specifier: ^4.19.0 version: 4.19.0 typescript: specifier: ^5.5.4 version: 5.5.4 cli/publish-spec: dependencies: commander: specifier: ^11.1.0 version: 11.1.0 esbuild: specifier: ^0.23.1 version: 0.23.1 node-fetch: specifier: ^3.3.2 version: 3.3.2 prettier: specifier: ^3.3.3 version: 3.3.3 prompts: specifier: ^2.4.2 version: 2.4.2 devDependencies: '@fig/complete-commander': specifier: workspace:^ version: link:../../integrations/commander '@types/express': specifier: ^4.17.21 version: 4.17.21 '@types/multer': specifier: ^1.4.12 version: 1.4.12 '@types/node': specifier: ^22.5.2 version: 22.5.2 '@types/node-fetch': specifier: ^2.6.11 version: 2.6.11 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 express: specifier: ^4.21.1 version: 4.21.1 multer: specifier: 1.4.5-lts.1 version: 1.4.5-lts.1 picocolors: specifier: ^1.1.0 version: 1.1.0 tsx: specifier: ^4.19.0 version: 4.19.0 typescript: specifier: ^5.5.4 version: 5.5.4 cli/tools-cli: dependencies: '@esbuild-plugins/node-modules-polyfill': specifier: ^0.2.2 version: 0.2.2(esbuild@0.23.1) '@fig/autocomplete-helpers': specifier: workspace:^ version: link:../../helpers '@fig/autocomplete-merge': specifier: workspace:^ version: link:../../merge '@types/semver': specifier: ^7.5.8 version: 7.5.8 chalk: specifier: ^4.1.2 version: 4.1.2 chokidar: specifier: ^4.0.1 version: 4.0.1 commander: specifier: ^11.1.0 version: 11.1.0 create-completion-spec: specifier: workspace:^ version: link:../create-completion-spec esbuild: specifier: ^0.23.1 version: 0.23.1 fast-glob: specifier: ^3.3.2 version: 3.3.2 module-from-string: specifier: ^3.3.1 version: 3.3.1 prettier: specifier: ^3.3.3 version: 3.3.3 semver: specifier: ^7.6.3 version: 7.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 devDependencies: '@fig/complete-commander': specifier: workspace:^ version: link:../../integrations/commander '@types/node': specifier: ^22.5.2 version: 22.5.2 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../../types tsx: specifier: ^4.19.0 version: 4.19.0 eslint/config-autocomplete: dependencies: '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 version: 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.0.0 version: 7.11.0(eslint@8.57.0)(typescript@5.4.5) '@withfig/eslint-plugin-fig-linter': specifier: workspace:^ version: link:../plugin-fig-linter eslint: specifier: ^8.56.0 version: 8.57.0 eslint-plugin-compat: specifier: ^4.2.0 version: 4.2.0(eslint@8.57.0) typescript: specifier: '>=4.7.4' version: 5.4.5 eslint/plugin-fig-linter: {} generators: devDependencies: '@types/node': specifier: ^22.5.2 version: 22.5.2 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../types tsx: specifier: ^4.19.0 version: 4.19.0 typescript: specifier: ^5.5.4 version: 5.5.4 vitest: specifier: ^2.1.4 version: 2.1.4(@types/node@22.5.2) helpers: dependencies: semver: specifier: ^7.6.3 version: 7.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 devDependencies: '@tsconfig/recommended': specifier: ^1.0.7 version: 1.0.7 '@types/node': specifier: ^22.5.2 version: 22.5.2 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../types prettier: specifier: ^3.3.3 version: 3.3.3 tsx: specifier: ^4.19.0 version: 4.19.0 vitest: specifier: ^2.1.4 version: 2.1.4(@types/node@22.5.2) hooks: dependencies: '@withfig/api-bindings': specifier: ^0.30.5 version: 0.30.5 react: specifier: ^18.3.1 version: 18.3.1 devDependencies: '@types/react': specifier: ^18.3.5 version: 18.3.5 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../types typescript: specifier: ^5.5.4 version: 5.5.4 integrations/commander: dependencies: prettier: specifier: ^3.3.3 version: 3.3.3 devDependencies: '@types/node': specifier: ^22.5.2 version: 22.5.2 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../../types chalk: specifier: ^5.3.0 version: 5.3.0 commander: specifier: ^11.1.0 version: 11.1.0 tsx: specifier: ^4.19.0 version: 4.19.0 typescript: specifier: ^5.5.4 version: 5.5.4 integrations/oclif: dependencies: '@oclif/core': specifier: ^2.16.0 version: 2.16.0(@types/node@22.5.2)(typescript@5.5.4) prettier: specifier: ^3.3.3 version: 3.3.3 devDependencies: '@types/node': specifier: ^22.5.2 version: 22.5.2 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../../types oclif: specifier: ^3.17.2 version: 3.17.2(@types/node@22.5.2)(encoding@0.1.13)(mem-fs@2.3.0)(typescript@5.5.4) tslib: specifier: ^2.7.0 version: 2.7.0 typescript: specifier: ^5.5.4 version: 5.5.4 merge: dependencies: prettier: specifier: ^3.3.3 version: 3.3.3 ts-morph: specifier: ^23.0.0 version: 23.0.0 typescript: specifier: ^5.5.4 version: 5.5.4 devDependencies: '@tsconfig/recommended': specifier: ^1.0.7 version: 1.0.7 '@types/node': specifier: ^22.5.2 version: 22.5.2 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../types tsx: specifier: ^4.19.0 version: 4.19.0 shared: devDependencies: '@tsconfig/recommended': specifier: ^1.0.7 version: 1.0.7 '@types/node': specifier: ^22.5.2 version: 22.5.2 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@withfig/autocomplete-types': specifier: workspace:^ version: link:../types prettier: specifier: ^3.3.3 version: 3.3.3 typescript: specifier: ^5.5.4 version: 5.5.4 vitest: specifier: ^2.1.4 version: 2.1.4(@types/node@22.5.2) types: devDependencies: '@microsoft/tsdoc': specifier: ^0.15.0 version: 0.15.0 '@types/node': specifier: ^22.5.2 version: 22.5.2 cspell: specifier: ^8.15.2 version: 8.15.2 picocolors: specifier: ^1.1.0 version: 1.1.0 prettier: specifier: ^3.3.3 version: 3.3.3 tsx: specifier: ^4.19.0 version: 4.19.0 typescript: specifier: ^5.5.4 version: 5.5.4 types/docs-generator: devDependencies: '@microsoft/tsdoc': specifier: ^0.15.0 version: 0.15.0 commander: specifier: ^11.1.0 version: 11.1.0 prettier: specifier: ^3.3.3 version: 3.3.3 typescript: specifier: ^5.5.4 version: 5.5.4 packages: '@babel/code-frame@7.24.6': resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.6': resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.6': resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} '@babel/runtime@7.24.6': resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} '@cspell/cspell-bundled-dicts@8.15.2': resolution: {integrity: sha512-e+hxoD/GW7iyK1zMeRFd10yBr9tcClnnqFLxJM+tH1cSzLQ66ouXMIMuJpcd8LOCm7zMRdjTm4R72LehMgL79g==} engines: {node: '>=18'} '@cspell/cspell-json-reporter@8.15.2': resolution: {integrity: sha512-6p9eLdO5RLb1HNf+Rto4RG3tG02y05DutrWdpnK1Agn21EbUKAUIdIcsjQ2N52UeVT5cDvNhkAabKN57sFygag==} engines: {node: '>=18'} '@cspell/cspell-pipe@8.15.2': resolution: {integrity: sha512-TOcLiRiUSh75y+DQrAW59Ix0/D9WPrd4/KPtUShUepS3vLfoxMQ+TwpXfdc8FrzU73Hg5glXXnQjvdx7vAazVQ==} engines: {node: '>=18'} '@cspell/cspell-resolver@8.15.2': resolution: {integrity: sha512-XOcHfkKCN+a3zZMexK/BLmDxsqku8Q5ASqYu7JBFsu/axS4K11bkcQMxYoOvHVGBv20vb/gM2D+9MePuxAfssg==} engines: {node: '>=18'} '@cspell/cspell-service-bus@8.15.2': resolution: {integrity: sha512-g9rhMIU0DX+avIQHFu0Mx3LAFi4lG6zX8iFa2zu+u3ll0IX0WtxTqrzft27jYSwebmm/ysWJUcOY+SWhZfPA0Q==} engines: {node: '>=18'} '@cspell/cspell-types@8.15.2': resolution: {integrity: sha512-bHAkXsrfOhKyZZ+TA5eGH3fqh9DPcP3a2v+ozTnhhZa3zcfuzX7rZnYWEFA8LELMUStWXLECzFoGd9QUEHMstg==} engines: {node: '>=18'} '@cspell/dict-ada@4.0.5': resolution: {integrity: sha512-6/RtZ/a+lhFVmrx/B7bfP7rzC4yjEYe8o74EybXcvu4Oue6J4Ey2WSYj96iuodloj1LWrkNCQyX5h4Pmcj0Iag==} '@cspell/dict-aws@4.0.7': resolution: {integrity: sha512-PoaPpa2NXtSkhGIMIKhsJUXB6UbtTt6Ao3x9JdU9kn7fRZkwD4RjHDGqulucIOz7KeEX/dNRafap6oK9xHe4RA==} '@cspell/dict-bash@4.1.8': resolution: {integrity: sha512-I2CM2pTNthQwW069lKcrVxchJGMVQBzru2ygsHCwgidXRnJL/NTjAPOFTxN58Jc1bf7THWghfEDyKX/oyfc0yg==} '@cspell/dict-companies@3.1.7': resolution: {integrity: sha512-ncVs/efuAkP1/tLDhWbXukBjgZ5xOUfe03neHMWsE8zvXXc5+Lw6TX5jaJXZLOoES/f4j4AhRE20jsPCF5pm+A==} '@cspell/dict-cpp@5.1.22': resolution: {integrity: sha512-g1/8P5/Q+xnIc8Js4UtBg3XOhcFrFlFbG3UWVtyEx49YTf0r9eyDtDt1qMMDBZT91pyCwLcAEbwS+4i5PIfNZw==} '@cspell/dict-cryptocurrencies@5.0.3': resolution: {integrity: sha512-bl5q+Mk+T3xOZ12+FG37dB30GDxStza49Rmoax95n37MTLksk9wBo1ICOlPJ6PnDUSyeuv4SIVKgRKMKkJJglA==} '@cspell/dict-csharp@4.0.5': resolution: {integrity: sha512-c/sFnNgtRwRJxtC3JHKkyOm+U3/sUrltFeNwml9VsxKBHVmvlg4tk4ar58PdpW9/zTlGUkWi2i85//DN1EsUCA==} '@cspell/dict-css@4.0.16': resolution: {integrity: sha512-70qu7L9z/JR6QLyJPk38fNTKitlIHnfunx0wjpWQUQ8/jGADIhMCrz6hInBjqPNdtGpYm8d1dNFyF8taEkOgrQ==} '@cspell/dict-dart@2.2.4': resolution: {integrity: sha512-of/cVuUIZZK/+iqefGln8G3bVpfyN6ZtH+LyLkHMoR5tEj+2vtilGNk9ngwyR8L4lEqbKuzSkOxgfVjsXf5PsQ==} '@cspell/dict-data-science@2.0.5': resolution: {integrity: sha512-nNSILXmhSJox9/QoXICPQgm8q5PbiSQP4afpbkBqPi/u/b3K9MbNH5HvOOa6230gxcGdbZ9Argl2hY/U8siBlg==} '@cspell/dict-django@4.1.3': resolution: {integrity: sha512-yBspeL3roJlO0a1vKKNaWABURuHdHZ9b1L8d3AukX0AsBy9snSggc8xCavPmSzNfeMDXbH+1lgQiYBd3IW03fg==} '@cspell/dict-docker@1.1.10': resolution: {integrity: sha512-vWybMfsG/8jhN6kmPoilMon36GB3+Ef+m/mgYUfY8tJN23K/x4KD1rU1OOiNWzDqePhu3MMWVKO5W5x6VI6Gbw==} '@cspell/dict-dotnet@5.0.8': resolution: {integrity: sha512-MD8CmMgMEdJAIPl2Py3iqrx3B708MbCIXAuOeZ0Mzzb8YmLmiisY7QEYSZPg08D7xuwARycP0Ki+bb0GAkFSqg==} '@cspell/dict-elixir@4.0.6': resolution: {integrity: sha512-TfqSTxMHZ2jhiqnXlVKM0bUADtCvwKQv2XZL/DI0rx3doG8mEMS8SGPOmiyyGkHpR/pGOq18AFH3BEm4lViHIw==} '@cspell/dict-en-common-misspellings@2.0.7': resolution: {integrity: sha512-qNFo3G4wyabcwnM+hDrMYKN9vNVg/k9QkhqSlSst6pULjdvPyPs1mqz1689xO/v9t8e6sR4IKc3CgUXDMTYOpA==} '@cspell/dict-en-gb@1.1.33': resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} '@cspell/dict-en_us@4.3.26': resolution: {integrity: sha512-hDbHYJsi3UgU1J++B0WLiYhWQdsmve3CH53FIaMRAdhrWOHcuw7h1dYkQXHFEP5lOjaq53KUHp/oh5su6VkIZg==} '@cspell/dict-filetypes@3.0.7': resolution: {integrity: sha512-/DN0Ujp9/EXvpTcgih9JmBaE8n+G0wtsspyNdvHT5luRfpfol1xm/CIQb6xloCXCiLkWX+EMPeLSiVIZq+24dA==} '@cspell/dict-flutter@1.0.3': resolution: {integrity: sha512-52C9aUEU22ptpgYh6gQyIdA4MP6NPwzbEqndfgPh3Sra191/kgs7CVqXiO1qbtZa9gnYHUoVApkoxRE7mrXHfg==} '@cspell/dict-fonts@4.0.3': resolution: {integrity: sha512-sPd17kV5qgYXLteuHFPn5mbp/oCHKgitNfsZLFC3W2fWEgZlhg4hK+UGig3KzrYhhvQ8wBnmZrAQm0TFKCKzsA==} '@cspell/dict-fsharp@1.0.4': resolution: {integrity: sha512-G5wk0o1qyHUNi9nVgdE1h5wl5ylq7pcBjX8vhjHcO4XBq20D5eMoXjwqMo/+szKAqzJ+WV3BgAL50akLKrT9Rw==} '@cspell/dict-fullstack@3.2.3': resolution: {integrity: sha512-62PbndIyQPH11mAv0PyiyT0vbwD0AXEocPpHlCHzfb5v9SspzCCbzQ/LIBiFmyRa+q5LMW35CnSVu6OXdT+LKg==} '@cspell/dict-gaming-terms@1.0.8': resolution: {integrity: sha512-7OL0zTl93WFWhhtpXFrtm9uZXItC3ncAs8d0iQDMMFVNU1rBr6raBNxJskxE5wx2Ant12fgI66ZGVagXfN+yfA==} '@cspell/dict-git@3.0.3': resolution: {integrity: sha512-LSxB+psZ0qoj83GkyjeEH/ZViyVsGEF/A6BAo8Nqc0w0HjD2qX/QR4sfA6JHUgQ3Yi/ccxdK7xNIo67L2ScW5A==} '@cspell/dict-golang@6.0.16': resolution: {integrity: sha512-hZOBlgcguv2Hdc93n2zjdAQm1j3grsN9T9WhPnQ1wh2vUDoCLEujg+6gWhjcLb8ECOcwZTWgNyQLWeOxEsAj/w==} '@cspell/dict-google@1.0.4': resolution: {integrity: sha512-JThUT9eiguCja1mHHLwYESgxkhk17Gv7P3b1S7ZJzXw86QyVHPrbpVoMpozHk0C9o+Ym764B7gZGKmw9uMGduQ==} '@cspell/dict-haskell@4.0.4': resolution: {integrity: sha512-EwQsedEEnND/vY6tqRfg9y7tsnZdxNqOxLXSXTsFA6JRhUlr8Qs88iUUAfsUzWc4nNmmzQH2UbtT25ooG9x4nA==} '@cspell/dict-html-symbol-entities@4.0.3': resolution: {integrity: sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==} '@cspell/dict-html@4.0.9': resolution: {integrity: sha512-BNp7w3m910K4qIVyOBOZxHuFNbVojUY6ES8Y8r7YjYgJkm2lCuQoVwwhPjurnomJ7BPmZTb+3LLJ58XIkgF7JQ==} '@cspell/dict-java@5.0.10': resolution: {integrity: sha512-pVNcOnmoGiNL8GSVq4WbX/Vs2FGS0Nej+1aEeGuUY9CU14X8yAVCG+oih5ZoLt1jaR8YfR8byUF8wdp4qG4XIw==} '@cspell/dict-julia@1.0.4': resolution: {integrity: sha512-bFVgNX35MD3kZRbXbJVzdnN7OuEqmQXGpdOi9jzB40TSgBTlJWA4nxeAKV4CPCZxNRUGnLH0p05T/AD7Aom9/w==} '@cspell/dict-k8s@1.0.9': resolution: {integrity: sha512-Q7GELSQIzo+BERl2ya/nBEnZeQC+zJP19SN1pI6gqDYraM51uYJacbbcWLYYO2Y+5joDjNt/sd/lJtLaQwoSlA==} '@cspell/dict-latex@4.0.3': resolution: {integrity: sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==} '@cspell/dict-lorem-ipsum@4.0.3': resolution: {integrity: sha512-WFpDi/PDYHXft6p0eCXuYnn7mzMEQLVeqpO+wHSUd+kz5ADusZ4cpslAA4wUZJstF1/1kMCQCZM6HLZic9bT8A==} '@cspell/dict-lua@4.0.6': resolution: {integrity: sha512-Jwvh1jmAd9b+SP9e1GkS2ACbqKKRo9E1f9GdjF/ijmooZuHU0hPyqvnhZzUAxO1egbnNjxS/J2T6iUtjAUK2KQ==} '@cspell/dict-makefile@1.0.3': resolution: {integrity: sha512-R3U0DSpvTs6qdqfyBATnePj9Q/pypkje0Nj26mQJ8TOBQutCRAJbr2ZFAeDjgRx5EAJU/+8txiyVF97fbVRViw==} '@cspell/dict-monkeyc@1.0.9': resolution: {integrity: sha512-Jvf6g5xlB4+za3ThvenYKREXTEgzx5gMUSzrAxIiPleVG4hmRb/GBSoSjtkGaibN3XxGx5x809gSTYCA/IHCpA==} '@cspell/dict-node@5.0.4': resolution: {integrity: sha512-Hz5hiuOvZTd7Cp1IBqUZ7/ChwJeQpD5BJuwCaDn4mPNq4iMcQ1iWBYMThvNVqCEDgKv63X52nT8RAWacss98qg==} '@cspell/dict-npm@5.1.8': resolution: {integrity: sha512-AJELYXeB4fQdIoNfmuaQxB1Hli3cX6XPsQCjfBxlu0QYXhrjB/IrCLLQAjWIywDqJiWyGUFTz4DqaANm8C/r9Q==} '@cspell/dict-php@4.0.13': resolution: {integrity: sha512-P6sREMZkhElzz/HhXAjahnICYIqB/HSGp1EhZh+Y6IhvC15AzgtDP8B8VYCIsQof6rPF1SQrFwunxOv8H1e2eg==} '@cspell/dict-powershell@5.0.13': resolution: {integrity: sha512-0qdj0XZIPmb77nRTynKidRJKTU0Fl+10jyLbAhFTuBWKMypVY06EaYFnwhsgsws/7nNX8MTEQuewbl9bWFAbsg==} '@cspell/dict-public-licenses@2.0.11': resolution: {integrity: sha512-rR5KjRUSnVKdfs5G+gJ4oIvQvm8+NJ6cHWY2N+GE69/FSGWDOPHxulCzeGnQU/c6WWZMSimG9o49i9r//lUQyA==} '@cspell/dict-python@4.2.11': resolution: {integrity: sha512-bshNZqP5FYRO0CtZ9GgtVjHidrSuRRF537MU/sPew8oaqWPg066F9KQfPllbRi9AzFqqeS2l7/ACYUrFMe21gw==} '@cspell/dict-r@2.0.4': resolution: {integrity: sha512-cBpRsE/U0d9BRhiNRMLMH1PpWgw+N+1A2jumgt1if9nBGmQw4MUpg2u9I0xlFVhstTIdzXiLXMxP45cABuiUeQ==} '@cspell/dict-ruby@5.0.7': resolution: {integrity: sha512-4/d0hcoPzi5Alk0FmcyqlzFW9lQnZh9j07MJzPcyVO62nYJJAGKaPZL2o4qHeCS/od/ctJC5AHRdoUm0ktsw6Q==} '@cspell/dict-rust@4.0.9': resolution: {integrity: sha512-Dhr6TIZsMV92xcikKIWei6p/qswS4M+gTkivpWwz4/1oaVk2nRrxJmCdRoVkJlZkkAc17rjxrS12mpnJZI0iWw==} '@cspell/dict-scala@5.0.6': resolution: {integrity: sha512-tl0YWAfjUVb4LyyE4JIMVE8DlLzb1ecHRmIWc4eT6nkyDqQgHKzdHsnusxFEFMVLIQomgSg0Zz6hJ5S1E4W4ww==} '@cspell/dict-software-terms@4.1.10': resolution: {integrity: sha512-+9PuQ9MHQhlET6Hv1mGcWDh6Rb+StzjBMrjfksDeBHBIVdT66u9uCkaZapIzfgktflY4m9oK7+dEynr+BAxvtQ==} '@cspell/dict-sql@2.1.8': resolution: {integrity: sha512-dJRE4JV1qmXTbbGm6WIcg1knmR6K5RXnQxF4XHs5HA3LAjc/zf77F95i5LC+guOGppVF6Hdl66S2UyxT+SAF3A==} '@cspell/dict-svelte@1.0.5': resolution: {integrity: sha512-sseHlcXOqWE4Ner9sg8KsjxwSJ2yssoJNqFHR9liWVbDV+m7kBiUtn2EB690TihzVsEmDr/0Yxrbb5Bniz70mA==} '@cspell/dict-swift@2.0.4': resolution: {integrity: sha512-CsFF0IFAbRtYNg0yZcdaYbADF5F3DsM8C4wHnZefQy8YcHP/qjAF/GdGfBFBLx+XSthYuBlo2b2XQVdz3cJZBw==} '@cspell/dict-terraform@1.0.5': resolution: {integrity: sha512-qH3epPB2d6d5w1l4hR2OsnN8qDQ4P0z6oDB7+YiNH+BoECXv4Z38MIV1H8cxIzD2wkzkt2JTcFYaVW72MDZAlg==} '@cspell/dict-typescript@3.1.9': resolution: {integrity: sha512-ZtO1/cVWvvR477ftTl2TFR09+IIzXG1rcin8CGYA0FO5WhyDAbn8v3A85QikS158BhTVUoq09lPYuSF9HBzqvw==} '@cspell/dict-vue@3.0.3': resolution: {integrity: sha512-akmYbrgAGumqk1xXALtDJcEcOMYBYMnkjpmGzH13Ozhq1mkPF4VgllFQlm1xYde+BUKNnzMgPEzxrL2qZllgYA==} '@cspell/dynamic-import@8.15.2': resolution: {integrity: sha512-37eYzVLqMv3KnY7UMmv/wC9OlUjPC7EJ3xMDourgDTNp6BtiPlMkHRTN5/yvRjukQedi41R1hewgCcZbwSpNXg==} engines: {node: '>=18.0'} '@cspell/filetypes@8.15.2': resolution: {integrity: sha512-x2ciWqi6y2RoTcXRTG3BuxAly1TIr4puLzKHkMWtnYp1A++gohCBczMt33FwrwFav0Dfx9M0mCpT1h1ORVwzhA==} engines: {node: '>=18'} '@cspell/strong-weak-map@8.15.2': resolution: {integrity: sha512-FMz3vgyPJjJsg0f78ToprOxR0lPhZOWwidxD+gOMLLfUzJ0mBC4VwoggrgIF6YEdXy/2UoIUtjh5B/Qfge9IDw==} engines: {node: '>=18'} '@cspell/url@8.15.2': resolution: {integrity: sha512-AxS6nqh65V8BJf+ke7XNsDlieXfq/73XjZ4OxQAHvmML9kgXAbTviDcN6ddj6d2fTgU3EOSU1fBfDOqpS4n6Sg==} engines: {node: '>=18.0'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} '@esbuild-plugins/node-modules-polyfill@0.2.2': resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} peerDependencies: esbuild: '*' '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 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.10.0': resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} '@mdn/browser-compat-data@5.5.30': resolution: {integrity: sha512-ahKPOhFXDDDKJnhcScp6h/QnRS0L0GK3tnqV+8HgMRJ9K4IXsQOsyC9AwRKbcM+WK896o+yyliU7OdASyIYERw==} '@microsoft/tsdoc@0.15.0': resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} '@npmcli/arborist@4.3.1': resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} hasBin: true '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} '@npmcli/fs@2.1.2': resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} '@npmcli/fs@3.1.1': resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/git@2.1.0': resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} '@npmcli/git@4.1.0': resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/installed-package-contents@1.0.7': resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} engines: {node: '>= 10'} hasBin: true '@npmcli/installed-package-contents@2.1.0': resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true '@npmcli/map-workspaces@2.0.4': resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} '@npmcli/metavuln-calculator@2.0.0': resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} '@npmcli/move-file@1.1.2': resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs '@npmcli/move-file@2.0.1': resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs '@npmcli/name-from-folder@1.0.1': resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} '@npmcli/node-gyp@1.0.3': resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} '@npmcli/node-gyp@3.0.0': resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/package-json@1.0.1': resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} '@npmcli/promise-spawn@1.3.2': resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} '@npmcli/promise-spawn@6.0.2': resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/run-script@2.0.0': resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} '@npmcli/run-script@6.0.2': resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@oclif/core@2.16.0': resolution: {integrity: sha512-dL6atBH0zCZl1A1IXCKJgLPrM/wR7K+Wi401E/IvqsK8m2iCHW+0TEOGrans/cuN3oTW+uxIyJFHJ8Im0k4qBw==} engines: {node: '>=14.0.0'} '@oclif/plugin-help@5.2.20': resolution: {integrity: sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==} engines: {node: '>=12.0.0'} '@oclif/plugin-not-found@2.4.3': resolution: {integrity: sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg==} engines: {node: '>=12.0.0'} '@oclif/plugin-warn-if-update-available@2.1.1': resolution: {integrity: sha512-y7eSzT6R5bmTIJbiMMXgOlbBpcWXGlVhNeQJBLBCCy1+90Wbjyqf6uvY0i2WcO4sh/THTJ20qCW80j3XUlgDTA==} engines: {node: '>=12.0.0'} '@octokit/auth-token@2.5.0': resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} '@octokit/core@3.6.0': resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} '@octokit/endpoint@6.0.12': resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} '@octokit/graphql@4.8.0': resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} '@octokit/openapi-types@12.11.0': resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} '@octokit/plugin-paginate-rest@2.21.3': resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} peerDependencies: '@octokit/core': '>=2' '@octokit/plugin-request-log@1.0.4': resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' '@octokit/plugin-rest-endpoint-methods@5.16.2': resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} peerDependencies: '@octokit/core': '>=3' '@octokit/request-error@2.1.0': resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} '@octokit/request@5.6.3': resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} '@octokit/rest@18.12.0': resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} '@octokit/types@6.41.0': resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@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.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.18.0': resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.18.0': resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.18.0': resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] '@rollup/rollup-linux-arm-gnueabihf@4.18.0': resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.18.0': resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.18.0': resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.18.0': resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.18.0': resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.18.0': resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.18.0': resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.18.0': resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.18.0': resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.18.0': resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.18.0': resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] '@sigstore/bundle@1.1.0': resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@sigstore/protobuf-specs@0.2.1': resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@sigstore/sign@1.0.0': resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@sigstore/tuf@1.0.3': resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} '@ts-morph/common@0.24.0': resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@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==} '@tsconfig/recommended@1.0.7': resolution: {integrity: sha512-xiNMgCuoy4mCL4JTywk9XFs5xpRUcKxtWEcMR6FNMtsgewYTIgIR+nvlP4A4iRCAzRsHMnPhvTRrzp4AGcRTEA==} '@tufjs/canonical-json@1.0.0': resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@tufjs/models@1.0.4': resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} '@types/cli-progress@3.11.5': resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} '@types/expect@1.20.4': resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} '@types/express-serve-static-core@4.19.3': resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} '@types/multer@1.4.12': resolution: {integrity: sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==} '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} '@types/node@15.14.9': resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} '@types/node@22.5.2': resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} '@types/react@18.3.5': resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/vinyl@2.0.12': resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} '@typescript-eslint/eslint-plugin@7.11.0': resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/parser@7.11.0': resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/parser@7.18.0': resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/scope-manager@7.11.0': resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/type-utils@7.11.0': resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/type-utils@7.18.0': resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/types@7.11.0': resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/typescript-estree@7.11.0': resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true '@typescript-eslint/utils@7.11.0': resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 '@typescript-eslint/visitor-keys@7.11.0': resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} '@vitest/expect@2.1.4': resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} '@vitest/mocker@2.1.4': resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true '@vitest/pretty-format@2.1.4': resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} '@vitest/runner@2.1.4': resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} '@vitest/snapshot@2.1.4': resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} '@vitest/spy@2.1.4': resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} '@withfig/api-bindings@0.30.5': resolution: {integrity: sha512-eRahnf3L5dQ6QWq9fY0rTWABWYPUZNpzAZDLb5u1bwbmwvDegz74qY6W1E5pc5SEpM+HHxRUC6ySAl8PeiQXwQ==} engines: {node: '>=16'} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} 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.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} 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-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} ansicolors@0.3.2: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} deprecated: This package is no longer supported. are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} engines: {node: '>=8'} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} array.prototype.toreversed@1.1.2: resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} ast-metadata-inferer@0.8.0: resolution: {integrity: sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==} ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} aws-sdk@2.1632.0: resolution: {integrity: sha512-doNHUxto00r7r9qWb5RcIsQHUTHdGiPPyJoXxmsmQW6aOr69BqYeuFl8SicNS1YzP6s5sFFnDNKq9KB7jA2fyA==} engines: {node: '>= 10.0.0'} axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} axobject-query@3.2.4: resolution: {integrity: sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==} engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} bin-links@3.0.3: resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} binaryextensions@4.19.0: resolution: {integrity: sha512-DRxnVbOi/1OgA5pA9EDiRT8gvVYeqfuN7TmPfLyt6cyho3KbHCi3EtDQf39TTmGDrR5dZ9CspdXhPkL/j/WGbg==} engines: {node: '>=0.8'} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@4.9.2: resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} cacache@17.1.4: resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} cacheable-request@7.0.4: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} caniuse-lite@1.0.30001625: resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} chalk-template@1.1.0: resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} engines: {node: '>=14.16'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} clean-stack@3.0.1: resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} engines: {node: '>=10'} clear-module@4.1.2: resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} engines: {node: '>=8'} cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} cli-progress@3.12.0: resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} engines: {node: '>=4'} cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} cli-table@0.3.11: resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} engines: {node: '>= 0.2.0'} cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} engines: {node: '>= 0.10'} clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} clone-stats@1.0.0: resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} cloneable-readable@1.1.3: resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} cmd-shim@5.0.0: resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} code-block-writer@13.0.1: resolution: {integrity: sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} 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@7.1.0: resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} engines: {node: '>= 10'} comment-json@4.2.5: resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} concurrently@7.6.0: resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} hasBin: true confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} cspell-config-lib@8.15.2: resolution: {integrity: sha512-0vaZdp1gz5mt7RWTWStHHJBXfELtbtJNCl8RNz9E51906bhAyZ/yBvkOyjCW2Ofsdp2cKS11AuzTrq6N2lmK3g==} engines: {node: '>=18'} cspell-dictionary@8.15.2: resolution: {integrity: sha512-Kvn8ZD+oQs2KKgGoC601NBju3xQcrP4bz1MVZ23ZN9fm6pukb0J8x9hP3d+AuQd/Cl2XG/y/hWZi6MT92uChIg==} engines: {node: '>=18'} cspell-gitignore@8.15.2: resolution: {integrity: sha512-XrQ3iouv2VvvpkL1ygEnOuqY/BGNt0tBZngFrb/Y12LWgcZ6unLZk4IaMYXlmjRZPtq7QuBe4dvG1D2SFcNEng==} engines: {node: '>=18'} hasBin: true cspell-glob@8.15.2: resolution: {integrity: sha512-AQNskPt3FOF1Z6mc+cvCZ33Xnb+a4cMVZwcLlApc/4uup6OvyEoXNN9IyeHVmloAUPlXadaA79balp3cMj2rWg==} engines: {node: '>=18'} cspell-grammar@8.15.2: resolution: {integrity: sha512-yvCiOlg6G2l+lMWBSmWwnVqIVfDK/uUBzY4WIJQaXWtXRuJ9MdsSEQ3TFd9NgJUhY1gSF8O1zSqeCmfPNuS44g==} engines: {node: '>=18'} hasBin: true cspell-io@8.15.2: resolution: {integrity: sha512-Y4bEsKVXC48VawU+gU1lcsO7B55pNAjc8/C8Qg8UByobSOxtZKd7jaRRqqvd60Rh8lbgG4Nc05zKCb1CxY1+2Q==} engines: {node: '>=18'} cspell-lib@8.15.2: resolution: {integrity: sha512-u4tO8NoLq/LuOdCBqJdKBLE51uCcE2Ni/DvaEFNfuhk2fCF3rE/2nCzLx6ZEAiFPHZVMs44MJxpH7VF8Rn/T8g==} engines: {node: '>=18'} cspell-trie-lib@8.15.2: resolution: {integrity: sha512-dqEc4832iareVCA+pXuvdNwtUF+F8S+w15Tlv0fRdPTz8X4wcUtK0R5npYnL5dyuPhKBdO/PmKXGb7/5I0vBMg==} engines: {node: '>=18'} cspell@8.15.2: resolution: {integrity: sha512-2XN6LeBAWyRLPUAcKrJTBftNc50VVVeU/j1GVU07hEun4Q4KZG9CbUT+YaZEnZo8xexVUBfZLtB5YxSImCnBtQ==} engines: {node: '>=18'} hasBin: true csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} 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.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.3.6: resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debuglog@1.0.1: resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} deep-eql@5.0.2: 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==} defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 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'} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true electron-to-chromium@1.4.787: resolution: {integrity: sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ==} emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} error@10.4.0: resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} es-iterator-helpers@1.0.19: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} hasBin: true escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 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-config-airbnb-base@15.0.0: resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.2 eslint-config-airbnb@19.0.4: resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 eslint-plugin-jsx-a11y: ^6.5.1 eslint-plugin-react: ^7.28.0 eslint-plugin-react-hooks: ^4.3.0 eslint-config-prettier@9.1.0: resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-module-utils@2.8.1: resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} 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-compat@4.2.0: resolution: {integrity: sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==} engines: {node: '>=14.x'} peerDependencies: eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 eslint-plugin-import@2.29.1: resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 peerDependenciesMeta: '@typescript-eslint/parser': optional: true eslint-plugin-jsx-a11y@6.8.0: resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint-plugin-prettier@5.2.1: resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' eslint-config-prettier: '*' prettier: '>=3.0.0' peerDependenciesMeta: '@types/eslint': optional: true eslint-config-prettier: optional: true eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react@7.34.2: resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 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@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 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@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 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'} etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} events@1.1.1: resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} engines: {node: '>=0.4.x'} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} express@4.21.1: resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-equals@5.0.1: resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} engines: {node: '>=6.0.0'} fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} 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==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fdir@6.4.0: resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} file-entry-cache@9.1.0: resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} engines: {node: '>=18'} 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'} finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-up-simple@1.0.0: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} 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-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} find-yarn-workspace-root@2.0.0: resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} first-chunk-stream@2.0.0: resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} engines: {node: '>=0.10.0'} flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} flat-cache@5.0.0: resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} engines: {node: '>=18'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} fs-minipass@3.0.3: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 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.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} deprecated: This package is no longer supported. gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. gensequence@7.0.0: resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} engines: {node: '>=18'} get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} github-slugger@1.5.0: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} github-username@6.0.0: resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} engines: {node: '>=10'} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} glob@10.4.1: resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} grouped-queue@2.0.0: resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} engines: {node: '>=8.0.0'} has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} has-own-prop@2.0.0: resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} engines: {node: '>=8'} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.0.3: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} hosted-git-info@6.1.1: resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} http-call@5.3.0: resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} engines: {node: '>=8.0.0'} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} husky@9.1.6: resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} engines: {node: '>=18'} hasBin: true hyperlinker@1.0.0: resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} engines: {node: '>=4'} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore-walk@4.0.1: resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} engines: {node: '>=10'} ignore-walk@6.0.5: resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 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'} infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} 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@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 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.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} is-fullwidth-code-point@5.0.0: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} 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.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} is-scoped@2.1.0: resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} engines: {node: '>=8'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} isbinaryfile@5.0.2: resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} engines: {node: '>= 18.0.0'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} jackspeak@3.1.2: resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} engines: {node: '>=14'} jake@10.9.1: resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} engines: {node: '>=10'} hasBin: true jmespath@0.16.0: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} 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-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 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==} json-stringify-nice@1.1.4: resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} just-diff-apply@5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} just-diff@5.2.0: resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} lint-staged@15.2.10: resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} engines: {node: '>=18.12.0'} hasBin: true listr2@8.2.4: resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} engines: {node: '>=18.0.0'} load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} 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._reinterpolate@3.0.0: resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.template@4.5.0: resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} make-fetch-happen@11.1.1: resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} mem-fs-editor@9.7.0: resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} engines: {node: '>=12.10.0'} peerDependencies: mem-fs: ^2.1.0 peerDependenciesMeta: mem-fs: optional: true mem-fs@2.3.0: resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} engines: {node: '>=12'} merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} micromatch@4.0.7: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} 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==} minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} minipass-fetch@1.4.1: resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} engines: {node: '>=8'} minipass-fetch@2.1.2: resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} minipass-fetch@3.0.5: resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} minipass-json-stream@1.0.1: resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} minipass-sized@1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} mkdirp-infer-owner@2.0.0: resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} engines: {node: '>=10'} mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true module-from-string@3.3.1: resolution: {integrity: sha512-nFdOQ8NHJXR7ITj2JAwjpPSgX3vjbG2LfBL1YA5gil8sLkFTFa5pmV9P1NBGRik65u+NNyGEeUMcwkbqwPJ/ew==} engines: {node: '>=12.20.0'} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} multer@1.4.5-lts.1: resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} engines: {node: '>= 6.0.0'} multimatch@5.0.0: resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} engines: {node: '>=10'} mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} natural-orderby@2.0.3: resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: encoding: optional: true node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} hasBin: true node-gyp@9.4.1: resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} engines: {node: ^12.13 || ^14.13 || >=16} hasBin: true node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} normalize-package-data@5.0.0: resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} npm-bundled@1.1.2: resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} npm-bundled@3.0.1: resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-install-checks@4.0.0: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} npm-install-checks@6.3.0: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-normalize-package-bin@1.0.1: resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} npm-normalize-package-bin@2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} npm-normalize-package-bin@3.0.1: resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-package-arg@10.1.0: resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-package-arg@8.1.5: resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} engines: {node: '>=10'} npm-packlist@3.0.0: resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} engines: {node: '>=10'} hasBin: true npm-packlist@7.0.4: resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-pick-manifest@6.1.1: resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} npm-pick-manifest@8.0.2: resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-registry-fetch@12.0.2: resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} npm-registry-fetch@14.0.5: resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} object-treeify@1.1.33: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 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.hasown@1.1.4: resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} engines: {node: '>= 0.4'} object.values@1.2.0: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} oclif@3.17.2: resolution: {integrity: sha512-+vFXxgmR7dGGz+g6YiqSZu2LXVkBMaS9/rhtsLGkYw45e53CW/3kBgPRnOvxcTDM3Td9JPeBD2JWxXnPKGQW3A==} engines: {node: '>=12.0.0'} hasBin: true on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} 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-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} p-transform@1.3.0: resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} engines: {node: '>=12.10.0'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} pacote@12.0.3: resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} hasBin: true pacote@15.2.0: resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} parent-module@2.0.0: resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} engines: {node: '>=8'} parse-conflict-json@2.0.2: resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 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'} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} password-prompt@1.1.3: resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 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==} path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} preferred-pm@3.1.3: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} proc-log@1.0.0: resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} 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'} promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} promise-call-limit@1.0.2: resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' peerDependenciesMeta: bluebird: optional: true promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} protobufjs@7.3.0: resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} read-cmd-shim@3.0.1: resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} read-package-json-fast@2.0.3: resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} engines: {node: '>=10'} read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} read-package-json@6.0.4: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} deprecated: This package is no longer supported. Please use @npmcli/package-json instead. 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'} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} readable-stream@4.5.2: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} readdir-scoped-modules@1.1.0: resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} deprecated: This functionality has been moved to @npmcli/fs readdirp@4.0.1: resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} engines: {node: '>= 14.16.0'} rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} replace-ext@1.0.1: resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} engines: {node: '>= 0.10'} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} 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-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-inject@3.0.2: resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. rollup-plugin-node-polyfills@0.2.1: resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} rollup@4.18.0: resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 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==} safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sax@1.2.1: resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} scoped-regex@2.1.0: resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} engines: {node: '>=8'} 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.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 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'} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 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'} shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} hasBin: true side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} sigstore@1.9.0: resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} slice-ansi@7.1.0: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-keys@4.2.0: resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} engines: {node: '>=8'} source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead spawn-command@0.0.2-1: resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} 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-license-ids@3.0.18: resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} ssri@9.0.1: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} string-width@7.1.0: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} string.prototype.trimstart@1.0.8: 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==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} strip-bom-buf@1.0.0: resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} engines: {node: '>=4'} strip-bom-stream@2.0.0: resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} engines: {node: '>=0.10.0'} strip-bom@2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} engines: {node: '>=0.10.0'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} 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-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} synckit@0.9.1: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} textextensions@5.16.0: resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} engines: {node: '>=0.8'} through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} tinyglobby@0.2.9: resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} engines: {node: '>=12.0.0'} tinypool@1.0.1: resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true treeverse@1.0.4: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' ts-morph@23.0.0: resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} 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.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tsx@4.19.0: resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} engines: {node: '>=18.0.0'} hasBin: true tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} turbo-darwin-64@2.1.3: resolution: {integrity: sha512-ouJOm0g0YyoBuhmikEujVCBGo3Zr0lbSOWFIsQtWUTItC88F2w2byhjtsYGPXQwMlTbXwmoBU2lOCfWNkeEwHQ==} cpu: [x64] os: [darwin] turbo-darwin-arm64@2.1.3: resolution: {integrity: sha512-j2FOJsK4LAOtHQlb3Oom0yWB/Vi0nF1ljInr311mVzHoFAJRZtfW2fRvdZRb/lBUwjSp8be58qWHzANIcrA0OA==} cpu: [arm64] os: [darwin] turbo-linux-64@2.1.3: resolution: {integrity: sha512-ubRHkI1gSel7H7wsmxKK8C9UlLWqg/2dkCC88LFupaK6TKgvBKqDqA0Z1M9C/escK0Jsle2k0H8bybV9OYIl4Q==} cpu: [x64] os: [linux] turbo-linux-arm64@2.1.3: resolution: {integrity: sha512-LffUL+e5wv7BtD6DgnM2kKOlDkMo2eRjhbAjVnrCD3wi2ug0tl6NDzajnHHjtaMyOnIf4AvzSKdLWsBxafGBQA==} cpu: [arm64] os: [linux] turbo-windows-64@2.1.3: resolution: {integrity: sha512-S9SvcZZoaq5jKr6kA6eF7/xgQhVn8Vh7PVy5lono9zybvhyL4eY++y2PaLToIgL8G9IcbLmgOC73ExNjFBg9XQ==} cpu: [x64] os: [win32] turbo-windows-arm64@2.1.3: resolution: {integrity: sha512-twlEo8lRrGbrR6T/ZklUIquW3IlFCEtywklgVA81aIrSBm56+GEVpSrHhIlsx1hiYeSNrs+GpDwZGe+V7fvEVQ==} cpu: [arm64] os: [win32] turbo@2.1.3: resolution: {integrity: sha512-lY0yj2GH2a2a3NExZ3rGe+rHUVeFE2aXuRAue57n+08E7Z7N7YCmynju0kPC1grAQzERmoLpKrmzmWd+PNiADw==} hasBin: true 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'} type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} unique-slug@3.0.0: resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} update-browserslist-db@1.0.16: resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} url@0.10.3: resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} uuid@8.0.0: resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} hasBin: true 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@3.0.0: resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} validate-npm-package-name@5.0.1: 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'} vinyl-file@3.0.0: resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} engines: {node: '>=4'} vinyl@2.2.1: resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} engines: {node: '>= 0.10'} vite-node@2.1.4: resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true vite@5.2.12: resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 peerDependenciesMeta: '@types/node': optional: true less: optional: true lightningcss: optional: true sass: optional: true stylus: optional: true sugarss: optional: true terser: optional: true vitest@2.1.4: resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 '@vitest/browser': 2.1.4 '@vitest/ui': 2.1.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true '@types/node': optional: true '@vitest/browser': optional: true '@vitest/ui': optional: true happy-dom: optional: true jsdom: optional: true vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} walk-up-path@1.0.0: resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} which-builtin-type@1.1.4: resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} engines: {node: '>= 0.4'} which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} which-typed-array@1.1.15: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true which@3.0.1: resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} engines: {node: ^14.17.0 || ^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 wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 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'} wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} wrap-ansi@9.0.0: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} xml2js@0.6.2: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@2.5.0: resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} hasBin: true yaml@2.6.0: resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} hasBin: true yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} yeoman-environment@3.19.3: resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} engines: {node: '>=12.10.0'} hasBin: true yeoman-generator@5.10.0: resolution: {integrity: sha512-iDUKykV7L4nDNzeYSedRmSeJ5eMYFucnKDi6KN1WNASXErgPepKqsQw55TgXPHnmpcyOh2Dd/LAZkyc+f0qaAw==} engines: {node: '>=12.10.0'} peerDependencies: yeoman-environment: ^3.2.0 peerDependenciesMeta: yeoman-environment: optional: 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'} snapshots: '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 picocolors: 1.1.0 '@babel/helper-validator-identifier@7.24.6': {} '@babel/highlight@7.24.6': dependencies: '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.0 '@babel/runtime@7.24.6': dependencies: regenerator-runtime: 0.14.1 '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 '@cspell/cspell-bundled-dicts@8.15.2': dependencies: '@cspell/dict-ada': 4.0.5 '@cspell/dict-aws': 4.0.7 '@cspell/dict-bash': 4.1.8 '@cspell/dict-companies': 3.1.7 '@cspell/dict-cpp': 5.1.22 '@cspell/dict-cryptocurrencies': 5.0.3 '@cspell/dict-csharp': 4.0.5 '@cspell/dict-css': 4.0.16 '@cspell/dict-dart': 2.2.4 '@cspell/dict-django': 4.1.3 '@cspell/dict-docker': 1.1.10 '@cspell/dict-dotnet': 5.0.8 '@cspell/dict-elixir': 4.0.6 '@cspell/dict-en-common-misspellings': 2.0.7 '@cspell/dict-en-gb': 1.1.33 '@cspell/dict-en_us': 4.3.26 '@cspell/dict-filetypes': 3.0.7 '@cspell/dict-flutter': 1.0.3 '@cspell/dict-fonts': 4.0.3 '@cspell/dict-fsharp': 1.0.4 '@cspell/dict-fullstack': 3.2.3 '@cspell/dict-gaming-terms': 1.0.8 '@cspell/dict-git': 3.0.3 '@cspell/dict-golang': 6.0.16 '@cspell/dict-google': 1.0.4 '@cspell/dict-haskell': 4.0.4 '@cspell/dict-html': 4.0.9 '@cspell/dict-html-symbol-entities': 4.0.3 '@cspell/dict-java': 5.0.10 '@cspell/dict-julia': 1.0.4 '@cspell/dict-k8s': 1.0.9 '@cspell/dict-latex': 4.0.3 '@cspell/dict-lorem-ipsum': 4.0.3 '@cspell/dict-lua': 4.0.6 '@cspell/dict-makefile': 1.0.3 '@cspell/dict-monkeyc': 1.0.9 '@cspell/dict-node': 5.0.4 '@cspell/dict-npm': 5.1.8 '@cspell/dict-php': 4.0.13 '@cspell/dict-powershell': 5.0.13 '@cspell/dict-public-licenses': 2.0.11 '@cspell/dict-python': 4.2.11 '@cspell/dict-r': 2.0.4 '@cspell/dict-ruby': 5.0.7 '@cspell/dict-rust': 4.0.9 '@cspell/dict-scala': 5.0.6 '@cspell/dict-software-terms': 4.1.10 '@cspell/dict-sql': 2.1.8 '@cspell/dict-svelte': 1.0.5 '@cspell/dict-swift': 2.0.4 '@cspell/dict-terraform': 1.0.5 '@cspell/dict-typescript': 3.1.9 '@cspell/dict-vue': 3.0.3 '@cspell/cspell-json-reporter@8.15.2': dependencies: '@cspell/cspell-types': 8.15.2 '@cspell/cspell-pipe@8.15.2': {} '@cspell/cspell-resolver@8.15.2': dependencies: global-directory: 4.0.1 '@cspell/cspell-service-bus@8.15.2': {} '@cspell/cspell-types@8.15.2': {} '@cspell/dict-ada@4.0.5': {} '@cspell/dict-aws@4.0.7': {} '@cspell/dict-bash@4.1.8': {} '@cspell/dict-companies@3.1.7': {} '@cspell/dict-cpp@5.1.22': {} '@cspell/dict-cryptocurrencies@5.0.3': {} '@cspell/dict-csharp@4.0.5': {} '@cspell/dict-css@4.0.16': {} '@cspell/dict-dart@2.2.4': {} '@cspell/dict-data-science@2.0.5': {} '@cspell/dict-django@4.1.3': {} '@cspell/dict-docker@1.1.10': {} '@cspell/dict-dotnet@5.0.8': {} '@cspell/dict-elixir@4.0.6': {} '@cspell/dict-en-common-misspellings@2.0.7': {} '@cspell/dict-en-gb@1.1.33': {} '@cspell/dict-en_us@4.3.26': {} '@cspell/dict-filetypes@3.0.7': {} '@cspell/dict-flutter@1.0.3': {} '@cspell/dict-fonts@4.0.3': {} '@cspell/dict-fsharp@1.0.4': {} '@cspell/dict-fullstack@3.2.3': {} '@cspell/dict-gaming-terms@1.0.8': {} '@cspell/dict-git@3.0.3': {} '@cspell/dict-golang@6.0.16': {} '@cspell/dict-google@1.0.4': {} '@cspell/dict-haskell@4.0.4': {} '@cspell/dict-html-symbol-entities@4.0.3': {} '@cspell/dict-html@4.0.9': {} '@cspell/dict-java@5.0.10': {} '@cspell/dict-julia@1.0.4': {} '@cspell/dict-k8s@1.0.9': {} '@cspell/dict-latex@4.0.3': {} '@cspell/dict-lorem-ipsum@4.0.3': {} '@cspell/dict-lua@4.0.6': {} '@cspell/dict-makefile@1.0.3': {} '@cspell/dict-monkeyc@1.0.9': {} '@cspell/dict-node@5.0.4': {} '@cspell/dict-npm@5.1.8': {} '@cspell/dict-php@4.0.13': {} '@cspell/dict-powershell@5.0.13': {} '@cspell/dict-public-licenses@2.0.11': {} '@cspell/dict-python@4.2.11': dependencies: '@cspell/dict-data-science': 2.0.5 '@cspell/dict-r@2.0.4': {} '@cspell/dict-ruby@5.0.7': {} '@cspell/dict-rust@4.0.9': {} '@cspell/dict-scala@5.0.6': {} '@cspell/dict-software-terms@4.1.10': {} '@cspell/dict-sql@2.1.8': {} '@cspell/dict-svelte@1.0.5': {} '@cspell/dict-swift@2.0.4': {} '@cspell/dict-terraform@1.0.5': {} '@cspell/dict-typescript@3.1.9': {} '@cspell/dict-vue@3.0.3': {} '@cspell/dynamic-import@8.15.2': dependencies: import-meta-resolve: 4.1.0 '@cspell/filetypes@8.15.2': {} '@cspell/strong-weak-map@8.15.2': {} '@cspell/url@8.15.2': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.23.1)': dependencies: esbuild: 0.23.1 escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 '@esbuild/aix-ppc64@0.20.2': optional: true '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/android-arm64@0.20.2': optional: true '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm@0.20.2': optional: true '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-x64@0.20.2': optional: true '@esbuild/android-x64@0.23.1': optional: true '@esbuild/darwin-arm64@0.20.2': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-x64@0.20.2': optional: true '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.20.2': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-x64@0.20.2': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/linux-arm64@0.20.2': optional: true '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm@0.20.2': optional: true '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-ia32@0.20.2': optional: true '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-loong64@0.20.2': optional: true '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-mips64el@0.20.2': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-ppc64@0.20.2': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-riscv64@0.20.2': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-s390x@0.20.2': optional: true '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-x64@0.20.2': optional: true '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.20.2': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true '@esbuild/openbsd-x64@0.20.2': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.20.2': optional: true '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/win32-arm64@0.20.2': optional: true '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-ia32@0.20.2': optional: true '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-x64@0.20.2': optional: true '@esbuild/win32-x64@0.23.1': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.6 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color '@eslint/js@8.57.0': {} '@eslint/js@8.57.1': {} '@gar/promisify@1.1.3': {} '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/object-schema@2.0.3': {} '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@isaacs/string-locale-compare@1.1.0': {} '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 '@mdn/browser-compat-data@5.5.30': {} '@microsoft/tsdoc@0.15.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 '@nodelib/fs.stat@2.0.5': {} '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 '@npmcli/arborist@4.3.1': dependencies: '@isaacs/string-locale-compare': 1.1.0 '@npmcli/installed-package-contents': 1.0.7 '@npmcli/map-workspaces': 2.0.4 '@npmcli/metavuln-calculator': 2.0.0 '@npmcli/move-file': 1.1.2 '@npmcli/name-from-folder': 1.0.1 '@npmcli/node-gyp': 1.0.3 '@npmcli/package-json': 1.0.1 '@npmcli/run-script': 2.0.0 bin-links: 3.0.3 cacache: 15.3.0 common-ancestor-path: 1.0.1 json-parse-even-better-errors: 2.3.1 json-stringify-nice: 1.1.4 mkdirp: 1.0.4 mkdirp-infer-owner: 2.0.0 npm-install-checks: 4.0.0 npm-package-arg: 8.1.5 npm-pick-manifest: 6.1.1 npm-registry-fetch: 12.0.2 pacote: 12.0.3 parse-conflict-json: 2.0.2 proc-log: 1.0.0 promise-all-reject-late: 1.0.1 promise-call-limit: 1.0.2 read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 semver: 7.6.3 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 transitivePeerDependencies: - bluebird - supports-color '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.3 '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.3 '@npmcli/fs@3.1.1': dependencies: semver: 7.6.3 '@npmcli/git@2.1.0': dependencies: '@npmcli/promise-spawn': 1.3.2 lru-cache: 6.0.0 mkdirp: 1.0.4 npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 semver: 7.6.3 which: 2.0.2 transitivePeerDependencies: - bluebird '@npmcli/git@4.1.0': dependencies: '@npmcli/promise-spawn': 6.0.2 lru-cache: 7.18.3 npm-pick-manifest: 8.0.2 proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 semver: 7.6.3 which: 3.0.1 transitivePeerDependencies: - bluebird '@npmcli/installed-package-contents@1.0.7': dependencies: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 '@npmcli/installed-package-contents@2.1.0': dependencies: npm-bundled: 3.0.1 npm-normalize-package-bin: 3.0.1 '@npmcli/map-workspaces@2.0.4': dependencies: '@npmcli/name-from-folder': 1.0.1 glob: 8.1.0 minimatch: 5.1.6 read-package-json-fast: 2.0.3 '@npmcli/metavuln-calculator@2.0.0': dependencies: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3 semver: 7.6.3 transitivePeerDependencies: - bluebird - supports-color '@npmcli/move-file@1.1.2': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 '@npmcli/name-from-folder@1.0.1': {} '@npmcli/node-gyp@1.0.3': {} '@npmcli/node-gyp@3.0.0': {} '@npmcli/package-json@1.0.1': dependencies: json-parse-even-better-errors: 2.3.1 '@npmcli/promise-spawn@1.3.2': dependencies: infer-owner: 1.0.4 '@npmcli/promise-spawn@6.0.2': dependencies: which: 3.0.1 '@npmcli/run-script@2.0.0': dependencies: '@npmcli/node-gyp': 1.0.3 '@npmcli/promise-spawn': 1.3.2 node-gyp: 8.4.1 read-package-json-fast: 2.0.3 transitivePeerDependencies: - bluebird - supports-color '@npmcli/run-script@6.0.2': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 6.0.2 node-gyp: 9.4.1 read-package-json-fast: 3.0.2 which: 3.0.1 transitivePeerDependencies: - bluebird - supports-color '@oclif/core@2.16.0(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@types/cli-progress': 3.11.5 ansi-escapes: 4.3.2 ansi-styles: 4.3.0 cardinal: 2.1.1 chalk: 4.1.2 clean-stack: 3.0.1 cli-progress: 3.12.0 debug: 4.3.5(supports-color@8.1.1) ejs: 3.1.10 get-package-type: 0.1.0 globby: 11.1.0 hyperlinker: 1.0.0 indent-string: 4.0.0 is-wsl: 2.2.0 js-yaml: 3.14.1 natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.3 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 ts-node: 10.9.2(@types/node@22.5.2)(typescript@5.5.4) tslib: 2.7.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript '@oclif/plugin-help@5.2.20(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@oclif/core': 2.16.0(@types/node@22.5.2)(typescript@5.5.4) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript '@oclif/plugin-not-found@2.4.3(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@oclif/core': 2.16.0(@types/node@22.5.2)(typescript@5.5.4) chalk: 4.1.2 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript '@oclif/plugin-warn-if-update-available@2.1.1(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@oclif/core': 2.16.0(@types/node@22.5.2)(typescript@5.5.4) chalk: 4.1.2 debug: 4.3.7 http-call: 5.3.0 lodash.template: 4.5.0 semver: 7.6.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - supports-color - typescript '@octokit/auth-token@2.5.0': dependencies: '@octokit/types': 6.41.0 '@octokit/core@3.6.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 2.5.0 '@octokit/graphql': 4.8.0(encoding@0.1.13) '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding '@octokit/endpoint@6.0.12': dependencies: '@octokit/types': 6.41.0 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 '@octokit/graphql@4.8.0(encoding@0.1.13)': dependencies: '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding '@octokit/openapi-types@12.11.0': {} '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 deprecation: 2.3.1 '@octokit/request-error@2.1.0': dependencies: '@octokit/types': 6.41.0 deprecation: 2.3.1 once: 1.4.0 '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding '@octokit/rest@18.12.0(encoding@0.1.13)': dependencies: '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) transitivePeerDependencies: - encoding '@octokit/types@6.41.0': dependencies: '@octokit/openapi-types': 12.11.0 '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.1.1': {} '@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.18.0': optional: true '@rollup/rollup-android-arm64@4.18.0': optional: true '@rollup/rollup-darwin-arm64@4.18.0': optional: true '@rollup/rollup-darwin-x64@4.18.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true '@rollup/rollup-linux-x64-musl@4.18.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true '@sigstore/bundle@1.1.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 '@sigstore/protobuf-specs@0.2.1': {} '@sigstore/sign@1.0.0': dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color '@sigstore/tuf@1.0.3': dependencies: '@sigstore/protobuf-specs': 0.2.1 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color '@sindresorhus/is@4.6.0': {} '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 '@tootallnate/once@1.1.2': {} '@tootallnate/once@2.0.0': {} '@ts-morph/common@0.24.0': dependencies: fast-glob: 3.3.2 minimatch: 9.0.5 mkdirp: 3.0.1 path-browserify: 1.0.1 '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} '@tsconfig/node14@1.0.3': {} '@tsconfig/node16@1.0.4': {} '@tsconfig/recommended@1.0.7': {} '@tufjs/canonical-json@1.0.0': {} '@tufjs/models@1.0.4': dependencies: '@tufjs/canonical-json': 1.0.0 minimatch: 9.0.5 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 22.5.2 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 '@types/node': 22.5.2 '@types/responselike': 1.0.3 '@types/cli-progress@3.11.5': dependencies: '@types/node': 22.5.2 '@types/connect@3.4.38': dependencies: '@types/node': 22.5.2 '@types/estree@1.0.5': {} '@types/expect@1.20.4': {} '@types/express-serve-static-core@4.19.3': dependencies: '@types/node': 22.5.2 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.3 '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 '@types/http-cache-semantics@4.0.4': {} '@types/http-errors@2.0.4': {} '@types/json5@0.0.29': {} '@types/keyv@3.1.4': dependencies: '@types/node': 22.5.2 '@types/mime@1.3.5': {} '@types/minimatch@3.0.5': {} '@types/multer@1.4.12': dependencies: '@types/express': 4.17.21 '@types/node-fetch@2.6.11': dependencies: '@types/node': 22.5.2 form-data: 4.0.0 '@types/node@15.14.9': {} '@types/node@22.5.2': dependencies: undici-types: 6.19.8 '@types/normalize-package-data@2.4.4': {} '@types/prompts@2.4.9': dependencies: '@types/node': 22.5.2 kleur: 3.0.3 '@types/prop-types@15.7.12': {} '@types/qs@6.9.15': {} '@types/range-parser@1.2.7': {} '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/responselike@1.0.3': dependencies: '@types/node': 22.5.2 '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 22.5.2 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 '@types/node': 22.5.2 '@types/send': 0.17.4 '@types/vinyl@2.0.12': dependencies: '@types/expect': 1.20.4 '@types/node': 22.5.2 '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.11.0 '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.11.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color '@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 7.11.0 '@typescript-eslint/types': 7.11.0 '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.11.0 debug: 4.3.5(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6 eslint: 8.57.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color '@typescript-eslint/scope-manager@7.11.0': dependencies: '@typescript-eslint/types': 7.11.0 '@typescript-eslint/visitor-keys': 7.11.0 '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) debug: 4.3.7 eslint: 8.57.1 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.11.0': {} '@typescript-eslint/types@7.18.0': {} '@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.11.0 '@typescript-eslint/visitor-keys': 7.11.0 debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color '@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.11.0 '@typescript-eslint/types': 7.11.0 '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript '@typescript-eslint/visitor-keys@7.11.0': dependencies: '@typescript-eslint/types': 7.11.0 eslint-visitor-keys: 3.4.3 '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} '@vitest/expect@2.1.4': dependencies: '@vitest/spy': 2.1.4 '@vitest/utils': 2.1.4 chai: 5.1.2 tinyrainbow: 1.2.0 '@vitest/mocker@2.1.4(vite@5.2.12(@types/node@22.5.2))': dependencies: '@vitest/spy': 2.1.4 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: vite: 5.2.12(@types/node@22.5.2) '@vitest/pretty-format@2.1.4': dependencies: tinyrainbow: 1.2.0 '@vitest/runner@2.1.4': dependencies: '@vitest/utils': 2.1.4 pathe: 1.1.2 '@vitest/snapshot@2.1.4': dependencies: '@vitest/pretty-format': 2.1.4 magic-string: 0.30.12 pathe: 1.1.2 '@vitest/spy@2.1.4': dependencies: tinyspy: 3.0.2 '@vitest/utils@2.1.4': dependencies: '@vitest/pretty-format': 2.1.4 loupe: 3.1.2 tinyrainbow: 1.2.0 '@withfig/api-bindings@0.30.5': dependencies: long: 5.2.3 protobufjs: 7.3.0 abbrev@1.1.1: {} abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 acorn-walk@8.3.2: {} acorn@8.11.3: {} agent-base@6.0.2: dependencies: debug: 4.3.7 transitivePeerDependencies: - supports-color agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.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-escapes@7.0.0: dependencies: environment: 1.1.0 ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@6.2.1: {} ansicolors@0.3.2: {} append-field@1.0.0: {} aproba@2.0.0: {} are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 arg@4.1.3: {} argparse@1.0.10: dependencies: sprintf-js: 1.0.3 argparse@2.0.1: {} aria-query@5.3.0: dependencies: dequal: 2.0.3 array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 array-differ@3.0.0: {} array-flatten@1.1.1: {} array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 array-timsort@1.0.3: {} array-union@2.1.0: {} array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 arrify@2.0.1: {} asap@2.0.6: {} assertion-error@2.0.1: {} ast-metadata-inferer@0.8.0: dependencies: '@mdn/browser-compat-data': 5.5.30 ast-types-flow@0.0.8: {} astral-regex@2.0.0: {} async-retry@1.3.3: dependencies: retry: 0.13.1 async@3.2.5: {} asynckit@0.4.0: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 aws-sdk@2.1632.0: dependencies: buffer: 4.9.2 events: 1.1.1 ieee754: 1.1.13 jmespath: 0.16.0 querystring: 0.2.0 sax: 1.2.1 url: 0.10.3 util: 0.12.5 uuid: 8.0.0 xml2js: 0.6.2 axe-core@4.7.0: {} axobject-query@3.2.4: {} balanced-match@1.0.2: {} base64-js@1.5.1: {} before-after-hook@2.2.3: {} bin-links@3.0.3: dependencies: cmd-shim: 5.0.0 mkdirp-infer-owner: 2.0.0 npm-normalize-package-bin: 2.0.0 read-cmd-shim: 3.0.1 rimraf: 3.0.2 write-file-atomic: 4.0.2 binaryextensions@4.19.0: {} bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 braces@3.0.3: dependencies: fill-range: 7.1.1 browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001625 electron-to-chromium: 1.4.787 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) buffer-from@1.1.2: {} buffer@4.9.2: dependencies: base64-js: 1.5.1 ieee754: 1.1.13 isarray: 1.0.0 buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 builtins@1.0.3: {} busboy@1.6.0: dependencies: streamsearch: 1.1.0 bytes@3.1.2: {} cac@6.7.14: {} cacache@15.3.0: dependencies: '@npmcli/fs': 1.1.1 '@npmcli/move-file': 1.1.2 chownr: 2.0.0 fs-minipass: 2.1.0 glob: 7.2.3 infer-owner: 1.0.4 lru-cache: 6.0.0 minipass: 3.3.6 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 mkdirp: 1.0.4 p-map: 4.0.0 promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 tar: 6.2.1 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 chownr: 2.0.0 fs-minipass: 2.1.0 glob: 8.1.0 infer-owner: 1.0.4 lru-cache: 7.18.3 minipass: 3.3.6 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 mkdirp: 1.0.4 p-map: 4.0.0 promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 9.0.1 tar: 6.2.1 unique-filename: 2.0.1 transitivePeerDependencies: - bluebird cacache@17.1.4: dependencies: '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 glob: 10.4.1 lru-cache: 7.18.3 minipass: 7.1.2 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.6 tar: 6.2.1 unique-filename: 3.0.0 cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 callsites@3.1.0: {} caniuse-lite@1.0.30001625: {} cardinal@2.1.1: dependencies: ansicolors: 0.3.2 redeyed: 2.1.1 chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 loupe: 3.1.2 pathval: 2.0.0 chalk-template@1.1.0: dependencies: chalk: 5.3.0 chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 chalk@5.3.0: {} chardet@0.7.0: {} check-error@2.1.1: {} chokidar@4.0.1: dependencies: readdirp: 4.0.1 chownr@2.0.0: {} clean-stack@2.2.0: {} clean-stack@3.0.1: dependencies: escape-string-regexp: 4.0.0 clear-module@4.1.2: dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 cli-progress@3.12.0: dependencies: string-width: 4.2.3 cli-spinners@2.9.2: {} cli-table@0.3.11: dependencies: colors: 1.0.3 cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 cli-width@3.0.0: {} cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 clone-buffer@1.0.0: {} clone-response@1.0.3: dependencies: mimic-response: 1.0.1 clone-stats@1.0.0: {} clone@1.0.4: {} clone@2.1.2: {} cloneable-readable@1.1.3: dependencies: inherits: 2.0.4 process-nextick-args: 2.0.1 readable-stream: 2.3.8 cmd-shim@5.0.0: dependencies: mkdirp-infer-owner: 2.0.0 code-block-writer@13.0.1: {} color-convert@1.9.3: dependencies: color-name: 1.1.3 color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.3: {} color-name@1.1.4: {} color-support@1.1.3: {} colorette@2.0.20: {} colors@1.0.3: {} combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 commander@11.1.0: {} commander@12.1.0: {} commander@7.1.0: {} comment-json@4.2.5: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 common-ancestor-path@1.0.1: {} commondir@1.0.1: {} concat-map@0.0.1: {} concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 concurrently@7.6.0: dependencies: chalk: 4.1.2 date-fns: 2.30.0 lodash: 4.17.21 rxjs: 7.8.1 shell-quote: 1.8.1 spawn-command: 0.0.2-1 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 confusing-browser-globals@1.0.11: {} console-control-strings@1.1.0: {} content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 content-type@1.0.5: {} cookie-signature@1.0.6: {} cookie@0.7.1: {} core-util-is@1.0.3: {} create-require@1.1.1: {} cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 cspell-config-lib@8.15.2: dependencies: '@cspell/cspell-types': 8.15.2 comment-json: 4.2.5 yaml: 2.6.0 cspell-dictionary@8.15.2: dependencies: '@cspell/cspell-pipe': 8.15.2 '@cspell/cspell-types': 8.15.2 cspell-trie-lib: 8.15.2 fast-equals: 5.0.1 cspell-gitignore@8.15.2: dependencies: '@cspell/url': 8.15.2 cspell-glob: 8.15.2 cspell-io: 8.15.2 find-up-simple: 1.0.0 cspell-glob@8.15.2: dependencies: '@cspell/url': 8.15.2 micromatch: 4.0.8 cspell-grammar@8.15.2: dependencies: '@cspell/cspell-pipe': 8.15.2 '@cspell/cspell-types': 8.15.2 cspell-io@8.15.2: dependencies: '@cspell/cspell-service-bus': 8.15.2 '@cspell/url': 8.15.2 cspell-lib@8.15.2: dependencies: '@cspell/cspell-bundled-dicts': 8.15.2 '@cspell/cspell-pipe': 8.15.2 '@cspell/cspell-resolver': 8.15.2 '@cspell/cspell-types': 8.15.2 '@cspell/dynamic-import': 8.15.2 '@cspell/filetypes': 8.15.2 '@cspell/strong-weak-map': 8.15.2 '@cspell/url': 8.15.2 clear-module: 4.1.2 comment-json: 4.2.5 cspell-config-lib: 8.15.2 cspell-dictionary: 8.15.2 cspell-glob: 8.15.2 cspell-grammar: 8.15.2 cspell-io: 8.15.2 cspell-trie-lib: 8.15.2 env-paths: 3.0.0 fast-equals: 5.0.1 gensequence: 7.0.0 import-fresh: 3.3.0 resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 xdg-basedir: 5.1.0 cspell-trie-lib@8.15.2: dependencies: '@cspell/cspell-pipe': 8.15.2 '@cspell/cspell-types': 8.15.2 gensequence: 7.0.0 cspell@8.15.2: dependencies: '@cspell/cspell-json-reporter': 8.15.2 '@cspell/cspell-pipe': 8.15.2 '@cspell/cspell-types': 8.15.2 '@cspell/dynamic-import': 8.15.2 '@cspell/url': 8.15.2 chalk: 5.3.0 chalk-template: 1.1.0 commander: 12.1.0 cspell-dictionary: 8.15.2 cspell-gitignore: 8.15.2 cspell-glob: 8.15.2 cspell-io: 8.15.2 cspell-lib: 8.15.2 fast-json-stable-stringify: 2.1.0 file-entry-cache: 9.1.0 get-stdin: 9.0.0 semver: 7.6.3 tinyglobby: 0.2.9 csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} dargs@7.0.0: {} data-uri-to-buffer@4.0.1: {} data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.6 dateformat@4.6.3: {} debug@2.6.9: dependencies: ms: 2.0.0 debug@3.2.7: dependencies: ms: 2.1.3 debug@4.3.5(supports-color@8.1.1): dependencies: ms: 2.1.2 optionalDependencies: supports-color: 8.1.1 debug@4.3.6: dependencies: ms: 2.1.2 debug@4.3.7: dependencies: ms: 2.1.3 debuglog@1.0.1: {} decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 deep-eql@5.0.2: {} deep-extend@0.6.0: {} deep-is@0.1.4: {} defaults@1.0.4: dependencies: clone: 1.0.4 defer-to-connect@2.0.1: {} define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 delayed-stream@1.0.0: {} delegates@1.0.0: {} depd@2.0.0: {} deprecation@2.3.1: {} dequal@2.0.3: {} destroy@1.2.0: {} dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 diff@4.0.2: {} diff@5.2.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 doctrine@2.1.0: dependencies: esutils: 2.0.3 doctrine@3.0.0: dependencies: esutils: 2.0.3 eastasianwidth@0.2.0: {} ee-first@1.1.1: {} ejs@3.1.10: dependencies: jake: 10.9.1 electron-to-chromium@1.4.787: {} emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} encodeurl@1.0.2: {} encodeurl@2.0.0: {} encoding@0.1.13: dependencies: iconv-lite: 0.6.3 optional: true end-of-stream@1.4.4: dependencies: once: 1.4.0 env-paths@2.2.1: {} env-paths@3.0.0: {} environment@1.1.0: {} err-code@2.0.3: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 error@10.4.0: {} es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 is-data-view: 1.0.1 is-negative-zero: 2.0.3 is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 string.prototype.trimend: 1.0.8 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 es-errors@1.3.0: {} es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 globalthis: 1.0.4 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 '@esbuild/android-arm64': 0.20.2 '@esbuild/android-x64': 0.20.2 '@esbuild/darwin-arm64': 0.20.2 '@esbuild/darwin-x64': 0.20.2 '@esbuild/freebsd-arm64': 0.20.2 '@esbuild/freebsd-x64': 0.20.2 '@esbuild/linux-arm': 0.20.2 '@esbuild/linux-arm64': 0.20.2 '@esbuild/linux-ia32': 0.20.2 '@esbuild/linux-loong64': 0.20.2 '@esbuild/linux-mips64el': 0.20.2 '@esbuild/linux-ppc64': 0.20.2 '@esbuild/linux-riscv64': 0.20.2 '@esbuild/linux-s390x': 0.20.2 '@esbuild/linux-x64': 0.20.2 '@esbuild/netbsd-x64': 0.20.2 '@esbuild/openbsd-x64': 0.20.2 '@esbuild/sunos-x64': 0.20.2 '@esbuild/win32-arm64': 0.20.2 '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 '@esbuild/android-arm': 0.23.1 '@esbuild/android-arm64': 0.23.1 '@esbuild/android-x64': 0.23.1 '@esbuild/darwin-arm64': 0.23.1 '@esbuild/darwin-x64': 0.23.1 '@esbuild/freebsd-arm64': 0.23.1 '@esbuild/freebsd-x64': 0.23.1 '@esbuild/linux-arm': 0.23.1 '@esbuild/linux-arm64': 0.23.1 '@esbuild/linux-ia32': 0.23.1 '@esbuild/linux-loong64': 0.23.1 '@esbuild/linux-mips64el': 0.23.1 '@esbuild/linux-ppc64': 0.23.1 '@esbuild/linux-riscv64': 0.23.1 '@esbuild/linux-s390x': 0.23.1 '@esbuild/linux-x64': 0.23.1 '@esbuild/netbsd-x64': 0.23.1 '@esbuild/openbsd-arm64': 0.23.1 '@esbuild/openbsd-x64': 0.23.1 '@esbuild/sunos-x64': 0.23.1 '@esbuild/win32-arm64': 0.23.1 '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 escalade@3.1.2: {} escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.1 eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.34.2(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1) eslint-plugin-react: 7.34.2(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) object.assign: 4.1.5 object.entries: 1.1.8 eslint-config-prettier@9.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color eslint-plugin-compat@4.2.0(eslint@8.57.0): dependencies: '@mdn/browser-compat-data': 5.5.30 ast-metadata-inferer: 0.8.0 browserslist: 4.23.0 caniuse-lite: 1.0.30001625 eslint: 8.57.0 find-up: 5.0.0 lodash.memoize: 4.1.2 semver: 7.6.3 eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1): dependencies: '@babel/runtime': 7.25.6 aria-query: 5.3.0 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.4 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.19 eslint: 8.57.1 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3): dependencies: eslint: 8.57.1 prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.1) eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-plugin-react@7.34.2(eslint@8.57.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 eslint: 8.57.1 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 object.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.5(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} esquery@1.5.0: dependencies: estraverse: 5.3.0 esrecurse@4.3.0: dependencies: estraverse: 5.3.0 estraverse@5.3.0: {} estree-walker@0.6.1: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 esutils@2.0.3: {} etag@1.8.1: {} event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} events@1.1.1: {} events@3.3.0: {} execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 expect-type@1.1.0: {} exponential-backoff@3.1.1: {} express@4.21.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 path-to-regexp: 0.1.10 proxy-addr: 2.0.7 qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} fast-equals@5.0.1: {} fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fast-levenshtein@3.0.0: dependencies: fastest-levenshtein: 1.0.16 fastest-levenshtein@1.0.16: {} fastq@1.17.1: dependencies: reusify: 1.0.4 fdir@6.4.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 file-entry-cache@9.1.0: dependencies: flat-cache: 5.0.0 filelist@1.0.4: dependencies: minimatch: 5.1.6 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 finalhandler@1.3.1: dependencies: debug: 2.6.9 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 statuses: 2.0.1 unpipe: 1.0.0 transitivePeerDependencies: - supports-color find-up-simple@1.0.0: {} 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-root2@1.2.16: dependencies: micromatch: 4.0.8 pkg-dir: 4.2.0 find-yarn-workspace-root@2.0.0: dependencies: micromatch: 4.0.7 first-chunk-stream@2.0.0: dependencies: readable-stream: 2.3.8 flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 flat-cache@5.0.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 flatted@3.3.1: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 forwarded@0.2.0: {} fresh@0.5.2: {} fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 fs-minipass@2.1.0: dependencies: minipass: 3.3.6 fs-minipass@3.0.3: dependencies: minipass: 7.1.2 fs.realpath@1.0.0: {} fsevents@2.3.3: optional: true function-bind@1.1.2: {} function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 console-control-strings: 1.1.0 has-unicode: 2.0.1 object-assign: 4.1.1 signal-exit: 3.0.7 string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 console-control-strings: 1.1.0 has-unicode: 2.0.1 signal-exit: 3.0.7 string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 gensequence@7.0.0: {} get-caller-file@2.0.5: {} get-east-asian-width@1.2.0: {} get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 get-package-type@0.1.0: {} get-stdin@9.0.0: {} get-stream@5.2.0: dependencies: pump: 3.0.0 get-stream@6.0.1: {} get-stream@8.0.1: {} get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 github-slugger@1.5.0: {} github-username@6.0.0(encoding@0.1.13): dependencies: '@octokit/rest': 18.12.0(encoding@0.1.13) transitivePeerDependencies: - encoding glob-parent@5.1.2: dependencies: is-glob: 4.0.3 glob-parent@6.0.2: dependencies: is-glob: 4.0.3 glob@10.4.1: dependencies: foreground-child: 3.1.1 jackspeak: 3.1.2 minimatch: 9.0.5 minipass: 7.1.2 path-scurry: 1.11.1 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 glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 global-directory@4.0.1: dependencies: ini: 4.1.1 globals@13.24.0: dependencies: type-fest: 0.20.2 globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.0.1 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 '@types/cacheable-request': 6.0.3 '@types/responselike': 1.0.3 cacheable-lookup: 5.0.4 cacheable-request: 7.0.4 decompress-response: 6.0.0 http2-wrapper: 1.0.3 lowercase-keys: 2.0.0 p-cancelable: 2.1.1 responselike: 2.0.1 graceful-fs@4.2.11: {} graphemer@1.4.0: {} grouped-queue@2.0.0: {} has-bigints@1.0.2: {} has-flag@3.0.0: {} has-flag@4.0.0: {} has-own-prop@2.0.0: {} has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 has-proto@1.0.3: {} has-symbols@1.0.3: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 has-unicode@2.0.1: {} hasown@2.0.2: dependencies: function-bind: 1.1.2 hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 http-cache-semantics@4.1.1: {} http-call@5.3.0: dependencies: content-type: 1.0.5 debug: 4.3.7 is-retry-allowed: 1.2.0 is-stream: 2.0.1 parse-json: 4.0.0 tunnel-agent: 0.6.0 transitivePeerDependencies: - supports-color http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 debug: 4.3.7 transitivePeerDependencies: - supports-color http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.7 transitivePeerDependencies: - supports-color http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.7 transitivePeerDependencies: - supports-color human-signals@2.1.0: {} human-signals@5.0.0: {} humanize-ms@1.2.1: dependencies: ms: 2.1.3 husky@9.1.6: {} hyperlinker@1.0.0: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 optional: true ieee754@1.1.13: {} ieee754@1.2.1: {} ignore-walk@4.0.1: dependencies: minimatch: 3.1.2 ignore-walk@6.0.5: dependencies: minimatch: 9.0.5 ignore@5.3.1: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} indent-string@4.0.0: {} infer-owner@1.0.4: {} inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 inherits@2.0.4: {} ini@4.1.1: {} inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 rxjs: 7.8.1 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 interpret@1.4.0: {} ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 ipaddr.js@1.9.1: {} is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 is-arrayish@0.2.1: {} is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 is-callable@1.2.7: {} is-core-module@2.13.1: dependencies: hasown: 2.0.2 is-core-module@2.15.1: dependencies: hasown: 2.0.2 is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 is-docker@2.2.1: {} is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-interactive@1.0.0: {} is-lambda@1.0.1: {} is-map@2.0.3: {} is-negative-zero@2.0.3: {} is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 is-number@7.0.0: {} is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} is-plain-object@5.0.0: {} is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 is-retry-allowed@1.2.0: {} is-scoped@2.1.0: dependencies: scoped-regex: 2.1.0 is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 is-stream@2.0.1: {} is-stream@3.0.0: {} is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 is-unicode-supported@0.1.0: {} is-utf8@0.2.1: {} is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: call-bind: 1.0.7 is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 is-wsl@2.2.0: dependencies: is-docker: 2.2.1 isarray@1.0.0: {} isarray@2.0.5: {} isbinaryfile@4.0.10: {} isbinaryfile@5.0.2: {} isexe@2.0.0: {} iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 jackspeak@3.1.2: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 jake@10.9.1: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 jmespath@0.16.0: {} js-tokens@4.0.0: {} js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 js-yaml@4.1.0: dependencies: argparse: 2.0.1 jsbn@1.1.0: {} json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} json-parse-even-better-errors@2.3.1: {} json-parse-even-better-errors@3.0.2: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} json-stringify-nice@1.1.4: {} json5@1.0.2: dependencies: minimist: 1.2.8 jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 jsonparse@1.3.1: {} jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 just-diff-apply@5.5.0: {} just-diff@5.2.0: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 kleur@3.0.3: {} language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} lint-staged@15.2.10: dependencies: chalk: 5.3.0 commander: 12.1.0 debug: 4.3.6 execa: 8.0.1 lilconfig: 3.1.2 listr2: 8.2.4 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.5.0 transitivePeerDependencies: - supports-color listr2@8.2.4: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.0 load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 locate-path@5.0.0: dependencies: p-locate: 4.1.0 locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash._reinterpolate@3.0.0: {} lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} lodash.template@4.5.0: dependencies: lodash._reinterpolate: 3.0.0 lodash.templatesettings: 4.2.0 lodash.templatesettings@4.2.0: dependencies: lodash._reinterpolate: 3.0.0 lodash@4.17.21: {} log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 long@5.2.3: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 loupe@3.1.2: {} lowercase-keys@2.0.0: {} lru-cache@10.2.2: {} lru-cache@6.0.0: dependencies: yallist: 4.0.0 lru-cache@7.18.3: {} magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: {} make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 http-cache-semantics: 4.1.1 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 lru-cache: 7.18.3 minipass: 3.3.6 minipass-collect: 1.0.2 minipass-fetch: 2.1.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 socks-proxy-agent: 7.0.0 ssri: 9.0.1 transitivePeerDependencies: - bluebird - supports-color make-fetch-happen@11.1.1: dependencies: agentkeepalive: 4.5.0 cacache: 17.1.4 http-cache-semantics: 4.1.1 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 lru-cache: 7.18.3 minipass: 5.0.0 minipass-fetch: 3.0.5 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 socks-proxy-agent: 7.0.0 ssri: 10.0.6 transitivePeerDependencies: - supports-color make-fetch-happen@9.1.0: dependencies: agentkeepalive: 4.5.0 cacache: 15.3.0 http-cache-semantics: 4.1.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 lru-cache: 6.0.0 minipass: 3.3.6 minipass-collect: 1.0.2 minipass-fetch: 1.4.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 socks-proxy-agent: 6.2.1 ssri: 8.0.1 transitivePeerDependencies: - bluebird - supports-color media-typer@0.3.0: {} mem-fs-editor@9.7.0(mem-fs@2.3.0): dependencies: binaryextensions: 4.19.0 commondir: 1.0.1 deep-extend: 0.6.0 ejs: 3.1.10 globby: 11.1.0 isbinaryfile: 5.0.2 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 textextensions: 5.16.0 optionalDependencies: mem-fs: 2.3.0 mem-fs@2.3.0: dependencies: '@types/node': 15.14.9 '@types/vinyl': 2.0.12 vinyl: 2.2.1 vinyl-file: 3.0.0 merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} merge2@1.4.1: {} methods@1.1.2: {} micromatch@4.0.7: dependencies: braces: 3.0.3 picomatch: 2.3.1 micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 mime@1.6.0: {} mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} mimic-function@5.0.1: {} mimic-response@1.0.1: {} mimic-response@3.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} minipass-collect@1.0.2: dependencies: minipass: 3.3.6 minipass-fetch@1.4.1: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 minipass-fetch@3.0.5: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 minipass-flush@1.0.5: dependencies: minipass: 3.3.6 minipass-json-stream@1.0.1: dependencies: jsonparse: 1.3.1 minipass: 3.3.6 minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 minipass-sized@1.0.3: dependencies: minipass: 3.3.6 minipass@3.3.6: dependencies: yallist: 4.0.0 minipass@5.0.0: {} minipass@7.1.2: {} minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 mkdirp-infer-owner@2.0.0: dependencies: chownr: 2.0.0 infer-owner: 1.0.4 mkdirp: 1.0.4 mkdirp@0.5.6: dependencies: minimist: 1.2.8 mkdirp@1.0.4: {} mkdirp@3.0.1: {} module-from-string@3.3.1: dependencies: esbuild: 0.23.1 nanoid: 3.3.7 ms@2.0.0: {} ms@2.1.2: {} ms@2.1.3: {} multer@1.4.5-lts.1: dependencies: append-field: 1.0.0 busboy: 1.6.0 concat-stream: 1.6.2 mkdirp: 0.5.6 object-assign: 4.1.1 type-is: 1.6.18 xtend: 4.0.2 multimatch@5.0.0: dependencies: '@types/minimatch': 3.0.5 array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 minimatch: 3.1.2 mute-stream@0.0.8: {} nanoid@3.3.7: {} natural-compare@1.4.0: {} natural-orderby@2.0.3: {} negotiator@0.6.3: {} node-domexception@1.0.0: {} node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 node-gyp@8.4.1: dependencies: env-paths: 2.2.1 glob: 7.2.3 graceful-fs: 4.2.11 make-fetch-happen: 9.1.0 nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.6.3 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: - bluebird - supports-color node-gyp@9.4.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 glob: 7.2.3 graceful-fs: 4.2.11 make-fetch-happen: 10.2.1 nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.6.3 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: - bluebird - supports-color node-releases@2.0.14: {} nopt@5.0.0: dependencies: abbrev: 1.1.1 nopt@6.0.0: dependencies: abbrev: 1.1.1 normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.13.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} normalize-url@6.1.0: {} npm-bundled@1.1.2: dependencies: npm-normalize-package-bin: 1.0.1 npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 npm-install-checks@4.0.0: dependencies: semver: 7.6.3 npm-install-checks@6.3.0: dependencies: semver: 7.6.3 npm-normalize-package-bin@1.0.1: {} npm-normalize-package-bin@2.0.0: {} npm-normalize-package-bin@3.0.1: {} npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 semver: 7.6.3 validate-npm-package-name: 5.0.1 npm-package-arg@8.1.5: dependencies: hosted-git-info: 4.1.0 semver: 7.6.3 validate-npm-package-name: 3.0.0 npm-packlist@3.0.0: dependencies: glob: 7.2.3 ignore-walk: 4.0.1 npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 npm-packlist@7.0.4: dependencies: ignore-walk: 6.0.5 npm-pick-manifest@6.1.1: dependencies: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 semver: 7.6.3 npm-pick-manifest@8.0.2: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 semver: 7.6.3 npm-registry-fetch@12.0.2: dependencies: make-fetch-happen: 10.2.1 minipass: 3.3.6 minipass-fetch: 1.4.1 minipass-json-stream: 1.0.1 minizlib: 2.1.2 npm-package-arg: 8.1.5 transitivePeerDependencies: - bluebird - supports-color npm-registry-fetch@14.0.5: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 minipass-fetch: 3.0.5 minipass-json-stream: 1.0.1 minizlib: 2.1.2 npm-package-arg: 10.1.0 proc-log: 3.0.0 transitivePeerDependencies: - supports-color npm-run-path@4.0.1: dependencies: path-key: 3.1.1 npm-run-path@5.3.0: dependencies: path-key: 4.0.0 npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 object-assign@4.1.1: {} object-inspect@1.13.1: {} object-keys@1.1.1: {} object-treeify@1.1.33: {} object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 object.hasown@1.1.4: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 oclif@3.17.2(@types/node@22.5.2)(encoding@0.1.13)(mem-fs@2.3.0)(typescript@5.5.4): dependencies: '@oclif/core': 2.16.0(@types/node@22.5.2)(typescript@5.5.4) '@oclif/plugin-help': 5.2.20(@types/node@22.5.2)(typescript@5.5.4) '@oclif/plugin-not-found': 2.4.3(@types/node@22.5.2)(typescript@5.5.4) '@oclif/plugin-warn-if-update-available': 2.1.1(@types/node@22.5.2)(typescript@5.5.4) async-retry: 1.3.3 aws-sdk: 2.1632.0 concurrently: 7.6.0 debug: 4.3.5(supports-color@8.1.1) find-yarn-workspace-root: 2.0.0 fs-extra: 8.1.0 github-slugger: 1.5.0 got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 semver: 7.6.3 shelljs: 0.8.5 tslib: 2.7.0 yeoman-environment: 3.19.3 yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - bluebird - encoding - mem-fs - supports-color - typescript on-finished@2.4.1: dependencies: ee-first: 1.1.1 once@1.4.0: dependencies: wrappy: 1.0.2 onetime@5.1.2: dependencies: mimic-fn: 2.1.0 onetime@6.0.0: dependencies: mimic-fn: 4.0.0 onetime@7.0.0: dependencies: mimic-function: 5.0.1 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 ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 os-tmpdir@1.0.2: {} p-cancelable@2.1.1: {} p-finally@1.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-map@4.0.0: dependencies: aggregate-error: 3.1.0 p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 p-timeout@3.2.0: dependencies: p-finally: 1.0.0 p-transform@1.3.0: dependencies: debug: 4.3.7 p-queue: 6.6.2 transitivePeerDependencies: - supports-color p-try@2.2.0: {} pacote@12.0.3: dependencies: '@npmcli/git': 2.1.0 '@npmcli/installed-package-contents': 1.0.7 '@npmcli/promise-spawn': 1.3.2 '@npmcli/run-script': 2.0.0 cacache: 15.3.0 chownr: 2.0.0 fs-minipass: 2.1.0 infer-owner: 1.0.4 minipass: 3.3.6 mkdirp: 1.0.4 npm-package-arg: 8.1.5 npm-packlist: 3.0.0 npm-pick-manifest: 6.1.1 npm-registry-fetch: 12.0.2 promise-retry: 2.0.1 read-package-json-fast: 2.0.3 rimraf: 3.0.2 ssri: 8.0.1 tar: 6.2.1 transitivePeerDependencies: - bluebird - supports-color pacote@15.2.0: dependencies: '@npmcli/git': 4.1.0 '@npmcli/installed-package-contents': 2.1.0 '@npmcli/promise-spawn': 6.0.2 '@npmcli/run-script': 6.0.2 cacache: 17.1.4 fs-minipass: 3.0.3 minipass: 5.0.0 npm-package-arg: 10.1.0 npm-packlist: 7.0.4 npm-pick-manifest: 8.0.2 npm-registry-fetch: 14.0.5 proc-log: 3.0.0 promise-retry: 2.0.1 read-package-json: 6.0.4 read-package-json-fast: 3.0.2 sigstore: 1.9.0 ssri: 10.0.6 tar: 6.2.1 transitivePeerDependencies: - bluebird - supports-color parent-module@1.0.1: dependencies: callsites: 3.1.0 parent-module@2.0.0: dependencies: callsites: 3.1.0 parse-conflict-json@2.0.2: dependencies: json-parse-even-better-errors: 2.3.1 just-diff: 5.2.0 just-diff-apply: 5.5.0 parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parseurl@1.3.3: {} password-prompt@1.1.3: dependencies: ansi-escapes: 4.3.2 cross-spawn: 7.0.3 path-browserify@1.0.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: {} path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 minipass: 7.1.2 path-to-regexp@0.1.10: {} path-type@4.0.0: {} pathe@1.1.2: {} pathval@2.0.0: {} picocolors@1.1.0: {} picomatch@2.3.1: {} picomatch@4.0.2: {} pidtree@0.6.0: {} pify@2.3.0: {} pify@4.0.1: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 possible-typed-array-names@1.0.0: {} postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 source-map-js: 1.2.0 preferred-pm@3.1.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.0.0 prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 prettier@3.3.3: {} pretty-bytes@5.6.0: {} proc-log@1.0.0: {} proc-log@3.0.0: {} process-nextick-args@2.0.1: {} process@0.11.10: {} promise-all-reject-late@1.0.1: {} promise-call-limit@1.0.2: {} promise-inflight@1.0.1: {} promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 protobufjs@7.3.0: 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.5.2 long: 5.2.3 proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 punycode@1.3.2: {} punycode@2.3.1: {} qs@6.13.0: dependencies: side-channel: 1.0.6 querystring@0.2.0: {} queue-microtask@1.2.3: {} quick-lru@5.1.1: {} range-parser@1.2.1: {} raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 react-is@16.13.1: {} react@18.3.1: dependencies: loose-envify: 1.4.0 read-cmd-shim@3.0.1: {} read-package-json-fast@2.0.3: dependencies: json-parse-even-better-errors: 2.3.1 npm-normalize-package-bin: 1.0.1 read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 read-package-json@6.0.4: dependencies: glob: 10.4.1 json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 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 readable-stream@2.3.8: 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 string_decoder: 1.3.0 util-deprecate: 1.0.2 readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 readdir-scoped-modules@1.1.0: dependencies: debuglog: 1.0.1 dezalgo: 1.0.4 graceful-fs: 4.2.11 once: 1.4.0 readdirp@4.0.1: {} rechoir@0.6.2: dependencies: resolve: 1.22.8 redeyed@2.1.1: dependencies: esprima: 4.0.1 reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.4 which-builtin-type: 1.1.4 regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 remove-trailing-separator@1.1.0: {} repeat-string@1.6.1: {} replace-ext@1.0.1: {} require-directory@2.1.1: {} resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 retry@0.12.0: {} retry@0.13.1: {} reusify@1.0.4: {} rfdc@1.4.1: {} rimraf@3.0.2: dependencies: glob: 7.2.3 rollup-plugin-inject@3.0.2: dependencies: estree-walker: 0.6.1 magic-string: 0.25.9 rollup-pluginutils: 2.8.2 rollup-plugin-node-polyfills@0.2.1: dependencies: rollup-plugin-inject: 3.0.2 rollup-pluginutils@2.8.2: dependencies: estree-walker: 0.6.1 rollup@4.18.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: '@rollup/rollup-android-arm-eabi': 4.18.0 '@rollup/rollup-android-arm64': 4.18.0 '@rollup/rollup-darwin-arm64': 4.18.0 '@rollup/rollup-darwin-x64': 4.18.0 '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 '@rollup/rollup-linux-arm-musleabihf': 4.18.0 '@rollup/rollup-linux-arm64-gnu': 4.18.0 '@rollup/rollup-linux-arm64-musl': 4.18.0 '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 '@rollup/rollup-linux-riscv64-gnu': 4.18.0 '@rollup/rollup-linux-s390x-gnu': 4.18.0 '@rollup/rollup-linux-x64-gnu': 4.18.0 '@rollup/rollup-linux-x64-musl': 4.18.0 '@rollup/rollup-win32-arm64-msvc': 4.18.0 '@rollup/rollup-win32-ia32-msvc': 4.18.0 '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 run-async@2.4.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 rxjs@7.8.1: dependencies: tslib: 2.7.0 safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 safer-buffer@2.1.2: {} sax@1.2.1: {} scoped-regex@2.1.0: {} semver@5.7.2: {} semver@6.3.1: {} semver@7.6.3: {} send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 http-errors: 2.0.0 mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 statuses: 2.0.1 transitivePeerDependencies: - supports-color serve-static@1.16.2: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 send: 0.19.0 transitivePeerDependencies: - supports-color set-blocking@2.0.0: {} 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.2.4 gopd: 1.0.1 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 setprototypeof@1.2.0: {} shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} shell-quote@1.8.1: {} shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 siginfo@2.0.0: {} signal-exit@3.0.7: {} signal-exit@4.1.0: {} sigstore@1.9.0: dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 '@sigstore/sign': 1.0.0 '@sigstore/tuf': 1.0.3 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color sisteransi@1.0.5: {} slash@3.0.0: {} slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 smart-buffer@4.2.0: {} socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 debug: 4.3.7 socks: 2.8.3 transitivePeerDependencies: - supports-color socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.7 socks: 2.8.3 transitivePeerDependencies: - supports-color socks@2.8.3: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 sort-keys@4.2.0: dependencies: is-plain-obj: 2.1.0 source-map-js@1.2.0: {} sourcemap-codec@1.4.8: {} spawn-command@0.0.2-1: {} spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.18 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.18 spdx-license-ids@3.0.18: {} sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} ssri@10.0.6: dependencies: minipass: 7.1.2 ssri@8.0.1: dependencies: minipass: 3.3.6 ssri@9.0.1: dependencies: minipass: 3.3.6 stackback@0.0.2: {} statuses@2.0.1: {} std-env@3.7.0: {} streamsearch@1.1.0: {} string-argv@0.3.2: {} string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 gopd: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 strip-bom-buf@1.0.0: dependencies: is-utf8: 0.2.1 strip-bom-stream@2.0.0: dependencies: first-chunk-stream: 2.0.0 strip-bom: 2.0.0 strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} strip-json-comments@3.1.1: {} supports-color@5.5.0: dependencies: has-flag: 3.0.0 supports-color@7.2.0: dependencies: has-flag: 4.0.0 supports-color@8.1.1: dependencies: has-flag: 4.0.0 supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 supports-preserve-symlinks-flag@1.0.0: {} synckit@0.9.1: dependencies: '@pkgr/core': 0.1.1 tslib: 2.7.0 tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 minipass: 5.0.0 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 text-table@0.2.0: {} textextensions@5.16.0: {} through@2.3.8: {} tinybench@2.9.0: {} tinyexec@0.3.1: {} tinyglobby@0.2.9: dependencies: fdir: 6.4.0(picomatch@4.0.2) picomatch: 4.0.2 tinypool@1.0.1: {} tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} tr46@0.0.3: {} tree-kill@1.2.2: {} treeverse@1.0.4: {} ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 ts-api-utils@1.3.0(typescript@5.5.4): dependencies: typescript: 5.5.4 ts-morph@23.0.0: dependencies: '@ts-morph/common': 0.24.0 code-block-writer: 13.0.1 ts-node@10.9.2(@types/node@22.5.2)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 22.5.2 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 typescript: 5.5.4 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.7.0: {} tsx@4.19.0: dependencies: esbuild: 0.23.1 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 debug: 4.3.7 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 turbo-darwin-64@2.1.3: optional: true turbo-darwin-arm64@2.1.3: optional: true turbo-linux-64@2.1.3: optional: true turbo-linux-arm64@2.1.3: optional: true turbo-windows-64@2.1.3: optional: true turbo-windows-arm64@2.1.3: optional: true turbo@2.1.3: optionalDependencies: turbo-darwin-64: 2.1.3 turbo-darwin-arm64: 2.1.3 turbo-linux-64: 2.1.3 turbo-linux-arm64: 2.1.3 turbo-windows-64: 2.1.3 turbo-windows-arm64: 2.1.3 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: {} type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 typedarray@0.0.6: {} typescript@5.4.5: {} typescript@5.5.4: {} unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 undici-types@6.19.8: {} unique-filename@1.1.1: dependencies: unique-slug: 2.0.2 unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 unique-slug@2.0.2: dependencies: imurmurhash: 0.1.4 unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 universal-user-agent@6.0.1: {} universalify@0.1.2: {} unpipe@1.0.0: {} untildify@4.0.0: {} update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.1.0 uri-js@4.4.1: dependencies: punycode: 2.3.1 url@0.10.3: dependencies: punycode: 1.3.2 querystring: 0.2.0 util-deprecate@1.0.2: {} util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 which-typed-array: 1.1.15 utils-merge@1.0.1: {} uuid@8.0.0: {} 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@3.0.0: dependencies: builtins: 1.0.3 validate-npm-package-name@5.0.1: {} vary@1.1.2: {} vinyl-file@3.0.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 strip-bom-buf: 1.0.0 strip-bom-stream: 2.0.0 vinyl: 2.2.1 vinyl@2.2.1: dependencies: clone: 2.1.2 clone-buffer: 1.0.0 clone-stats: 1.0.0 cloneable-readable: 1.1.3 remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 vite-node@2.1.4(@types/node@22.5.2): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 vite: 5.2.12(@types/node@22.5.2) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass - stylus - sugarss - supports-color - terser vite@5.2.12(@types/node@22.5.2): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: '@types/node': 22.5.2 fsevents: 2.3.3 vitest@2.1.4(@types/node@22.5.2): dependencies: '@vitest/expect': 2.1.4 '@vitest/mocker': 2.1.4(vite@5.2.12(@types/node@22.5.2)) '@vitest/pretty-format': 2.1.4 '@vitest/runner': 2.1.4 '@vitest/snapshot': 2.1.4 '@vitest/spy': 2.1.4 '@vitest/utils': 2.1.4 chai: 5.1.2 debug: 4.3.7 expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 vite: 5.2.12(@types/node@22.5.2) vite-node: 2.1.4(@types/node@22.5.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.5.2 transitivePeerDependencies: - less - lightningcss - msw - sass - stylus - sugarss - supports-color - terser vscode-languageserver-textdocument@1.0.12: {} vscode-uri@3.0.8: {} walk-up-path@1.0.0: {} wcwidth@1.0.1: dependencies: defaults: 1.0.4 web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 which-builtin-type@1.1.4: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 is-generator-function: 1.0.10 is-regex: 1.1.4 is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 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.3 which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 which@3.0.1: dependencies: isexe: 2.0.0 why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 wide-align@1.1.5: dependencies: string-width: 4.2.3 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 wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 wrappy@1.0.2: {} write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 xdg-basedir@5.1.0: {} xml2js@0.6.2: dependencies: sax: 1.2.1 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} xtend@4.0.2: {} y18n@5.0.8: {} yallist@4.0.0: {} yaml@2.5.0: {} yaml@2.6.0: {} yargs-parser@21.1.1: {} yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 yeoman-environment@3.19.3: dependencies: '@npmcli/arborist': 4.3.1 are-we-there-yet: 2.0.0 arrify: 2.0.1 binaryextensions: 4.19.0 chalk: 4.1.2 cli-table: 0.3.11 commander: 7.1.0 dateformat: 4.6.3 debug: 4.3.7 diff: 5.2.0 error: 10.4.0 escape-string-regexp: 4.0.0 execa: 5.1.1 find-up: 5.0.0 globby: 11.1.0 grouped-queue: 2.0.0 inquirer: 8.2.6 is-scoped: 2.1.0 isbinaryfile: 4.0.10 lodash: 4.17.21 log-symbols: 4.1.0 mem-fs: 2.3.0 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimatch: 3.1.2 npmlog: 5.0.1 p-queue: 6.6.2 p-transform: 1.3.0 pacote: 12.0.3 preferred-pm: 3.1.3 pretty-bytes: 5.6.0 readable-stream: 4.5.2 semver: 7.6.3 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 textextensions: 5.16.0 untildify: 4.0.0 transitivePeerDependencies: - bluebird - supports-color yeoman-generator@5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3): dependencies: chalk: 4.1.2 dargs: 7.0.0 debug: 4.3.7 execa: 5.1.1 github-username: 6.0.0(encoding@0.1.13) lodash: 4.17.21 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimist: 1.2.8 pacote: 15.2.0 read-pkg-up: 7.0.1 run-async: 2.4.1 semver: 7.6.3 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 optionalDependencies: yeoman-environment: 3.19.3 transitivePeerDependencies: - bluebird - encoding - mem-fs - supports-color yn@3.1.1: {} yocto-queue@0.1.0: {} golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/pnpm-workspace.yaml000066400000000000000000000003541471722043300303130ustar00rootroot00000000000000packages: - eslint/* - types - types/docs-generator - shared - generators - helpers - hooks - merge - integrations/oclif - integrations/commander - cli/create-completion-spec - cli/publish-spec - cli/tools-cli golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/000077500000000000000000000000001471722043300257255ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/.gitignore000066400000000000000000000000711471722043300277130ustar00rootroot00000000000000.DS_Store node_modules/ lib/ test/fixtures/**/output.jsongolang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/README.md000066400000000000000000000003071471722043300272040ustar00rootroot00000000000000# @fig/autocomplete-shared package This package contains shared utilities related to autocomplete specs that are used across Fig products (right now the `autocomplete-engine` and `mission-control`. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/index.ts000066400000000000000000000011371471722043300274060ustar00rootroot00000000000000import type * as Internal from "./src/convert"; import type * as Metadata from "./src/specMetadata"; import { revertSubcommand } from "./src/revert"; import { convertSubcommand } from "./src/convert"; import { convertLoadSpec, initializeDefault } from "./src/specMetadata"; import { SpecMixin, applyMixin, mergeSubcommands } from "./src/mixins"; import { SpecLocationSource, makeArray } from "./src/utils"; export { Internal, revertSubcommand, convertSubcommand, Metadata, convertLoadSpec, initializeDefault, SpecMixin, applyMixin, mergeSubcommands, makeArray, SpecLocationSource, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/package.json000066400000000000000000000017261471722043300302210ustar00rootroot00000000000000{ "name": "@fig/autocomplete-shared", "version": "1.1.2", "description": "Internal shared utilities for working with Fig specs", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "typings": "./dist/cjs/index.d.ts", "exports": { "require": "./dist/cjs/index.js", "import": "./dist/esm/index.js" }, "files": [ "dist/" ], "scripts": { "clean": "rm -rf dist/", "build": "pnpm clean && pnpm build:cjs && pnpm build:esm", "build:cjs": "tsc --declaration --outDir dist/cjs", "build:esm": "tsc --declaration --module esnext --outDir dist/esm", "prepack": "pnpm build" }, "author": "Fig Team", "license": "MIT", "devDependencies": { "@tsconfig/recommended": "^1.0.7", "@types/node": "^22.5.2", "@types/semver": "^7.5.8", "@withfig/autocomplete-types": "workspace:^", "prettier": "^3.3.3", "typescript": "^5.5.4", "vitest": "^2.1.4" }, "publishConfig": { "access": "public" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/000077500000000000000000000000001471722043300265145ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/convert.ts000066400000000000000000000043631471722043300305520ustar00rootroot00000000000000import { makeArray } from "./utils"; export type SuggestionType = Fig.SuggestionType | "history" | "auto-execute"; type Override = Omit & S; export type Suggestion = Override; export type Option = OptionT & { name: string[]; args: ArgT[]; }; export type Subcommand = SubcommandT & { name: string[]; subcommands: Record>; options: Record>; persistentOptions: Record>; args: ArgT[]; }; const makeNamedMap = (items: T[] | undefined): Record => { const nameMapping: Record = {}; if (!items) { return nameMapping; } for (let i = 0; i < items.length; i += 1) { items[i].name.forEach((name) => { nameMapping[name] = items[i]; }); } return nameMapping; }; export type Initializer = { subcommand: (subcommand: Fig.Subcommand) => SubcommandT; option: (option: Fig.Option) => OptionT; arg: (arg: Fig.Arg) => ArgT; }; function convertOption( option: Fig.Option, initialize: Omit, "subcommand"> ): Option { return { ...initialize.option(option), name: makeArray(option.name), args: option.args ? makeArray(option.args).map(initialize.arg) : [], }; } export function convertSubcommand( subcommand: Fig.Subcommand, initialize: Initializer ): Subcommand { const { subcommands, options, args } = subcommand; return { ...initialize.subcommand(subcommand), name: makeArray(subcommand.name), subcommands: makeNamedMap(subcommands?.map((s) => convertSubcommand(s, initialize))), options: makeNamedMap( options ?.filter((option) => !option.isPersistent) ?.map((option) => convertOption(option, initialize)) ), persistentOptions: makeNamedMap( options ?.filter((option) => option.isPersistent) ?.map((option) => convertOption(option, initialize)) ), args: args ? makeArray(args).map(initialize.arg) : [], }; } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/mixins.ts000066400000000000000000000116161471722043300304000ustar00rootroot00000000000000import { makeArray } from "./utils"; export type SpecMixin = | Fig.Subcommand | ((currentSpec: Fig.Subcommand, context: Fig.ShellContext) => Fig.Subcommand); type NamedObject = { name: Fig.SingleOrArray }; const concatArrays = (a: T[] | undefined, b: T[] | undefined): T[] | undefined => a && b ? [...a, ...b] : a || b; const mergeNames = (a: T | T[], b: T | T[]): T | T[] => [ ...new Set(concatArrays(makeArray(a), makeArray(b))), ]; const mergeArrays = (a: T[] | undefined, b: T[] | undefined): T[] | undefined => a && b ? [...new Set(concatArrays(makeArray(a), makeArray(b)))] : a || b; const mergeArgs = (arg: Fig.Arg, partial: Fig.Arg): Fig.Arg => ({ ...arg, ...partial, suggestions: concatArrays(arg.suggestions, partial.suggestions), generators: arg.generators && partial.generators ? concatArrays(makeArray(arg.generators), makeArray(partial.generators)) : arg.generators || partial.generators, template: arg.template && partial.template ? mergeNames(arg.template, partial.template) : arg.template || partial.template, }); const mergeArgArrays = ( args: Fig.SingleOrArray | undefined, partials: Fig.SingleOrArray | undefined ): Fig.SingleOrArray | undefined => { if (!args || !partials) { return args || partials; } const argArray = makeArray(args); const partialArray = makeArray(partials); const result = []; for (let i = 0; i < Math.max(argArray.length, partialArray.length); i += 1) { const arg = argArray[i]; const partial = partialArray[i]; if (arg !== undefined && partial !== undefined) { result.push(mergeArgs(arg, partial)); } else if (partial !== undefined || arg !== undefined) { result.push(arg || partial); } } return result.length === 1 ? result[0] : result; }; const mergeOptions = (option: Fig.Option, partial: Fig.Option): Fig.Option => ({ ...option, ...partial, name: mergeNames(option.name, partial.name), args: mergeArgArrays(option.args, partial.args), exclusiveOn: mergeArrays(option.exclusiveOn, partial.exclusiveOn), dependsOn: mergeArrays(option.dependsOn, partial.dependsOn), }); const mergeNamedObjectArrays = ( objects: T[] | undefined, partials: T[] | undefined, mergeItems: (a: T, b: T) => T ): T[] | undefined => { if (!objects || !partials) { return objects || partials; } const mergedObjects = objects ? [...objects] : []; const existingNameIndexMap: Record = {}; for (let i = 0; i < objects.length; i += 1) { makeArray(objects[i].name).forEach((name) => { existingNameIndexMap[name] = i; }); } for (let i = 0; i < partials.length; i += 1) { const partial = partials[i]; if (!partial) { throw new Error("Invalid object passed to merge"); } const existingNames = makeArray(partial.name).filter((name) => name in existingNameIndexMap); if (existingNames.length === 0) { mergedObjects.push(partial); } else { const index = existingNameIndexMap[existingNames[0]]; if (existingNames.some((name) => existingNameIndexMap[name] !== index)) { throw new Error("Names provided for option matched multiple existing options"); } mergedObjects[index] = mergeItems(mergedObjects[index], partial); } } return mergedObjects; }; function mergeOptionArrays( options: Fig.Option[] | undefined, partials: Fig.Option[] | undefined ): Fig.Option[] | undefined { return mergeNamedObjectArrays(options, partials, mergeOptions); } function mergeSubcommandArrays( subcommands: Fig.Subcommand[] | undefined, partials: Fig.Subcommand[] | undefined ): Fig.Subcommand[] | undefined { // eslint-disable-next-line @typescript-eslint/no-use-before-define return mergeNamedObjectArrays(subcommands, partials, mergeSubcommands); } export function mergeSubcommands( subcommand: Fig.Subcommand, partial: Fig.Subcommand ): Fig.Subcommand { return { ...subcommand, ...partial, name: mergeNames(subcommand.name, partial.name), args: mergeArgArrays(subcommand.args, partial.args), additionalSuggestions: concatArrays( subcommand.additionalSuggestions, partial.additionalSuggestions ), subcommands: mergeSubcommandArrays(subcommand.subcommands, partial.subcommands), options: mergeOptionArrays(subcommand.options, partial.options), parserDirectives: subcommand.parserDirectives && partial.parserDirectives ? { ...subcommand.parserDirectives, ...partial.parserDirectives } : subcommand.parserDirectives || partial.parserDirectives, }; } export const applyMixin = ( spec: Fig.Subcommand, context: Fig.ShellContext, mixin: SpecMixin ): Fig.Subcommand => { if (typeof mixin === "function") { return mixin(spec, context); } const partial = mixin; return mergeSubcommands(spec, partial); }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/revert.ts000066400000000000000000000026321471722043300303760ustar00rootroot00000000000000import { Option, Subcommand } from "./convert"; function makeSingleOrArray(arr: T[]): Fig.SingleOrArray { return arr.length === 1 ? (arr[0] as Fig.SingleOrArray) : (arr as Fig.SingleOrArray); } function revertOption(option: Option): Fig.Option { const { name, args } = option; return { name: makeSingleOrArray(name), args, }; } export function revertSubcommand( subcommand: Subcommand, postProcessingFn: ( oldSub: Subcommand, newSub: Fig.Subcommand ) => Fig.Subcommand ): Fig.Subcommand { const { name, subcommands, options, persistentOptions, args } = subcommand; const newSubcommand: Fig.Subcommand = { name: makeSingleOrArray(name), subcommands: Object.values(subcommands).length !== 0 ? Object.values(subcommands).map((sub) => revertSubcommand(sub, postProcessingFn)) : undefined, options: Object.values(options).length !== 0 ? [ ...Object.values(options).map((option) => revertOption(option)), ...Object.values(persistentOptions).map((option) => revertOption(option)), ] : undefined, args: Object.values(args).length !== 0 ? makeSingleOrArray(Object.values(args)) : undefined, }; return postProcessingFn(subcommand, newSubcommand); } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/specMetadata.ts000066400000000000000000000066061471722043300314670ustar00rootroot00000000000000import { Subcommand, convertSubcommand, Initializer } from "./convert"; import { makeArray, SpecLocationSource } from "./utils"; // eslint-disable-next-line @typescript-eslint/ban-types type FigLoadSpecFn = Fig.LoadSpec extends infer U ? (U extends Function ? U : never) : never; export type LoadSpec = | Fig.SpecLocation[] | Subcommand | (( ...args: Parameters ) => Promise>); export type OptionMeta = Omit; export type ArgMeta = Omit & { generators: Fig.Generator[]; loadSpec?: LoadSpec; }; type SubcommandMetaExcludes = | "subcommands" | "options" | "loadSpec" | "persistentOptions" | "args" | "name"; export type SubcommandMeta = Omit & { loadSpec?: LoadSpec; }; export function convertLoadSpec( loadSpec: Fig.LoadSpec, initialize: Initializer ): LoadSpec { if (typeof loadSpec === "string") { return [{ name: loadSpec, type: SpecLocationSource.GLOBAL }]; } if (typeof loadSpec === "function") { return (...args) => loadSpec(...args).then((result) => { if (Array.isArray(result)) { return result; } if ("type" in result) { return [result]; } // eslint-disable-next-line @typescript-eslint/no-use-before-define return convertSubcommand(result, initialize); }); } // eslint-disable-next-line @typescript-eslint/no-use-before-define return convertSubcommand(loadSpec, initialize); } function initializeOptionMeta(option: Fig.Option): OptionMeta { return option; } // Default initialization functions: function initializeArgMeta(arg: Fig.Arg): ArgMeta { const { template, ...rest } = arg; const generators = template ? [{ template }] : makeArray(arg.generators ?? []); return { ...rest, loadSpec: arg.loadSpec ? convertLoadSpec(arg.loadSpec, { option: initializeOptionMeta, // eslint-disable-next-line @typescript-eslint/no-use-before-define subcommand: initializeSubcommandMeta, arg: initializeArgMeta, }) : undefined, generators: generators.map((generator) => { let { trigger, getQueryTerm } = generator; if (generator.template) { const templates = makeArray(generator.template); if (templates.includes("folders") || templates.includes("filepaths")) { trigger = trigger ?? "/"; getQueryTerm = getQueryTerm ?? "/"; } } return { ...generator, trigger, getQueryTerm }; }), }; } function initializeSubcommandMeta(subcommand: Fig.Subcommand): SubcommandMeta { return { ...subcommand, loadSpec: subcommand.loadSpec ? convertLoadSpec(subcommand.loadSpec, { subcommand: initializeSubcommandMeta, option: initializeOptionMeta, arg: initializeArgMeta, }) : undefined, }; } export const initializeDefault: Initializer = { subcommand: initializeSubcommandMeta, option: initializeOptionMeta, arg: initializeArgMeta, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/src/utils.ts000066400000000000000000000002671471722043300302310ustar00rootroot00000000000000export function makeArray(object: T | T[]): T[] { return Array.isArray(object) ? object : [object]; } export enum SpecLocationSource { GLOBAL = "global", LOCAL = "local", } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/shared/tsconfig.json000066400000000000000000000010171471722043300304330ustar00rootroot00000000000000{ "extends": "@tsconfig/recommended", "compilerOptions": { "lib": ["ESNext", "DOM"], "moduleResolution": "node", "esModuleInterop": true, "sourceMap": true, "allowSyntheticDefaultImports": true, "baseUrl": "./", "declaration": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "noUnusedParameters": true, "types": ["@withfig/autocomplete-types", "node"] }, "exclude": ["node_modules/", "dist/", "test/"], "include": ["./"], } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/turbo.json000066400000000000000000000007121471722043300265050ustar00rootroot00000000000000{ "$schema": "https://turbo.build/schema.json", "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**", "lib/**"], "inputs": [".ts", ".js"] }, "test": { "dependsOn": ["build"], "outputs": [], "inputs": ["__tests__/**", "test/**", "tests/**"] }, "test:overwrite": { "dependsOn": ["build"], "outputs": [], "inputs": ["__tests__/**", "test/**", "tests/**"] } } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/000077500000000000000000000000001471722043300256235ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/.eslintrc.cjs000066400000000000000000000001261471722043300302240ustar00rootroot00000000000000module.exports = { rules: { "import/no-extraneous-dependencies": "off", }, }; golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/CONTRIBUTING.md000066400000000000000000000000001471722043300300420ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/LICENSE000066400000000000000000000020711471722043300266300ustar00rootroot00000000000000MIT License Copyright (c) 2021 Hercules Labs Inc. (Fig) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/README.md000066400000000000000000000117311471722043300271050ustar00rootroot00000000000000# @withfig/autocomplete-types package This is the package providing types for our autocomplete app. ## Typings for fig autocomplete specs and other tools Configure the global Fig namespace in your `tsconfig.json`: ```jsonc { "compilerOptions": { // you may get some typecheck errors if you are using some node packages like "fs" // just include "node" in the below array. Same for "jest", "chai"...and so on. "types": ["@withfig/autocomplete-types"] }, } ``` ### FAQs - I have done everything described above but I can't get my IDE (e.g. VSCode) to detect the autocomplete types, what can I do? You should try some of the following steps: 1) Restart the IDE 2) Delete your `node_modules/` folder and reinstall again the packages 3) Restart the system If you are still unable to use `@withfig/autocomplete-types`, please open an issue [here](https://github.com/withfig/autocomplete-tools/issues). ## Documenting the API We use [TSDocs](https://tsdoc.org) to comment the exported symbols of the Fig namespace. In our docs generator, which is executed on our backend each time the types are updated, we perform some custom Typescript AST traversals and we retrieve all the exported nodes with their TSDoc comments. > For Fig members: see the website repo to find out more about the custom generator we are using for docs ### How are the docs organized once they are parsed from the Typescript AST? First of all we generate an entire page on the website for each of the main interfaces available in the Fig namespace, all the typealiases go to the "Others" page. ### Supported TSDoc tags and custom JSDoc tags #### `Interface` - @filename: to change the target filename of an interface (internal) - @excluded: do not generate docs for the Interface #### `Typealias` - @param: The params of an exported function, the format MUST be `@param `. It can be provided multiple times for different params. ```ts /** * @param value some description for the value param */ type Callback = (value) => void ``` - @returns: An explanation of what is returned by a function. ```ts /** * @param value some description for the value param * @returns nothing */ type Callback = (value) => void ``` - @remarks: Further details about the implementation of the method, use cases...etc. This data will appear in the `Discussion` section. - @example: Provide examples about the usage of the API object. It is repeatable. - @excluded: do not generate docs for the Typealias #### `Interface` member - @param: The params of an exported function, the format MUST be `@param `. It can be provided multiple times for different params. ```ts /** * @param value some description for the value param */ memberName: (value) => void ``` - @returns: An explanation of what is returned by a function. ```ts /** * @param value some description for the value param * @returns nothing */ memberName: (value) => void ``` - @remarks: Further details about the implementation of the method, use cases...etc. This data will appear in the `Discussion` section. - @example: Provide examples about the usage of the API object. It is repeatable. - @defaultValue: define the default value of a member. - @deprecated: Mark an API as deprecated providing an optional message about the deprecation. ```ts /** * @deprecated This message is optional */ export const didChange = { subscribe: (notification) => { }, } ``` - @excluded: do not generate docs for the member - @category: assign a category to an interface member #### Custom resolution We perform some analysis over the types before generating the docs. In particular all the types from the Fig namespace are replaced recursively with Typescript primitive types like functions, string... For `Interface members` and `Typealiases` are available some additional tags that prevent complete or partial replacements of the Types. - @irreplaced: do not replace any Symbol contained in the one tagged ```ts // e.g. with the irreplaced tag type Data = string /** * @irreplaced */ type Res = Data // will output type Data = string type Res = Data ``` ```ts // e.g. without the irreplaced tag type Data = string type Res = Data // will output type Data = string type Res = string ``` - @irreplaceable: this Typealias cannot be replaced in any Symbol that references the tagged one ```ts // e.g. with the irreplaceable tag /** * @irreplaceable */ type Data = string type Res = Data // will output type Data = string type Res = Data ``` ```ts // e.g. without the irreplaceable tag type Data = string type Res = Data // will output type Data = string type Res = string ``` - @replaceFirstLevel: only replaces the direct Symbols contained in the tagged one, then act as @irreplaceable for those Symbols > IMPORTANT: when using types that reference themselves add an `@irreplaceable` tag to them (see SubcommandDiff)golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/cspell.json000066400000000000000000000002161471722043300277770ustar00rootroot00000000000000{ "words": [ "autoexecute", "cowsay", "gcloud", "kubernetes", "pathspec", "reparse", "kubectl", "kube" ] }golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/000077500000000000000000000000001471722043300305375ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/bin.ts000077500000000000000000000012421471722043300316610ustar00rootroot00000000000000import { program } from "commander"; import path from "path"; import fs from "fs/promises"; import prettier from "prettier"; import { analyze } from "./src/analyzer"; import { generate } from "./src/generate"; const DECLARATIONS_PATH = path.resolve(__dirname, "..", "index.d.ts"); program.name("autocomplete-types-docs-generator"); program.argument(""); program.action(async (outfile) => { const absoluteOutfile = path.resolve(outfile); console.info(`Using ${DECLARATIONS_PATH} as input file.`); fs.writeFile( absoluteOutfile, await prettier.format(JSON.stringify(generate(analyze(DECLARATIONS_PATH))), { parser: "json" }) ); }); program.parse(); golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/index.ts000066400000000000000000000001251471722043300322140ustar00rootroot00000000000000export { analyze } from "./src/analyzer"; export { generate } from "./src/generate"; package.json000066400000000000000000000004641471722043300327520ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator{ "name": "autocomplete-types-docs-generator", "private": true, "scripts": { "build": "tsc" }, "files": [ "dist" ], "main": "dist/index.js", "devDependencies": { "@microsoft/tsdoc": "^0.15.0", "commander": "^11.1.0", "prettier": "^3.3.3", "typescript": "^5.5.4" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/src/000077500000000000000000000000001471722043300313265ustar00rootroot00000000000000DocManager.ts000066400000000000000000000046151471722043300336250ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/srcimport ts from "typescript"; import * as tsdoc from "@microsoft/tsdoc"; export const tagDefinitions = { filenameTag: new tsdoc.TSDocTagDefinition({ tagName: "@filename", syntaxKind: tsdoc.TSDocTagSyntaxKind.BlockTag, }), excludedTag: new tsdoc.TSDocTagDefinition({ tagName: "@excluded", syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag, }), irreplacedTag: new tsdoc.TSDocTagDefinition({ tagName: "@irreplaced", syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag, }), irreplaceableTag: new tsdoc.TSDocTagDefinition({ tagName: "@irreplaceable", syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag, }), replaceFirstLevelTag: new tsdoc.TSDocTagDefinition({ tagName: "@replaceFirstLevel", syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag, }), categoryTag: new tsdoc.TSDocTagDefinition({ tagName: "@category", syntaxKind: tsdoc.TSDocTagSyntaxKind.InlineTag, }), }; const configuration = new tsdoc.TSDocConfiguration(); configuration.addTagDefinitions(Object.values(tagDefinitions)); export class DocManager { static parser = new tsdoc.TSDocParser(configuration); static getJSDocCommentRanges(node: ts.Node, text: string): ts.CommentRange[] { const commentRanges: ts.CommentRange[] = []; commentRanges.push(...(ts.getLeadingCommentRanges(text, node.pos) || [])); // True if the comment starts with '/**' but not if it is '/**/' return commentRanges.filter( (comment) => text.charCodeAt(comment.pos + 1) === 0x2a /* ts.CharacterCodes.asterisk */ && text.charCodeAt(comment.pos + 2) === 0x2a /* ts.CharacterCodes.asterisk */ && text.charCodeAt(comment.pos + 3) !== 0x2f /* ts.CharacterCodes.slash */ ); } static parseFirstDocComment(node: ts.Node, sourceText: string): tsdoc.DocComment | undefined; static parseFirstDocComment( comments: ts.CommentRange[], sourceText: string ): tsdoc.DocComment | undefined; static parseFirstDocComment(nodeOrComments: ts.CommentRange[] | ts.Node, sourceText: string) { const comments = Array.isArray(nodeOrComments) ? nodeOrComments : this.getJSDocCommentRanges(nodeOrComments, sourceText); if (comments.length > 0) { const comment = comments[0]; const { docComment } = this.parser.parseRange( tsdoc.TextRange.fromStringRange(sourceText, comment.pos, comment.end) ); return docComment; } return undefined; } } Formatter.ts000066400000000000000000000033561471722043300335710ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/srcimport { DocNode, DocExcerpt } from "@microsoft/tsdoc"; export class Formatter { public static renderDocNode(docNode: DocNode | undefined): string { let result = ""; if (docNode) { if (docNode instanceof DocExcerpt) { result += docNode.content.toString(); } for (const childNode of docNode.getChildNodes()) { result += Formatter.renderDocNode(childNode); } } return result; } public static renderDocNodes(docNodes: ReadonlyArray): string { let result = ""; for (const docNode of docNodes) { result += Formatter.renderDocNode(docNode); } return result; } private static matchInitialWhitespaces(str: string) { return str.match(/^\s+/g)?.[0].length ?? 0; } private static INDENTATION_WHITESPACES = 2; public static indentDeclaration(declaration: string): string { const lines = declaration.trim().split("\n"); if (lines.length > 1) { let indentChars = 0; // this is set to the indentation of the first line which does not have whitespaces at the beginning let previousIndentedChars = this.matchInitialWhitespaces(lines[1]) - this.INDENTATION_WHITESPACES; const indentedLines: string[] = [lines[0]]; for (let i = 1; i < lines.length; i += 1) { const line = lines[i]; const currentIndentedChars = this.matchInitialWhitespaces(line); const indentCharDiff = currentIndentedChars - previousIndentedChars; if (indentCharDiff !== 0) { indentChars += indentCharDiff; } previousIndentedChars = currentIndentedChars; indentedLines.push(`${" ".repeat(indentChars)}${line.trim()}`); } return indentedLines.join("\n"); } return lines[0]; } } analyzer.ts000066400000000000000000000106241471722043300334470ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/srcimport ts from "typescript"; import * as tsdoc from "@microsoft/tsdoc"; import { DocManager, tagDefinitions } from "./DocManager"; function getFirstParentPropertySignatureOrTypeAliasDeclaration( node: ts.Node ): ts.PropertySignature | ts.TypeAliasDeclaration | undefined { let n = node; do { if (ts.isPropertySignature(n) || ts.isTypeAliasDeclaration(n)) { return n; } n = n.parent; } while (n); return undefined; } export function analyze(path: string): string { const program = ts.createProgram([path], { target: ts.ScriptTarget.ESNext }); const sourceFile = program.getSourceFile(path); const checker = program.getTypeChecker(); if (!sourceFile) { throw new Error("Error retrieving source file"); } const typeArgumentsReplacer = ( rootTypeAlias: ts.TypeAliasDeclaration, typeArguments: ts.NodeArray ) => { const typeParamsMap = new Map(); for (const [index, param] of Array.from((rootTypeAlias.typeParameters ?? []).entries())) { typeParamsMap.set( param.name.escapedText, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion typeArguments[index] ? typeArguments[index] : param.default! ); } return (ctx: ts.TransformationContext) => (typeNode: ts.TypeNode): ts.TypeNode => { const visit = (node: ts.Node): ts.Node => { if ( ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName) && typeParamsMap.get(node.typeName.escapedText) ) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return typeParamsMap.get(node.typeName.escapedText)!; } return ts.visitEachChild(node, visit, ctx); }; return ts.visitNode(typeNode, visit) as ts.TypeNode; }; }; const typeReferenceTransformer: ts.TransformerFactory = (ctx: ts.TransformationContext) => (sourceNode: ts.SourceFile) => { const sourceText = sourceNode.getFullText(); const visit = (node: ts.Node): ts.Node => { if (ts.isTypeReferenceNode(node)) { // early return if the current node parent has an irreplaced tag or if the current node is the same as on of the parents const parent = getFirstParentPropertySignatureOrTypeAliasDeclaration(node); let docComment: tsdoc.DocComment | undefined; if (parent) { docComment = DocManager.parseFirstDocComment(parent, sourceText); if (docComment && docComment.modifierTagSet.hasTag(tagDefinitions.irreplacedTag)) { return ts.visitEachChild(node, visit, ctx); } } const type = checker.getTypeAtLocation(node.typeName); const declaration = type.aliasSymbol?.declarations?.[0]; if ( declaration && ts.isTypeAliasDeclaration(declaration) && // @ts-expect-error: parent is not property of ts.Symbol type.aliasSymbol.parent?.escapedName === "Fig" ) { const declarationDocComment = DocManager.parseFirstDocComment(declaration, sourceText); if ( !declarationDocComment || !declarationDocComment.modifierTagSet.hasTag(tagDefinitions.irreplaceableTag) ) { let newType = declaration.type; if (node.typeArguments && node.typeArguments.length > 0) { const { transformed } = ts.transform(declaration.type, [ typeArgumentsReplacer(declaration, node.typeArguments), ]); [newType] = transformed; } // if the @replaceFirstLevel is specified we just return the first level type reference if ( docComment && docComment.modifierTagSet.hasTag(tagDefinitions.replaceFirstLevelTag) ) { return newType; } // we revisit the node since some replaced TypeReferences may be TypeReferences return ts.visitNode(newType, visit); } } } return ts.visitEachChild(node, visit, ctx); }; return ts.visitNode(sourceNode, visit) as ts.SourceFile; }; const { transformed } = ts.transform(sourceFile, [typeReferenceTransformer]); const printer = ts.createPrinter(); return printer.printFile(transformed[0]); } generate.ts000066400000000000000000000150661471722043300334210ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/srcimport ts, { TypeAliasDeclaration } from "typescript"; import * as tsdoc from "@microsoft/tsdoc"; import prettier from "prettier"; import { DocManager, tagDefinitions } from "./DocManager"; import { FoundNode, InterfaceDoc, isInterfaceDeclarationFoundNode, MemberDoc, TypeAliasDoc, } from "./types"; import { Formatter } from "./Formatter"; function walkCompilerAstAndFindComments(node: ts.Node, foundNodes: FoundNode[]): void { const sourceText = node.getSourceFile().getFullText(); // don't use getText() here! if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) { const foundNode: FoundNode = { node, }; // Find "/** */" style comments associated with this node. // Note that this reinvokes the compiler's scanner -- the result is not cached. // We may always assume that a node has just one jsdoc comment const comments = DocManager.getJSDocCommentRanges(node, sourceText); const docComment = DocManager.parseFirstDocComment(comments, sourceText); if (docComment) { const comment = comments[0]; foundNode.docComment = docComment; foundNode.textRange = tsdoc.TextRange.fromStringRange(sourceText, comment.pos, comment.end); } foundNodes.push(foundNode); } return node.forEachChild((child) => walkCompilerAstAndFindComments(child, foundNodes)); } function generateParamsFromBlock(blocks: readonly tsdoc.DocParamBlock[] = []) { return blocks.map((block) => ({ name: block.parameterName, description: Formatter.renderDocNode(block.content).trim(), })); } function generateMember(memberNode: ts.TypeElement, sourceText: string): MemberDoc { const docComment = DocManager.parseFirstDocComment(memberNode, sourceText); const examples: string[] = []; let defaultValue; let category; for (const block of docComment?.customBlocks ?? []) { switch (block.blockTag.tagName) { case "@example": examples.push(Formatter.renderDocNode(block.content).trim()); break; case "@defaultValue": defaultValue = Formatter.renderDocNode(block.content).trim(); break; case "@category": category = Formatter.renderDocNode(block.content).trim(); break; default: } } if (!memberNode.name) { throw new Error( `Interface members of SyntaxKind: '${memberNode.kind}' are not yet supported, please update the docs generator to support them.` ); } return { // memberNode may be an IndexSignature or another type which doesn't have a name name: memberNode.name.getText(), excluded: docComment?.modifierTagSet.hasTag(tagDefinitions.excludedTag) ?? false, ...(docComment?.summarySection && { summary: Formatter.renderDocNode(docComment.summarySection).trim(), }), ...(docComment?.returnsBlock && { returns: Formatter.renderDocNode(docComment.returnsBlock?.content).trim(), }), ...(docComment?.remarksBlock && { discussion: Formatter.renderDocNode(docComment.remarksBlock?.content).trim(), }), parameters: generateParamsFromBlock(docComment?.params.blocks), ...(docComment?.deprecatedBlock && { deprecated: Formatter.renderDocNode(docComment.deprecatedBlock.content).trim() || "This property has been deprecated.", }), optional: !!memberNode.questionToken, declaration: Formatter.indentDeclaration(memberNode.getText()), examples, category, default: defaultValue, hasDocComment: !!docComment, }; } function generateInterface(_interface: FoundNode): InterfaceDoc { const { node: interfaceNode, docComment } = _interface; const sourceText = interfaceNode.getSourceFile().getFullText(); let filename; const filenameBlock = docComment?.customBlocks.filter( (block) => block.blockTag.tagName === "@filename" )[0]; if (filenameBlock) { filename = Formatter.renderDocNode(filenameBlock.content).trim(); } let heritageClauses: string[] = []; if (interfaceNode.heritageClauses) { heritageClauses = interfaceNode.heritageClauses.flatMap((clause) => clause.types.map((type) => type.getText()) ); } return { name: interfaceNode.name.getText(), filename, hasDocComment: !!docComment, extends: heritageClauses, members: interfaceNode.members .map((member) => generateMember(member, sourceText)) .filter((memeber) => !memeber.excluded), inheritedMembers: [], }; } function generateTypeAlias(_typeAlias: FoundNode): TypeAliasDoc { const { node: typeAliasNode, docComment } = _typeAlias; return { name: typeAliasNode.name.getText(), declaration: Formatter.indentDeclaration(typeAliasNode.getText()), ...(docComment?.summarySection && { summary: Formatter.renderDocNode(docComment.summarySection).trim(), }), ...(docComment?.returnsBlock && { returns: Formatter.renderDocNode(docComment.returnsBlock?.content).trim(), }), ...(docComment?.remarksBlock && { discussion: Formatter.renderDocNode(docComment.remarksBlock?.content).trim(), }), examples: (docComment?.customBlocks ?? []) .filter((block) => block.blockTag.tagName === "@example") .map((block) => Formatter.renderDocNode(block.content).trim()), parameters: generateParamsFromBlock(docComment?.params.blocks), }; } export async function generate(sourceText: string) { const interfaces = []; const typeAliases = []; const sourceFile = ts.createSourceFile( "docs.ts", await prettier.format(sourceText, { parser: "typescript", semi: false, bracketSpacing: false, }), ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS ); if (!sourceFile) { throw new Error("Could not get source file."); } const foundNodes: FoundNode[] = []; walkCompilerAstAndFindComments(sourceFile, foundNodes); for (const foundNode of foundNodes) { if (isInterfaceDeclarationFoundNode(foundNode)) { interfaces.push(generateInterface(foundNode)); } else { typeAliases.push(generateTypeAlias(foundNode as FoundNode)); } } const mappedInterfaces = new Map(interfaces.map((_interface) => [_interface.name, _interface])); // add inheritedMembers to interface // eslint-disable-next-line no-underscore-dangle for (let i = 0; i < interfaces.length; i += 1) { if (interfaces[i].extends.length) { // assume interfaces only extend interfaces for (const extend of interfaces[i].extends) { interfaces[i].inheritedMembers.push(...(mappedInterfaces.get(extend)?.members ?? [])); } } } return { interfaces, typeAliases, }; } types.ts000066400000000000000000000024651471722043300327720ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator/srcimport type { InterfaceDeclaration, TypeAliasDeclaration } from "typescript"; import type { TextRange, DocComment } from "@microsoft/tsdoc"; import ts from "typescript"; export type TypeDeclarationNode = InterfaceDeclaration | TypeAliasDeclaration; export interface FoundNode { node: T; textRange?: TextRange; docComment?: DocComment; } export function isInterfaceDeclarationFoundNode( foundNode: FoundNode ): foundNode is FoundNode { return ts.isInterfaceDeclaration(foundNode.node); } export interface InterfaceDoc { name: string; filename?: string; members: MemberDoc[]; extends: string[]; inheritedMembers: MemberDoc[]; hasDocComment: boolean; } export interface Parameter { name: string; description: string; } export interface TypeAliasDoc { name: string; summary?: string; parameters: Parameter[]; returns?: string; declaration: string; discussion?: string; examples: string[]; } export interface MemberDoc { name: string; excluded: boolean; summary?: string; optional: boolean; parameters: Parameter[]; returns?: string; declaration: string; discussion?: string; examples: string[]; default?: string; deprecated?: boolean | string; category?: string; hasDocComment: boolean; } tsconfig.json000066400000000000000000000004171471722043300331710ustar00rootroot00000000000000golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs-generator{ "compilerOptions": { "target": "es5", "lib": ["esnext"], "skipLibCheck": true, "strict": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "module": "commonjs", "moduleResolution": "node", "outDir": "dist" } } golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/docs.json000066400000000000000000000000031471722043300274370ustar00rootroot00000000000000{} golang-github-withfig-autocomplete-tools-0.0~git20241029.747689a+ds/types/index.d.ts000066400000000000000000001602341471722043300275320ustar00rootroot00000000000000/* eslint-disable @typescript-eslint/ban-types */ declare namespace Fig { /** * Templates are generators prebuilt by Fig. * @remarks * Here are the three templates: * - filepaths: show folders and filepaths. Allow autoexecute on filepaths * - folders: show folders only. Allow autoexecute on folders * - history: show suggestions for all items in history matching this pattern * - help: show subcommands. Only includes the 'siblings' of the nearest 'parent' subcommand */ type TemplateStrings = "filepaths" | "folders" | "history" | "help"; /** * A template which is a single TemplateString or an array of TemplateStrings * * @remarks * Templates are generators prebuilt by Fig. Here are the three templates: * - filepaths: show folders and filepaths. Allow autoexecute on filepaths * - folders: show folders only. Allow autoexecute on folders * - history: show suggestions for all items in history matching this pattern * - help: show subcommands. Only includes the 'siblings' of the nearest 'parent' subcommand * * @example * `cd` uses the "folders" template * `ls` used ["filepaths", "folders"]. Why both? Because if I `ls` a directory, we want to enable a user to autoexecute on this directory. If we just did "filepaths" they couldn't autoexecute. * */ type Template = TemplateStrings | TemplateStrings[]; type HistoryContext = { currentWorkingDirectory: string; time: number; exitCode: number; shell: string; }; type TemplateSuggestionContext = | { templateType: "filepaths" } | { templateType: "folders" } | { templateType: "help" } | ({ templateType: "history" } & Partial); type TemplateSuggestion = Modify< Suggestion, { name?: string; context: TemplateSuggestionContext } >; /** * * The SpecLocation object defines well... the location of the completion spec we want to load. * Specs can be "global" (ie hosted by Fig's cloud) or "local" (ie stored on your local machine) * * @remarks * **The `SpecLocation` Object** * * The SpecLocation object defines well... the location of the completion spec we want to load. * Specs can be "global" (ie hosted by Fig's cloud) or "local" (ie stored on your local machine). * * - Global `SpecLocation`: * Load specs hosted in Fig's Cloud. Assume the current working directory is here: https://github.com/withfig/autocomplete/tree/master/src. Now set the value for the "name" prop to the relative location of your spec (without the .js file extension) * ```js * // e.g. * { type: "global", name: "aws/s3" } // Loads up the aws s3 completion spec * { type: "global", name: "python/http.server" } // Loads up the http.server completion spec * ``` * * - Local `SpecLocation`: * Load specs saved on your local system / machine. Assume the current working directory is the user's current working directory. * The `name` prop should take the name of the spec (without the .js file extension) e.g. my_cli_tool * The `path` prop should take an absolute path OR a relative path (relative to the user's current working directory). The path should be to the directory that contains the `.fig` folder. Fig will then assume your spec is located in `.fig/autocomplete/build/` * ```js * // e.g. * { type: "global", path: "node_modules/cowsay", name: "cowsay_cli" } // will look for `cwd/node_modules/cowsay/.fig/autocomplete/build/cowsay_cli.js` * { type: "global", path: "~", name: "my_cli" } // will look for `~/.fig/autocomplete/build/my_cli.js` * ``` * @irreplaceable */ type SpecLocation = | { type: "local"; path?: string; name: string } | { type: "global"; name: string }; /** * Dynamically load up another completion spec at runtime. * * See [`loadSpec` property in Subcommand Object](https://fig.io/docs/reference/subcommand#loadspec). */ type LoadSpec = | string | Subcommand | (( token: string, executeCommand: ExecuteCommandFunction ) => Promise); /** * The type of a suggestion object. * @remarks * The type determines: * - the default icon Fig uses (e.g. a file or folder searches for the system icon, a subcommand has a specific icon etc) * - whether we allow users to auto-execute a command */ type SuggestionType = | "folder" | "file" | "arg" | "subcommand" | "option" | "special" | "mixin" | "shortcut"; /** * A single object of type `T` or an array of objects of type `T`. */ type SingleOrArray = T | T[]; /** * An async function that returns the version of a given CLI tool. * @remarks * This is used in completion specs that want to version themselves the same way CLI tools are versioned. See fig.io/docs * * @param executeCommand -an async function that allows you to execute a shell command on the user's system and get the output as a string. * @returns The version of a CLI tool * * @example * `1.0.22` * * @example * `v26` * */ type GetVersionCommand = (executeCommand: ExecuteCommandFunction) => Promise; /** * Context about a current shell session. */ type ShellContext = { /** * The current directory the shell is in */ currentWorkingDirectory: string; /** * Exported environment variables from the shell */ environmentVariables: Record; /** * The name of the current process */ currentProcess: string; /** * @hidden * @deprecated */ sshPrefix: string; }; type GeneratorContext = ShellContext & { isDangerous?: boolean; searchTerm: string; }; /** * A function which can have a `T` argument and a `R` result. * @param param - A param of type `R` * @returns Something of type `R` */ type Function = (param: T) => R; /** * A utility type to modify a property type * @irreplaceable */ type Modify = Omit & R; /** * A `string` OR a `function` which can have a `T` argument and a `R` result. * @param param - A param of type `R` * @returns Something of type `R` */ type StringOrFunction = string | Function; /** * @excluded * @irreplaceable */ type ArgDiff = Modify; /** * @excluded * @irreplaceable */ type OptionDiff = Modify< Fig.Option, { args?: ArgDiff | ArgDiff[]; remove?: true; } >; /** * @excluded * @irreplaceable */ type SubcommandDiff = Modify< Fig.Subcommand, { subcommands?: SubcommandDiff[]; options?: OptionDiff[]; args?: ArgDiff | ArgDiff[]; remove?: true; } >; /** * @excluded * @irreplaceable */ type SpecDiff = Omit; /** * @excluded * @irreplaceable */ type VersionDiffMap = Record; /** * A spec object. * Can be one of * 1. A subcommand * 2. A function that dynamically computes a subcommand * 3. A function that returns the path to a versioned spec files (that exports a base subcommand and { versions: VersionDiffMap } */ type Spec = | Subcommand | ((version?: string) => Subcommand) | ((version?: string) => { versionedSpecPath: string; version?: string; }); type ExecuteCommandInput = { /** * The command to execute */ command: string; /** * The arguments to the command to be run */ args: string[]; /** * The directory to run the command in */ cwd?: string; /** * The environment variables to set when executing the command, `undefined` will unset the variable if it set */ env?: Record; /** * Duration of timeout in milliseconds, if the command takes longer than the timeout a error will be thrown. * @defaultValue 5000 */ timeout?: number; }; /** * The output of running a command */ type ExecuteCommandOutput = { /** * The stdout (1) of running a command */ stdout: string; /** * The stderr (2) of running a command */ stderr: string; /** * The exit status of running a command */ status: number; }; /** * An async function to execute a command * @returns The output of the command */ type ExecuteCommandFunction = (args: ExecuteCommandInput) => Promise; type CacheMaxAge = { strategy: "max-age"; /** * The time to live for the cache in milliseconds. * @example * 3600 */ ttl: number; }; type CacheStaleWhileRevalidate = { strategy?: "stale-while-revalidate"; /** * The time to live for the cache in milliseconds. * @example * 3600 */ ttl?: number; }; type Cache = (CacheMaxAge | CacheStaleWhileRevalidate) & { /** * Whether the cache should be based on the directory the user was currently in or not. * @defaultValue false */ cacheByDirectory?: boolean; /** * Hardcoded cache key that can be used to cache a single generator across * multiple argument locations in a spec. */ cacheKey?: string; }; type TriggerOnChange = { /** Trigger on any change to the token */ on: "change"; }; type TriggerOnThreshold = { /** Trigger when the length of the token changes past a threshold */ on: "threshold"; length: number; }; type TriggerOnMatch = { /** Trigger when the index of a string changes */ on: "match"; string: string | string[]; }; type Trigger = | string | ((newToken: string, oldToken: string) => boolean) | TriggerOnChange | TriggerOnThreshold | TriggerOnMatch; /** * The BaseSuggestion object is the root of the Suggestion, Subcommand, and Option objects. * It is where key properties like description, icon, and displayName are found * @excluded */ interface BaseSuggestion { /** * The string that is displayed in the UI for a given suggestion. * @defaultValue the name prop * * @example * The npm CLI has a subcommand called `install`. If we wanted * to display some custom text like `Install an NPM package 📦` we would set * `name: "install"` and `displayName: "Install an NPM package 📦"` */ displayName?: string; /** * The value that's inserted into the terminal when a user presses enter/tab or clicks on a menu item. * * @remarks * You can use `\n` to insert a newline or `\b` to insert a backspace. * You can also optionally specify {cursor} in the string and Fig will automatically place the cursor there after insert. * * @defaultValue The value of the name prop. * * @example * For the `git commit` subcommand, the `-m` option has an insert value of `-m '{cursor}'` */ insertValue?: string; /** * When the suggestion is inserted, replace the command with this string * * @remarks * You can use `\n` to insert a newline or `\b` to insert a backspace. * You can also optionally specify {cursor} in the string and Fig will automatically place the cursor there after insert. * Note that currently the entire edit buffer will be replaced. Eventually, only the root command will be replaced, preserving pipes and continuations. */ replaceValue?: string; /** * The text that gets rendered at the bottom of the autocomplete box (or the side if you hit ⌘i) * * @example * "Your commit message" */ description?: string; /** * The icon that is rendered is based on the type. * * @remarks * Icons can be a 1 character string, a URL, or Fig's [icon protocol](https://fig.io/docs/reference/suggestion/icon-api) (fig://) which lets you generate * colorful and fun systems icons. * * @defaultValue related to the type of the object (e.g. `Suggestion`, `Subcommand`, `Option`, `Arg`) * * @example * `A` * @example * `😊` * @example * `https://www.herokucdn.com/favicon.ico` * @example * `fig://icon?type=file` * */ icon?: string; /** * Specifies whether the suggestion is "dangerous". * * @remarks * If true, Fig will not enable its autoexecute functionality. Autoexecute means if a user selects a suggestion it will insert the text and run the command. We signal this by changing the icon to red. * Setting `isDangerous` to `true` will make it harder for a user to accidentally run a dangerous command. * * @defaultValue false * * @example * This is used in the `rm` spec. Why? Because we don't want users to accidentally delete their files so we make it just a little bit harder... */ isDangerous?: boolean; /** * The number used to rank suggestions in autocomplete. Number must be from 0-100. Higher priorities rank higher. * * @defaultValue 50 * @remarks * Fig ranks suggestions by recency. To do this, we check if a suggestion has been selected before. If yes and the suggestions has: * - a priority between 50-75, the priority will be replaced with 75, then we will add the timestamp of when that suggestion was selected as a decimal. * - a priority outside of 50-75, the priority will be increased by the timestamp of when that suggestion was selected as a decimal. * If it has not been selected before, Fig will keep the same priority as was set in the completion spec * If it was not set in the spec, it will default to 50. * * @example * Let's say a user has previously selected a suggestion at unix timestamp 1634087677: * - If completion spec did not set a priority (Fig treats this as priority 50), its priority would change to 75 + 0.1634087677 = 75.1634087677; * - If completion spec set a priority of 49 or less, its priority would change to 49 + 0.1634087677 = 49.1634087677; * - If completion spec set a priority of 76 or more, its priority would change to 76 + 0.1634087677 = 76.1634087677; * - If a user had never selected a suggestion, then its priority would just stay as is (or if not set, default to 50). * * @example * If you want your suggestions to always be: * - at the top order, rank them 76 or above. * - at the bottom, rank them 49 or below */ priority?: number; /** * Specifies whether a suggestion should be hidden from results. * @remarks * Fig will only show it if the user exactly types the name. * @defaultValue false * @example * The "-" suggestion is hidden in the `cd` spec. You will only see it if you type exactly `cd -` */ hidden?: boolean; /** * * Specifies whether a suggestion is deprecated. * @remarks * It is possible to specify a suggestion to replace the deprecated one. * - The `description` of the deprecated object (e.g `deprecated: { description: 'The --no-ansi option has been deprecated in v2' }`) is used to provide infos about the deprecation. * - `deprecated: true` and `deprecated: { }` behave the same and will just display the suggestion as deprecated. * @example * ```js * deprecated: { insertValue: '--ansi never', description: 'The --no-ansi option has been deprecated in v2' } * ``` */ deprecated?: boolean | Omit; /** * Specifies which component to use to render the preview window. * * @remarks This should be the path within the `src` directory to the component without the extension. * * @example 'ls/filepathPreview' */ previewComponent?: string; /** * This is a way to pass data to the Autocomplete Engine that is not formalized in the spec, do not use this in specs as it may change at any time * * @ignore */ _internal?: Record; } /** * Each item in Fig's autocomplete popup window is a Suggestion object. It is probably the most important object in Fig. * Subcommand and Option objects compile down to Suggestion objects. Generators return Suggestion objects. * The main things you can customize in your suggestion object is the text that's displayed, the icon, and what's inserted after being selected. In saying that, most of these have very sane defaults. */ interface Suggestion extends BaseSuggestion { /** * The string Fig uses when filtering over a list of suggestions to check for a match. * @remarks * When a a user is typing in the terminal, the query term (the token they are currently typing) filters over all suggestions in a list by checking if the queryTerm matches the prefix of the name. * The `displayName` prop also defaults to the value of name. * * The `name` props of suggestion, subcommand, option, and arg objects are all different. It's important to read them all carefully. * * @example * If a user types git `c`, any Suggestion objects with a name prop that has a value starting with "c" will match. * */ name?: SingleOrArray; /** * The type of a suggestion object. * @remarks * The type determines * - the default icon Fig uses (e.g. a file or folder searches for the system icon, a subcommand has a specific icon etc) * - whether we allow users to auto-execute a command */ type?: SuggestionType; } /** * The subcommand object represent the tree structure of a completion spec. We sometimes also call it the skeleton. * * A subcommand can nest options, arguments, and more subcommands (it's recursive) */ interface Subcommand extends BaseSuggestion { /** * The name of the subcommand. Should exactly match the name defined by the CLI tool. * * @remarks * If a subcommand has multiple aliases, they should be included as an array. * * Note that Fig's autocomplete engine requires this `name` to match the text typed by the user in the shell. * * To customize the title that is displayed to the user, use `displayName`. * * * @example * For `git checkout`, the subcommand `checkout` would have `name: "checkout"` * @example * For `npm install`, the subcommand `install` would have `name: ["install", "i"]` as these two values both represent the same subcommand. */ name: SingleOrArray; /** * An array of `Subcommand` objects representing all the subcommands that exist beneath the current command. * * * To support large CLI tools, `Subcommands` can be nested recursively. * * @example * A CLI tool like `aws` is composed of many top-level subcommands (`s3`, `ec2`, `eks`...), each of which include child subcommands of their own. */ subcommands?: Subcommand[]; /** * Specifies whether the command requires a subcommand. This is false by default. * * A space will always be inserted after this command if `requiresSubcommand` is true. * If the property is omitted, a space will be inserted if there is at least one required argument. */ requiresSubcommand?: boolean; /** * An array of `Option` objects representing the options that are available on this subcommand. * * @example * A command like `git commit` accepts various flags and options, such as `--message` and `--all`. These `Option` objects would be included in the `options` field. */ options?: Option[]; /** * An array of `Arg` objects representing the various parameters or "arguments" that can be passed to this subcommand. * */ args?: SingleOrArray; /** * This option allows to enforce the suggestion filtering strategy for a specific subcommand. * @remarks * Users always want to have the most accurate results at the top of the suggestions list. * For example we can enable fuzzy search on a subcommand that always requires fuzzy search to show the best suggestions. * This property is also useful when subcommands or options have a prefix (e.g. the npm package scope) because enabling fuzzy search users can omit that part (see the second example below) * @example * yarn workspace [name] with fuzzy search is way more useful since we can omit the npm package scope * @example * fig settings uses fuzzy search to prevent having to add the `autocomplete.` prefix to each searched setting * ```typescript * const figSpec: Fig.Spec { * name: "fig", * subcommands: [ * { * name: "settings", * filterStrategy: "fuzzy", * subcommands: [ * { * name: "autocomplete.theme", // if a user writes `fig settings theme` it gets the correct suggestions * }, * // ... other settings * ] * }, * // ... other fig subcommands * ] * } * ``` */ filterStrategy?: "fuzzy" | "prefix" | "default"; /** * A list of Suggestion objects that are appended to the suggestions shown beneath a subcommand. * * @remarks * You can use this field to suggest common workflows. * */ additionalSuggestions?: (string | Suggestion)[]; /** * Dynamically load another completion spec at runtime. * * @param tokens - a tokenized array of the text the user has typed in the shell. * @param executeCommand - an async function that can execute a shell command on behalf of the user. The output is a string. * @returns A `SpecLocation` object or an array of `SpecLocation` objects. * * @remarks * `loadSpec` can be invoked as string (recommended) or a function (advanced). * * The API tells the autocomplete engine where to look for a completion spec. If you pass a string, the engine will attempt to locate a matching spec that is hosted by Fig. * * @example * Suppose you have an internal CLI tool that wraps `kubectl`. Instead of copying the `kubectl` completion spec, you can include the spec at runtime. * ```typescript * { * name: "kube", * description: "a wrapper around kubectl" * loadSpec: "kubectl" * } * ``` * @example * In the `aws` completion spec, `loadSpec` is used to optimize performance. The completion spec is split into multiple files, each of which can be loaded separately. * ```typescript * { * name: "s3", * loadSpec: "aws/s3" * } * ``` */ loadSpec?: LoadSpec; /** * Dynamically *generate* a `Subcommand` object a runtime. The generated `Subcommand` is merged with the current subcommand. * * @remarks * This API is often used by CLI tools where the structure of the CLI tool is not *static*. For instance, if the tool can be extended by plugins or otherwise shows different subcommands or options depending on the environment. * * @param tokens - a tokenized array of the text the user has typed in the shell. * @param executeCommand - an async function that can execute a shell command on behalf of the user. The output is a string. * @returns a `Fig.Spec` object * * @example * The `python` spec uses `generateSpec` to include the`django-admin` spec if `django manage.py` exists. * ```typescript * generateSpec: async (tokens, executeCommand) => { * // Load the contents of manage.py * const managePyContents = await executeCommand("cat manage.py"); * // Heuristic to determine if project uses django * if (managePyContents.contains("django")) { * return { * name: "python", * subcommands: [{ name: "manage.py", loadSpec: "django-admin" }], * }; * } * }, * ``` */ generateSpec?: (tokens: string[], executeCommand: ExecuteCommandFunction) => Promise; /** * Generating a spec can be expensive, but due to current guarantees they are not cached. * This function generates a cache key which is used to cache the result of generateSpec. * If `undefined` is returned, the cache will not be used. */ generateSpecCacheKey?: Function<{ tokens: string[] }, string | undefined> | string; /** * Configure how the autocomplete engine will map the raw tokens to a given completion spec. * * @param flagsArePosixNoncompliant - Indicates that flags with one hyphen may have *more* than one character. Enabling this directive, turns off support for option chaining. * @param optionsMustPrecedeArguments - Options will not be suggested after any argument of the Subcommand has been typed. * @param optionArgSeparators - Indicate that options which take arguments will require one of the specified separators between the 'verbose' option name and the argument. * * @example * The `-work` option from the `go` spec is parsed as a single flag when `parserDirectives.flagsArePosixNoncompliant` is set to true. Normally, this would be chained and parsed as `-w -o -r -k` if `flagsArePosixNoncompliant` is not set to true. */ parserDirectives?: { flagsArePosixNoncompliant?: boolean; optionsMustPrecedeArguments?: boolean; optionArgSeparators?: SingleOrArray; }; /** * Specifies whether or not to cache the result of loadSpec and generateSpec * * @remarks * Caching is good because it reduces the time to completion on subsequent calls to a dynamic subcommand, but when the data does not outlive the cache this allows a mechanism for opting out of it. */ cache?: boolean; } /** * The option object represent CLI options (sometimes called flags). * * A option can have an argument. An option can NOT have subcommands or other option */ interface Option extends BaseSuggestion { /** * The exact name of the subcommand as defined in the CLI tool. * * @remarks * Fig's parser relies on your option name being exactly what the user would type. (e.g. if the user types `git "-m"`, you must have `name: "-m"` and not something like `name: "your message"` or even with an `=` sign like`name: "-m="`) * * If you want to customize what the text the popup says, use `displayName`. * * The name prop in an Option object compiles down to the name prop in a Suggestion object * * Final note: the name prop can be a string (most common) or an array of strings * * * @example * For `git commit -m` in the, message option nested beneath `commit` would have `name: ["-m", "--message"]` * @example * For `ls -l` the `-l` option would have `name: "-l"` */ name: SingleOrArray; /** * An array of arg objects or a single arg object * * @remarks * If a subcommand takes an argument, please at least include an empty Arg Object. (e.g. `{ }`). Why? If you don't, Fig will assume the subcommand does not take an argument. When the user types their argument * If the argument is optional, signal this by saying `isOptional: true`. * * @example * `npm run` takes one mandatory argument. This can be represented by `args: { }` * @example * `git push` takes two optional arguments. This can be represented by: `args: [{ isOptional: true }, { isOptional: true }]` * @example * `git clone` takes one mandatory argument and one optional argument. This can be represented by: `args: [{ }, { isOptional: true }]` */ args?: SingleOrArray; /** * * Signals whether an option is persistent, meaning that it will still be available * as an option for all child subcommands. * * @remarks * As of now there is no way to disable this * persistence for certain children. Also see * https://github.com/spf13/cobra/blob/master/user_guide.md#persistent-flags. * * @defaultValue false * * @example * Say the `git` spec had an option at the top level with `{ name: "--help", isPersistent: true }`. * Then the spec would recognize both `git --help` and `git commit --help` * as a valid as we are passing the `--help` option to all `git` subcommands. * */ isPersistent?: boolean; /** * Signals whether an option is required. * * @defaultValue false (option is NOT required) * @example * The `-m` option of `git commit` is required * */ isRequired?: boolean; /** * * Signals whether an equals sign is required to pass an argument to an option (e.g. `git commit --message="msg"`) * @defaultValue false (does NOT require an equal) * * @example * When `requiresEqual: true` the user MUST do `--opt=value` and cannot do `--opt value` * * @deprecated use `requiresSeparator` instead * */ requiresEquals?: boolean; /** * * Signals whether one of the separators specified in parserDirectives is required to pass an argument to an option (e.g. `git commit --message[separator]"msg"`) * If set to true this will automatically insert an equal after the option name. * If set to a separator (string) this will automatically insert the separator specified after the option name. * @defaultValue false (does NOT require a separator) * * @example * When `requiresSeparator: true` the user MUST do `--opt=value` and cannot do `--opt value` * @example * When `requiresSeparator: ':'` the user MUST do `--opt:value` and cannot do `--opt value` */ requiresSeparator?: boolean | string; /** * * Signals whether an option can be passed multiple times. * * @defaultValue false (option is NOT repeatable) * * @remarks * Passing `isRepeatable: true` will allow an option to be passed any number * of times, while passing `isRepeatable: 2` will allow it to be passed * twice, etc. Passing `isRepeatable: false` is the same as passing * `isRepeatable: 1`. * * If you explicitly specify the isRepeatable option in a spec, this * constraint will be enforced at the parser level, meaning after the option * (say `-o`) has been passed the maximum number of times, Fig's parser will * not recognize `-o` as an option if the user types it again. * * @example * In `npm install` doesn't specify `isRepeatable` for `{ name: ["-D", "--save-dev"] }`. * When the user types `npm install -D`, Fig will no longer suggest `-D`. * If the user types `npm install -D -D`. Fig will still parse the second * `-D` as an option. * * Suppose `npm install` explicitly specified `{ name: ["-D", "--save-dev"], isRepeatable: false }`. * Now if the user types `npm install -D -D`, Fig will instead parse the second * `-D` as the argument to the `install` subcommand instead of as an option. * * @example * SSH has `{ name: "-v", isRepeatable: 3 }`. When the user types `ssh -vv`, Fig * will still suggest `-v`, when the user types `ssh -vvv` Fig will stop * suggesting `-v` as an option. Finally if the user types `ssh -vvvv` Fig's * parser will recognize that this is not a valid string of chained options * and will treat this as an argument to `ssh`. * */ isRepeatable?: boolean | number; /** * * Signals whether an option is mutually exclusive with other options (ie if the user has this option, Fig should not show the options specified). * @defaultValue false * * @remarks * Options that are mutually exclusive with flags the user has already passed will not be shown in the suggestions list. * * @example * You might see `[-a | --interactive | --patch]` in a man page. This means each of these options are mutually exclusive on each other. * If we were defining the exclusive prop of the "-a" option, then we would have `exclusive: ["--interactive", "--patch"]` * */ exclusiveOn?: string[]; /** * * * Signals whether an option depends on other options (ie if the user has this option, Fig should only show these options until they are all inserted). * * @defaultValue false * * @remarks * If the user has an unmet dependency for a flag they've already typed, this dependency will have boosted priority in the suggestion list. * * @example * In a tool like firebase, we may want to delete a specific extension. The command might be `firebase delete --project ABC --extension 123` This would mean we delete the 123 extension from the ABC project. * In this case, `--extension` dependsOn `--project` * */ dependsOn?: string[]; } /** * The arg object represent CLI arguments (sometimes called positional arguments). * * An argument is different to a subcommand object and option object. It does not compile down to a suggestion object. Rather, it represents custom user input. If you want to generate suggestions for this custom user input, you should use the generator prop nested beneath an Arg object */ interface Arg { /** * The name of an argument. This is different to the `name` prop for subcommands, options, and suggestion objects so please read carefully. * This `name` prop signals a normal, human readable string. It usually signals to the user the type of argument they are inserting if there are no available suggestions. * Unlike subcommands and options, Fig does NOT use this value for parsing. Therefore, it can be whatever you want. * * @example * The name prop for the `git commit -m ` arg object is "msg". But you could also make it "message" or "your message". It is only used for description purposes (you see it when you type the message), not for parsing! */ name?: string; /** * The text that gets rendered at the bottom of the autocomplete box a) when the user is inputting an argument and there are no suggestions and b) for all generated suggestions for an argument * Keep it short and direct! * * @example * "Your commit message" */ description?: string; /** * Specifies whether the suggestions generated for this argument are "dangerous". * * @remarks * If true, Fig will not enable its autoexecute functionality. Autoexecute means if a user selects a suggestion it will insert the text and run the command. We signal this by changing the icon to red. * Turning on isDangerous will make it harder for a user to accidentally run a dangerous command. * * @defaultValue false * * @example * This is used for all arguments in the `rm` spec. */ isDangerous?: boolean; /** * A list of Suggestion objects that are shown when a user is typing an argument. * * @remarks * These suggestions are static meaning you know them beforehand and they are not generated at runtime. If you want to generate suggestions at runtime, use a generator * * @example * For `git reset `, a two common arguments to pass are "head" and "head^". Therefore, the spec suggests both of these by using the suggestion prop */ suggestions?: (string | Suggestion)[]; /** * A template which is a single TemplateString or an array of TemplateStrings * * @remarks * Templates are generators prebuilt by Fig. Here are the three templates: * - filepaths: show folders and filepaths. Allow autoexecute on filepaths * - folders: show folders only. Allow autoexecute on folders * - history: show suggestions for all items in history matching this pattern * - help: show subcommands. Only includes the 'siblings' of the nearest 'parent' subcommand * * @example * `cd` uses the "folders" template * @example * `ls` used ["filepaths", "folders"]. Why both? Because if I `ls` a directory, we want to enable a user to autoexecute on this directory. If we just did "filepaths" they couldn't autoexecute. * */ template?: Template; /** * * Generators let you dynamically generate suggestions for arguments by running shell commands on a user's device. * * This takes a single generator or an array of generators */ generators?: SingleOrArray; /** * This option allows to enforce the suggestion filtering strategy for a specific argument suggestions. * @remarks * Users always want to have the most accurate results at the top of the suggestions list. * For example we can enable fuzzy search on an argument that always requires fuzzy search to show the best suggestions. * This property is also useful when argument suggestions have a prefix (e.g. the npm package scope) because enabling fuzzy search users can omit that part (see the second example below) * @example * npm uninstall [packages...] uses fuzzy search to allow searching for installed packages ignoring the package scope * ```typescript * const figSpec: Fig.Spec { * name: "npm", * subcommands: [ * { * args: { * name: "packages", * filterStrategy: "fuzzy", // search in suggestions provided by the generator (in this case) using fuzzy search * generators: generateNpmDeps, * isVariadic: true, * }, * }, * // ... other npm commands * ], * } * ``` */ filterStrategy?: "fuzzy" | "prefix" | "default"; /** * Provide a suggestion at the top of the list with the current token that is being typed by the user. */ suggestCurrentToken?: boolean; /** * Specifies that the argument is variadic and therefore repeats infinitely. * * @remarks * Man pages represent variadic arguments with an ellipsis e.g. `git add ` * * @example * `echo` takes a variadic argument (`echo hello world ...`) * @example * `git add` also takes a variadic argument */ isVariadic?: boolean; /** * Specifies whether options can interrupt variadic arguments. There is * slightly different behavior when this is used on an option argument and * on a subcommand argument: * * - When an option breaks a *variadic subcommand argument*, after the option * and any arguments are parsed, the parser will continue parsing variadic * arguments to the subcommand * - When an option breaks a *variadic option argument*, after the breaking * option and any arguments are parsed, the original variadic options * arguments will be terminated. See the second examples below for details. * * * @defaultValue true * * @example * When true for git add's argument: * `git add file1 -v file2` will interpret `-v` as an option NOT an * argument, and will continue interpreting file2 as a variadic argument to * add after * * @example * When true for -T's argument, where -T is a variadic list of tags: * `cmd -T tag1 tag2 -p project tag3` will interpret `-p` as an option, but * will then terminate the list of tags. So tag3 is not parsed as an * argument to `-T`, but rather as a subcommand argument to `cmd` if `cmd` * takes any arguments. * * @example * When false: * `echo hello -n world` will treat -n as an argument NOT an option. * However, in `echo -n hello world` it will treat -n as an option as * variadic arguments haven't started yet * */ optionsCanBreakVariadicArg?: boolean; /** * `true` if an argument is optional (ie the CLI spec says it is not mandatory to include an argument, but you can if you want to). * * @remarks * NOTE: It is important you include this for our parsing. If you don't, Fig will assume the argument is mandatory. When we assume an argument is mandatory, we force the user to input the argument and hide all other suggestions. * * @example * `git push [remote] [branch]` takes two optional args. */ isOptional?: boolean; /** * Syntactic sugar over the `loadSpec` prop. * * @remarks * Specifies that the argument is an entirely new command which Fig should start completing on from scratch. * * @example * `time` and `builtin` have only one argument and this argument has the `isCommand` property. If I type `time git`, Fig will load up the git completion spec because the isCommand property is set. */ isCommand?: boolean; /** * The same as the `isCommand` prop, except Fig will look for a completion spec in the `.fig/autocomplete/build` folder in the user's current working directory. * * @remarks * See our docs for more on building completion specs for local scripts [Fig for Teams](https://fig.io/docs/) * @example * `python` take one argument which is a `.py` file. If I have a `main.py` file on my desktop and my current working directory is my desktop, if I type `python main.py[space]` Fig will look for a completion spec in `~/Desktop/.fig/autocomplete/build/main.py.js` */ isScript?: boolean; /** * The same as the `isCommand` prop, except you specify a string to prepend to what the user inputs and fig will load the completion spec accordingly. * @remarks * If isModule: "python/", Fig would load up the `python/USER_INPUT.js` completion spec from the `~/.fig/autocomplete` folder. * @example * For `python -m`, the user can input a specific module such as http.server. Each module is effectively a mini CLI tool that should have its own completions. Therefore the argument object for -m has `isModule: "python/"`. Whatever the modules user inputs, Fig will look under the `~/.fig/autocomplete/python/` directory for completion spec. * * @deprecated use `loadSpec` instead */ isModule?: string; /** * This will debounce every keystroke event for this particular arg. * @remarks * If there are no keystroke events after 100ms, Fig will execute all the generators in this arg and return the suggestions. * * @example * `npm install` and `pip install` send debounced network requests after inactive typing from users. */ debounce?: boolean; /** * The default value for an optional argument. * * @remarks * Note: This is currently not used anywhere in Fig's autocomplete popup, but will be soon. * */ default?: string; /** * See [`loadSpec` in Subcommand Object](https://fig.io/docs/reference/subcommand#loadspec). * * @remarks * There is a very high chance you want to use one of the following: * 1. `isCommand` (See [Arg Object](https://fig.io/docs/reference/arg#iscommand)) * 2. `isScript` (See [Arg Object](https://fig.io/docs/reference/arg#isscript)) * */ loadSpec?: LoadSpec; /** * The `arg.parserDirective.alias` prop defines whether Fig's tokenizer should expand out an alias into separate tokens then offer completions accordingly. * * @remarks * This is similar to how Fig is able to offer autocomplete for user defined shell aliases, but occurs at the completion spec level. * * @param token - The token that the user has just typed that is an alias for something else * @param executeCommand -an async function that allows you to execute a shell command on the user's system and get the output as a string. * @returns The expansion of the alias that Fig's bash parser will reparse as if it were typed out in full, rather than the alias. * * If for some reason you know exactly what it will be, you may also just pass in the expanded alias, not a function that returns the expanded alias. * * @example * git takes git aliases. These aliases are defined in a user's gitconfig file. Let's say a user has an alias for `p=push`, then if a user typed `git p[space]`, this function would take the `p` token, return `push` and then offer suggestions as if the user had typed `git push[space]` * * @example * `npm run