From 7e08dd21d3c30daaaff7c66c7b4531d0fc4b70bb Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Fri, 23 Oct 2026 23:48:18 +0200 Subject: [PATCH 01/28] chore(guided-tours): create new workspace Signed-off-by: Christoph Jerolimov --- .github/CODEOWNERS | 1 + workspaces/guided-tours/.changeset/README.md | 8 + .../guided-tours/.changeset/config.json | 14 + workspaces/guided-tours/.dockerignore | 8 + workspaces/guided-tours/.eslintignore | 1 + workspaces/guided-tours/.eslintrc.js | 1 + workspaces/guided-tours/.gitignore | 54 + workspaces/guided-tours/.prettierignore | 5 + workspaces/guided-tours/.yarnrc.yml | 4 + workspaces/guided-tours/README.md | 28 + workspaces/guided-tours/backstage.json | 3 + workspaces/guided-tours/bcp.json | 7 + workspaces/guided-tours/package.json | 61 + workspaces/guided-tours/plugins/README.md | 9 + workspaces/guided-tours/tsconfig.json | 19 + workspaces/guided-tours/yarn.lock | 15808 ++++++++++++++++ 16 files changed, 16031 insertions(+) create mode 100644 workspaces/guided-tours/.changeset/README.md create mode 100644 workspaces/guided-tours/.changeset/config.json create mode 100644 workspaces/guided-tours/.dockerignore create mode 100644 workspaces/guided-tours/.eslintignore create mode 100644 workspaces/guided-tours/.eslintrc.js create mode 100644 workspaces/guided-tours/.gitignore create mode 100644 workspaces/guided-tours/.prettierignore create mode 100644 workspaces/guided-tours/.yarnrc.yml create mode 100644 workspaces/guided-tours/README.md create mode 100644 workspaces/guided-tours/backstage.json create mode 100644 workspaces/guided-tours/bcp.json create mode 100644 workspaces/guided-tours/package.json create mode 100644 workspaces/guided-tours/plugins/README.md create mode 100644 workspaces/guided-tours/tsconfig.json create mode 100644 workspaces/guided-tours/yarn.lock diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 63b367a68be..1603531a0ea 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -74,6 +74,7 @@ yarn.lock @backsta /workspaces/grafana @backstage/community-plugins-maintainers /workspaces/graphiql @backstage/community-plugins-maintainers /workspaces/graphql-voyager @backstage/community-plugins-maintainers +/workspaces/guided-tours @backstage/community-plugins-maintainers @christoph-jerolimov @ciiay @debsmita1 @divyanshiGupta @its-mitesh-kumar @logonoff @lokanandaprabhu @rohitkrai03 @karthikjeeyar /workspaces/healert @backstage/community-plugins-maintainers @amgadmag @israa-mosad /workspaces/ilert @backstage/community-plugins-maintainers /workspaces/jaeger @backstage/community-plugins-maintainers diff --git a/workspaces/guided-tours/.changeset/README.md b/workspaces/guided-tours/.changeset/README.md new file mode 100644 index 00000000000..e5b6d8d6a67 --- /dev/null +++ b/workspaces/guided-tours/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/workspaces/guided-tours/.changeset/config.json b/workspaces/guided-tours/.changeset/config.json new file mode 100644 index 00000000000..8208df00f28 --- /dev/null +++ b/workspaces/guided-tours/.changeset/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "privatePackages": { + "tag": false, + "version": false + } +} diff --git a/workspaces/guided-tours/.dockerignore b/workspaces/guided-tours/.dockerignore new file mode 100644 index 00000000000..05edb62650d --- /dev/null +++ b/workspaces/guided-tours/.dockerignore @@ -0,0 +1,8 @@ +.git +.yarn/cache +.yarn/install-state.gz +node_modules +packages/*/src +packages/*/node_modules +plugins +*.local.yaml diff --git a/workspaces/guided-tours/.eslintignore b/workspaces/guided-tours/.eslintignore new file mode 100644 index 00000000000..e5b19947ff1 --- /dev/null +++ b/workspaces/guided-tours/.eslintignore @@ -0,0 +1 @@ +playwright.config.ts diff --git a/workspaces/guided-tours/.eslintrc.js b/workspaces/guided-tours/.eslintrc.js new file mode 100644 index 00000000000..59b86f84124 --- /dev/null +++ b/workspaces/guided-tours/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('../../.eslintrc.cjs'); diff --git a/workspaces/guided-tours/.gitignore b/workspaces/guided-tours/.gitignore new file mode 100644 index 00000000000..fbf813909c9 --- /dev/null +++ b/workspaces/guided-tours/.gitignore @@ -0,0 +1,54 @@ +# macOS +.DS_Store + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Coverage directory generated when running tests with coverage +coverage + +# Dependencies +node_modules/ + +# Yarn 3 files +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Node version directives +.nvmrc + +# dotenv environment variables file +.env +.env.test + +# Build output +dist +dist-types + +# Temporary change files created by Vim +*.swp + +# MkDocs build output +site + +# Local configuration files +*.local.yaml + +# Sensitive credentials +*-credentials.yaml + +# vscode database functionality support files +*.session.sql + +# E2E test reports +e2e-test-report/ diff --git a/workspaces/guided-tours/.prettierignore b/workspaces/guided-tours/.prettierignore new file mode 100644 index 00000000000..1cfaa894795 --- /dev/null +++ b/workspaces/guided-tours/.prettierignore @@ -0,0 +1,5 @@ +dist +dist-types +coverage +.vscode +.eslintrc.js diff --git a/workspaces/guided-tours/.yarnrc.yml b/workspaces/guided-tours/.yarnrc.yml new file mode 100644 index 00000000000..e652f1bdf83 --- /dev/null +++ b/workspaces/guided-tours/.yarnrc.yml @@ -0,0 +1,4 @@ +approvedGitRepositories: + - "**" + +enableScripts: true diff --git a/workspaces/guided-tours/README.md b/workspaces/guided-tours/README.md new file mode 100644 index 00000000000..75d588b662c --- /dev/null +++ b/workspaces/guided-tours/README.md @@ -0,0 +1,28 @@ +# [Backstage](https://backstage.io) + +This is your newly scaffolded Backstage App, Good Luck! + +> [!IMPORTANT] > **TODO**: Consider updating your README text with relevant documentation for your plugin. See some suggested text below. + +# guided-tours + +This workspace contains plugins for \[brief description of purpose, e.g. exposing data from a service]. + +## Plugins + +- \[plugin-backend](./plugins/plugin-backend/README): Backend plugin that provides... + +## Getting Started + +To start the app, run: + +```sh +yarn install +yarn start +``` + +To generate knip reports for this app, run: + +```sh +yarn backstage-repo-tools knip-reports +``` diff --git a/workspaces/guided-tours/backstage.json b/workspaces/guided-tours/backstage.json new file mode 100644 index 00000000000..2569b21dc88 --- /dev/null +++ b/workspaces/guided-tours/backstage.json @@ -0,0 +1,3 @@ +{ + "version": "1.56.2" +} diff --git a/workspaces/guided-tours/bcp.json b/workspaces/guided-tours/bcp.json new file mode 100644 index 00000000000..fdd6800e206 --- /dev/null +++ b/workspaces/guided-tours/bcp.json @@ -0,0 +1,7 @@ +{ + "autoVersionBump": true, + "knipReports": true, + "listDeprecations": true, + "playwrightTests": false, + "codecov": true +} diff --git a/workspaces/guided-tours/package.json b/workspaces/guided-tours/package.json new file mode 100644 index 00000000000..797895957e8 --- /dev/null +++ b/workspaces/guided-tours/package.json @@ -0,0 +1,61 @@ +{ + "name": "@internal/guided-tours", + "version": "1.0.0", + "private": true, + "engines": { + "node": "22 || 24" + }, + "scripts": { + "start": "backstage-cli repo start", + "tsc": "tsc", + "tsc:full": "tsc --skipLibCheck false --incremental false", + "build:all": "backstage-cli repo build --all", + "build:api-reports": "yarn build:api-reports:only --tsc", + "build:api-reports:only": "backstage-repo-tools api-reports -o ae-wrong-input-file-type,ae-undocumented --validate-release-tags", + "build:knip-reports": "backstage-repo-tools knip-reports", + "clean": "backstage-cli repo clean", + "test": "backstage-cli repo test", + "test:all": "backstage-cli repo test --coverage", + "fix": "backstage-cli repo fix", + "lint": "backstage-cli repo lint --since origin/main", + "lint:all": "backstage-cli repo lint", + "prettier:check": "prettier --check .", + "prettier:fix": "prettier --write .", + "new": "backstage-cli new --scope @backstage-community", + "postinstall": "cd ../../ && yarn install" + }, + "workspaces": [ + "packages/*", + "plugins/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/backstage/community-plugins", + "directory": "workspaces/guided-tours" + }, + "devDependencies": { + "@backstage/cli": "^0.36.7", + "@backstage/cli-defaults": "^0.1.7", + "@backstage/e2e-test-utils": "^0.1.2", + "@backstage/repo-tools": "^0.19.2", + "@changesets/cli": "^2.27.1", + "knip": "^5.27.4", + "node-gyp": "^10.0.0", + "prettier": "^2.3.2", + "typescript": "~5.8.0" + }, + "resolutions": { + "@types/react": "^18", + "@types/react-dom": "^18" + }, + "prettier": "@backstage/cli/config/prettier", + "lint-staged": { + "*.{js,jsx,ts,tsx,mjs,cjs}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,md}": [ + "prettier --write" + ] + } +} diff --git a/workspaces/guided-tours/plugins/README.md b/workspaces/guided-tours/plugins/README.md new file mode 100644 index 00000000000..d7865fdba35 --- /dev/null +++ b/workspaces/guided-tours/plugins/README.md @@ -0,0 +1,9 @@ +# The Plugins Folder + +This is where your own plugins and their associated modules live, each in a +separate folder of its own. + +If you want to create a new plugin here, go to your project root directory, run +the command `yarn new`, and follow the on-screen instructions. + +You can also check out existing plugins on [the plugin marketplace](https://backstage.io/plugins)! diff --git a/workspaces/guided-tours/tsconfig.json b/workspaces/guided-tours/tsconfig.json new file mode 100644 index 00000000000..d346b34ac55 --- /dev/null +++ b/workspaces/guided-tours/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": [ + "packages/*/src", + "plugins/*/src", + "plugins/*/dev", + "plugins/*/migrations" + ], + "files": ["node_modules/@backstage/cli/asset-types/asset-types.d.ts"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "dist-types", + "rootDir": ".", + "lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2022"], + "target": "ES2022", + "useUnknownInCatchVariables": false, + "jsx": "react-jsx" + } +} diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock new file mode 100644 index 00000000000..947a867f691 --- /dev/null +++ b/workspaces/guided-tours/yarn.lock @@ -0,0 +1,15808 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 9 + cacheKey: 10 + +"@apidevtools/json-schema-ref-parser@npm:11.7.2": + version: 11.7.2 + resolution: "@apidevtools/json-schema-ref-parser@npm:11.7.2" + dependencies: + "@jsdevtools/ono": "npm:^7.1.3" + "@types/json-schema": "npm:^7.0.15" + js-yaml: "npm:^4.1.0" + checksum: 10/8e80207c28aad234d3710fcfcf307691000bfbda40edb2ea4fdaf8158d026eb2b15a6471076490c2f40304df5b7bdd4be33d9979acef6cbfaf459b8bd1d79bf2 + languageName: node + linkType: hard + +"@apidevtools/openapi-schemas@npm:^2.1.0": + version: 2.1.0 + resolution: "@apidevtools/openapi-schemas@npm:2.1.0" + checksum: 10/4ca78f79ee2e5a162d16d140f939ca90d51265014ea2e500955286ad3acd11b75db4179b7b4bae245b09a981baeb8d80b81bc24c61d6c471a4a4707ed277ebf2 + languageName: node + linkType: hard + +"@apidevtools/swagger-methods@npm:^3.0.2": + version: 3.0.2 + resolution: "@apidevtools/swagger-methods@npm:3.0.2" + checksum: 10/d06b1ac5c1956613c4c6be695612ef860cd4e962b93a509ca551735a328a856cae1e33399cac1dcbf8333ba22b231746f3586074769ef0e172cf549ec9e7eaae + languageName: node + linkType: hard + +"@apidevtools/swagger-parser@npm:^10.1.0": + version: 10.1.1 + resolution: "@apidevtools/swagger-parser@npm:10.1.1" + dependencies: + "@apidevtools/json-schema-ref-parser": "npm:11.7.2" + "@apidevtools/openapi-schemas": "npm:^2.1.0" + "@apidevtools/swagger-methods": "npm:^3.0.2" + "@jsdevtools/ono": "npm:^7.1.3" + ajv: "npm:^8.17.1" + ajv-draft-04: "npm:^1.0.0" + call-me-maybe: "npm:^1.0.2" + peerDependencies: + openapi-types: ">=7" + checksum: 10/8fdda3a2883ceebdb72f4267c3e85f81735a58fc70d5eb4c1b0662a6b39df4e62228d52bcd9e1bde1f6d5b3d4db411b1047975d3acf03b9e8dd02655d8c138c1 + languageName: node + linkType: hard + +"@apisyouwonthate/style-guide@npm:^1.4.0": + version: 1.5.0 + resolution: "@apisyouwonthate/style-guide@npm:1.5.0" + dependencies: + "@stoplight/spectral-formats": "npm:^1.2.0" + "@stoplight/spectral-functions": "npm:^1.6.1" + checksum: 10/cabc978a4f44a54cf76d4a38186c714e89d1ca0cba3814ff2cfed3f0752ef46ebef35df16f45add25235c103f5d7d4b1f9e79ecec0e3596a912e5401b6d3df20 + languageName: node + linkType: hard + +"@asyncapi/specs@npm:6.11.1": + version: 6.11.1 + resolution: "@asyncapi/specs@npm:6.11.1" + dependencies: + "@types/json-schema": "npm:^7.0.11" + checksum: 10/51a9f8e61b85c519baee392641c83f021419f64c68e508732d6461c6b6a60d9891d84e53489a916ef0903a80dd736b0a0631bb97567488b7cc4383437806b84d + languageName: node + linkType: hard + +"@babel/code-frame@npm:7.0.0": + version: 7.0.0 + resolution: "@babel/code-frame@npm:7.0.0" + dependencies: + "@babel/highlight": "npm:^7.0.0" + checksum: 10/ac4d13f8678155249e272afe22f84710c2343a863767ab5a7c3a54f0fb5f6f57b192a5cb2a625d4f7f05f33ad806d8b9ab4ce83ba9ec280119e665a8bd48123d + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.8.3": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/84da552e51a55795a50b3589116edb2f9e368a647d266380683775f18effd9acd4521b0246bebd0b049a7f32af1f87b1e8475d3bcb665f876bd04ade8da99697 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^8.0.0": + version: 8.0.6 + resolution: "@babel/code-frame@npm:8.0.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^8.0.6" + js-tokens: "npm:^10.0.0" + checksum: 10/40d81ac92461482fee027e1949d95d7d169ae8fc41216f16c7f50db88712bb75a33608094492037b1a42185768867dca0acd87dee17841c62dedacd3a5ff79e2 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10/2efa42701eb05babf26dff3332109c9e5e1a3400a71fb9e68ee27af28235036a2a72c2494c04bdab3f909075f42a58b2e8271074372bc7f8e79ec02bd364d7a7 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^8.0.6": + version: 8.0.6 + resolution: "@babel/helper-validator-identifier@npm:8.0.6" + checksum: 10/ebe1bf63a99cdcb60f572d8d20a358d44b8d68bf120e226c105c7883e5bde8220df64b2524124372f9d09fb9c90d5e9ae446d65a88f943271acf24121ec2826e + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.0.0": + version: 7.25.9 + resolution: "@babel/highlight@npm:7.25.9" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/0d165283dd4eb312292cea8fec3ae0d376874b1885f476014f0136784ed5b564b2c2ba2d270587ed546ee92505056dab56493f7960c01c4e6394d71d1b2e7db6 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.5.5": + version: 7.29.10 + resolution: "@babel/runtime@npm:7.29.10" + checksum: 10/883bb39a09f4773cf46cdd7ba0080ef6b30ff996a4ed21f8d34511ec0836122e697716533da5efc9b5016f763110b19aa07e81cec6e2036fe72cb26aad556af2 + languageName: node + linkType: hard + +"@backstage/backend-plugin-api@npm:^1.11.0": + version: 1.11.0 + resolution: "@backstage/backend-plugin-api@npm:1.11.0" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/connections": "npm:^0.4.1" + "@backstage/errors": "npm:^1.3.2" + "@backstage/plugin-auth-node": "npm:^0.7.7" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/plugin-permission-node": "npm:^0.11.5" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/json-schema": "npm:^7.0.6" + "@types/luxon": "npm:^3.0.0" + knex: "npm:^3.0.0" + luxon: "npm:^3.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + checksum: 10/ba3c0035023d354a3bcca6cb3a642871e43eafa85af5a922f136b40a0d7cd7f563d77434e1734a2f4883925a29c2f027652fa9416be8b2e6542daaff1a40bf9a + languageName: node + linkType: hard + +"@backstage/catalog-client@npm:^1.16.3": + version: 1.16.3 + resolution: "@backstage/catalog-client@npm:1.16.3" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/plugin-catalog-common": "npm:^1.2.1" + cross-fetch: "npm:^4.0.0" + lodash: "npm:^4.17.21" + uri-template: "npm:^2.0.0" + checksum: 10/eac15c43138dfa5f3e37b8077d0ab984f0f40acd64ed994969c5d6e94d82ba2222b46a00ae085dd0192b5745b6a695e45cb67b5f4672796e6b001ca2838a64e5 + languageName: node + linkType: hard + +"@backstage/catalog-model@npm:^1.10.2": + version: 1.10.2 + resolution: "@backstage/catalog-model@npm:1.10.2" + dependencies: + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + ajv: "npm:^8.10.0" + ajv-errors: "npm:^3.0.0" + lodash: "npm:^4.17.21" + zod: "npm:^4.0.0" + checksum: 10/f31d1fe4e362e6683fe8709c7bb3bb11e3625c58cded820d963eb870bb6b0ea5601e134984121ff2d8e81a4dfc61a34d39b750138fd1a9c024af4a8e3f81c317 + languageName: node + linkType: hard + +"@backstage/cli-common@npm:^0.3.2": + version: 0.3.2 + resolution: "@backstage/cli-common@npm:0.3.2" + dependencies: + "@backstage/errors": "npm:^1.3.2" + cross-spawn: "npm:^7.0.3" + checksum: 10/34c81dff471a6338671206b8bed8e0ae93b9e89a133c837ad5f49553ec27e6de241301c0c0300a81faf142158161b361ca273279045e9fae144d02e1e9bca880 + languageName: node + linkType: hard + +"@backstage/cli-defaults@npm:^0.1.7": + version: 0.1.7 + resolution: "@backstage/cli-defaults@npm:0.1.7" + dependencies: + "@backstage/cli-module-actions": "npm:^0.1.4" + "@backstage/cli-module-auth": "npm:^0.1.5" + "@backstage/cli-module-build": "npm:^0.1.9" + "@backstage/cli-module-catalog": "npm:^0.2.0" + "@backstage/cli-module-config": "npm:^0.1.8" + "@backstage/cli-module-github": "npm:^0.1.5" + "@backstage/cli-module-info": "npm:^0.1.5" + "@backstage/cli-module-lint": "npm:^0.1.6" + "@backstage/cli-module-maintenance": "npm:^0.1.6" + "@backstage/cli-module-migrate": "npm:^0.2.2" + "@backstage/cli-module-new": "npm:^0.1.8" + "@backstage/cli-module-package-manager-yarn": "npm:^0.1.3" + "@backstage/cli-module-scaffolder": "npm:^0.2.0" + "@backstage/cli-module-search": "npm:^0.2.0" + "@backstage/cli-module-test-jest": "npm:^0.1.7" + "@backstage/cli-module-translations": "npm:^0.1.5" + checksum: 10/fbee88e3e59df028a265a39dc84cd76b8222a40c5763344063199232446726b47d9235a28a3587f3793c05f23acc542b3253000f685b27dbaa1d2e3df305664b + languageName: node + linkType: hard + +"@backstage/cli-module-actions@npm:^0.1.4": + version: 0.1.4 + resolution: "@backstage/cli-module-actions@npm:0.1.4" + dependencies: + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + marked: "npm:^15.0.12" + marked-terminal: "npm:^7.3.0" + strip-ansi: "npm:^7.1.0" + zod: "npm:^3.25.76 || ^4.0.0" + bin: + cli-module-actions: bin/backstage-cli-module-actions + checksum: 10/33b39a115f3484a7dcb66c4ab859fa2994ff17b9899e6f52030cd27e4d87828f1092172894a1503b66809f0443fd4542b64ebdc85bad7639e26e21e8ecacc0be + languageName: node + linkType: hard + +"@backstage/cli-module-auth@npm:^0.1.5": + version: 0.1.5 + resolution: "@backstage/cli-module-auth@npm:0.1.5" + dependencies: + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + glob: "npm:^13.0.0" + inquirer: "npm:^8.2.0" + keytar: "npm:^7.9.0" + proper-lockfile: "npm:^4.1.2" + yaml: "npm:^2.0.0" + zod: "npm:^4.0.0" + dependenciesMeta: + keytar: + optional: true + bin: + cli-module-auth: bin/backstage-cli-module-auth + checksum: 10/0ccee0945d5c6ad9516384fb9c8dad5e7af49ffe1d27cbb52ee6de4c254e42ad532b8116f1f7afdc7d278b086385b3baf6bc87a73bb11ad93247dac28097e944 + languageName: node + linkType: hard + +"@backstage/cli-module-build@npm:^0.1.9": + version: 0.1.9 + resolution: "@backstage/cli-module-build@npm:0.1.9" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/config": "npm:^1.3.10" + "@backstage/config-loader": "npm:^1.11.4" + "@backstage/errors": "npm:^1.3.2" + "@backstage/module-federation-common": "npm:^0.1.6" + "@manypkg/get-packages": "npm:^1.1.3" + "@module-federation/enhanced": "npm:~2.8.2" + "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.6.0" + "@rollup/plugin-commonjs": "npm:^26.0.0" + "@rollup/plugin-json": "npm:^6.0.0" + "@rollup/plugin-node-resolve": "npm:^15.0.0" + "@rollup/plugin-yaml": "npm:^4.0.0" + "@rspack/core": "npm:^1.4.11" + "@rspack/dev-server": "npm:^1.1.4" + "@rspack/plugin-react-refresh": "npm:^1.4.3" + "@swc/core": "npm:^1.15.6" + bfj: "npm:^9.0.2" + buffer: "npm:^6.0.3" + chalk: "npm:^4.0.0" + chokidar: "npm:^3.3.1" + cleye: "npm:^2.6.0" + cross-spawn: "npm:^7.0.3" + css-loader: "npm:^6.5.1" + ctrlc-windows: "npm:^2.1.0" + esbuild-loader: "npm:^4.0.0" + eslint-rspack-plugin: "npm:^4.2.1" + eslint-webpack-plugin: "npm:^4.2.0" + fork-ts-checker-webpack-plugin: "npm:^9.0.0" + fs-extra: "npm:^11.2.0" + glob: "npm:^13.0.0" + html-webpack-plugin: "npm:^5.6.3" + lodash: "npm:^4.17.21" + mini-css-extract-plugin: "npm:^2.4.2" + node-stdlib-browser: "npm:^1.3.1" + npm-packlist: "npm:^5.0.0" + p-queue: "npm:^6.6.2" + portfinder: "npm:^1.0.32" + postcss: "npm:^8.1.0" + postcss-import: "npm:^16.1.0" + process: "npm:^0.11.10" + raw-loader: "npm:^4.0.2" + react-dev-utils: "npm:^12.0.0-next.60" + react-refresh: "npm:^0.18.0" + rollup: "npm:^4.59.0" + rollup-plugin-dts: "npm:^6.1.0" + rollup-plugin-esbuild: "npm:^6.1.1" + rollup-plugin-postcss: "npm:^4.0.0" + rollup-pluginutils: "npm:^2.8.2" + shell-quote: "npm:^1.9.0" + style-loader: "npm:^3.3.1" + swc-loader: "npm:^0.2.3" + tar: "npm:^7.5.21" + ts-checker-rspack-plugin: "npm:^1.1.5" + ts-morph: "npm:^24.0.0" + util: "npm:^0.12.3" + webpack: "npm:~5.111.0" + webpack-dev-server: "npm:^5.0.0" + yml-loader: "npm:^2.1.0" + yn: "npm:^4.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + embedded-postgres: ^18.3.0-beta.16 + peerDependenciesMeta: + embedded-postgres: + optional: true + bin: + cli-module-build: bin/backstage-cli-module-build + checksum: 10/9b5d1834a6a641aabf74c54d8c03df8cd8844208f2d91aa9ec5a88a0b15bb6ad65859c961d171e0ada730603671cce165c69231773894cbe6db2ba7b48880dab + languageName: node + linkType: hard + +"@backstage/cli-module-catalog@npm:^0.2.0": + version: 0.2.0 + resolution: "@backstage/cli-module-catalog@npm:0.2.0" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + yaml: "npm:^2.0.0" + bin: + cli-module-catalog: bin/backstage-cli-module-catalog + checksum: 10/f61fe0b1740b8be36ad2bd2a57a0e18164d06ad3b071a62df847529f9d44809096f6b71bc0c9137b653a8e7a2be57e36b3dc27c2312f957ac640ada7f7ba4fc4 + languageName: node + linkType: hard + +"@backstage/cli-module-config@npm:^0.1.8": + version: 0.1.8 + resolution: "@backstage/cli-module-config@npm:0.1.8" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/config": "npm:^1.3.10" + "@backstage/config-loader": "npm:^1.11.4" + "@backstage/types": "npm:^1.2.2" + "@manypkg/get-packages": "npm:^1.1.3" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + react-dev-utils: "npm:^12.0.0-next.60" + yaml: "npm:^2.0.0" + bin: + cli-module-config: bin/backstage-cli-module-config + checksum: 10/9b98fb41f573ab2700e4b4855e5ab644bd7b02acce0c2e4e0ba95ac731bf1eb0bfd4d3f8ef1a0893418a453a9adbe5d8bcaaef9c1bc23eaf0e7ea4ee54a8b751 + languageName: node + linkType: hard + +"@backstage/cli-module-github@npm:^0.1.5": + version: 0.1.5 + resolution: "@backstage/cli-module-github@npm:0.1.5" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@octokit/request": "npm:^8.0.0" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + express: "npm:^4.22.0" + fs-extra: "npm:^11.2.0" + inquirer: "npm:^8.2.0" + react-dev-utils: "npm:^12.0.0-next.60" + yaml: "npm:^2.0.0" + bin: + cli-module-github: bin/backstage-cli-module-github + checksum: 10/ceee906b7f02ec37f175e84ddb5ff8453956b418ba64180d7a705307588cf75495f664273d388fd49e6b31f07d8e08ccfbd7a537e6bd60f85e17229a7d7d8bf2 + languageName: node + linkType: hard + +"@backstage/cli-module-info@npm:^0.1.5": + version: 0.1.5 + resolution: "@backstage/cli-module-info@npm:0.1.5" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + minimatch: "npm:^10.2.1" + bin: + cli-module-info: bin/backstage-cli-module-info + checksum: 10/0232d17eccc5894857700e4cf8b5a16c9b04ba7113fa4dae0ce3e090d8500b84075a50410f05dbc5a0745b1851b9887b62bdf3481f7cada7eeb99b91bcb63413 + languageName: node + linkType: hard + +"@backstage/cli-module-lint@npm:^0.1.6": + version: 0.1.6 + resolution: "@backstage/cli-module-lint@npm:0.1.6" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + eslint: "npm:^8.6.0" + eslint-formatter-friendly: "npm:^7.0.0" + fs-extra: "npm:^11.2.0" + globby: "npm:^11.1.0" + shell-quote: "npm:^1.9.0" + bin: + cli-module-lint: bin/backstage-cli-module-lint + checksum: 10/8ee5888f2d1c92d64c8a1c7861a33fdff57c3fbf2d51a0b13ad553ea41c96666d15cb97144e78f46a19c7a35cbccd3db2bc3508acc444135691efc0e09a712e1 + languageName: node + linkType: hard + +"@backstage/cli-module-maintenance@npm:^0.1.6": + version: 0.1.6 + resolution: "@backstage/cli-module-maintenance@npm:0.1.6" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@typescript-eslint/eslint-plugin": "npm:^8.17.0" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + eslint: "npm:^8.6.0" + fs-extra: "npm:^11.2.0" + bin: + cli-module-maintenance: bin/backstage-cli-module-maintenance + checksum: 10/ad7565ca61d95c475db09763507ada20b51b9c3cdb757b1e74748db5b0138dac04f6c3920988eca73a85325e66f03ec06a30b460664a916b2661ee2fd10a8d8f + languageName: node + linkType: hard + +"@backstage/cli-module-migrate@npm:^0.2.2": + version: 0.2.2 + resolution: "@backstage/cli-module-migrate@npm:0.2.2" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + "@backstage/release-manifests": "npm:^0.0.15" + "@manypkg/get-packages": "npm:^1.1.3" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + minimatch: "npm:^10.2.1" + ora: "npm:^5.3.0" + replace-in-file: "npm:^7.1.0" + semver: "npm:^7.5.3" + bin: + cli-module-migrate: bin/backstage-cli-module-migrate + checksum: 10/aaa3958bc4ce40ee7f03b88ee0ee359c036a0049a6dd4ea88261e859bfaff8ef6c020890118dff1d39ae8b3a3372d5882b7fbf0155fbf68ece76fdf9b09f55ef + languageName: node + linkType: hard + +"@backstage/cli-module-new@npm:^0.1.8": + version: 0.1.8 + resolution: "@backstage/cli-module-new@npm:0.1.8" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + handlebars: "npm:^4.7.3" + inquirer: "npm:^8.2.0" + lodash: "npm:^4.17.21" + ora: "npm:^5.3.0" + recursive-readdir: "npm:^2.2.2" + semver: "npm:^7.5.3" + yaml: "npm:^2.0.0" + zod: "npm:^4.0.0" + zod-validation-error: "npm:^5.0.0" + bin: + cli-module-new: bin/backstage-cli-module-new + checksum: 10/6c51e4bd382b39995da7a4026d0231fff9fedacc027b0bf75a9f3c9d53231bbe396105f3b3b7cca925484dd102407af6c8d3c9e4d7ce48619f4ffea1f6657697 + languageName: node + linkType: hard + +"@backstage/cli-module-package-manager-yarn@npm:^0.1.3": + version: 0.1.4 + resolution: "@backstage/cli-module-package-manager-yarn@npm:0.1.4" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/release-manifests": "npm:^0.0.15" + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/parsers": "npm:^3.0.0" + cleye: "npm:^2.6.0" + peerDependencies: + "@yarnpkg/cli": ^4.7.0 + "@yarnpkg/core": ^4.9.1 + "@yarnpkg/plugin-patch": ^4.0.2 + peerDependenciesMeta: + "@yarnpkg/cli": + optional: true + "@yarnpkg/core": + optional: true + "@yarnpkg/plugin-patch": + optional: true + bin: + cli-module-package-manager-yarn: bin/backstage-cli-module-package-manager-yarn + checksum: 10/669522142cc7945e84062f9473e9b4425aa9bcd4373f77efff8847825347aab9b36c6b210e5320e231cd9750f40371a64268a6033e34eb006800751ecdb82fb0 + languageName: node + linkType: hard + +"@backstage/cli-module-scaffolder@npm:^0.2.0": + version: 0.2.0 + resolution: "@backstage/cli-module-scaffolder@npm:0.2.0" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + yaml: "npm:^2.0.0" + bin: + cli-module-scaffolder: bin/backstage-cli-module-scaffolder + checksum: 10/e8c9fb5f9beda6db5949993cc50ab94141a671d6eefc41278e34f25f106f847bea63c73f9593d7d6ea51a52ae0481a74cfc16ff924cbce53ae640de7fad19c1d + languageName: node + linkType: hard + +"@backstage/cli-module-search@npm:^0.2.0": + version: 0.2.0 + resolution: "@backstage/cli-module-search@npm:0.2.0" + dependencies: + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/errors": "npm:^1.3.2" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + bin: + cli-module-search: bin/backstage-cli-module-search + checksum: 10/612d9dae955d5d47dcfedd60ebff2f0d4f827d1d1129637bf85b9f6b9a5bfe877feefc38b428f19ec227c2187aaee53c16cd467bfc4e85f719999c035ae65686 + languageName: node + linkType: hard + +"@backstage/cli-module-test-jest@npm:^0.1.7": + version: 0.1.7 + resolution: "@backstage/cli-module-test-jest@npm:0.1.7" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@swc/core": "npm:^1.15.6" + "@swc/jest": "npm:^0.2.39" + cleye: "npm:^2.6.0" + cross-fetch: "npm:^4.0.0" + fs-extra: "npm:^11.2.0" + glob: "npm:^13.0.0" + jest-css-modules: "npm:^2.1.0" + sucrase: "npm:^3.20.2" + yargs: "npm:^16.2.0" + peerDependencies: + "@jest/environment-jsdom-abstract": ^30.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-environment-jsdom: "*" + jsdom: ^27.1.0 + peerDependenciesMeta: + "@jest/environment-jsdom-abstract": + optional: true + jest-environment-jsdom: + optional: true + jsdom: + optional: true + bin: + cli-module-test-jest: bin/backstage-cli-module-test-jest + checksum: 10/fd4f86793a1d6d9905d9432d9e2f39439cd731a892ed0bf5db2f4a9775684289d6f7a1ff52103ae769332c01f065415d467fee8f61c0bce199400e449a2d754a + languageName: node + linkType: hard + +"@backstage/cli-module-translations@npm:^0.1.5": + version: 0.1.5 + resolution: "@backstage/cli-module-translations@npm:0.1.5" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + ts-morph: "npm:^24.0.0" + bin: + cli-module-translations: bin/backstage-cli-module-translations + checksum: 10/cb8f3d5f8358078da69e487394027f2d52d4f2035b7dcc70073cfa2749631f03501927b2d1b6e69a04c5642e863d02a7e013dad285ed7bc85ab2b1c891cd660d + languageName: node + linkType: hard + +"@backstage/cli-node@npm:^0.3.5": + version: 0.3.5 + resolution: "@backstage/cli-node@npm:0.3.5" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@manypkg/get-packages": "npm:^1.1.3" + "@yarnpkg/lockfile": "npm:^1.1.0" + "@yarnpkg/parsers": "npm:^3.0.0" + chalk: "npm:^4.0.0" + cleye: "npm:^2.6.0" + fs-extra: "npm:^11.2.0" + keytar: "npm:^7.9.0" + pirates: "npm:^4.0.6" + proper-lockfile: "npm:^4.1.2" + semver: "npm:^7.5.3" + yaml: "npm:^2.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@swc/core": ^1.15.6 + dependenciesMeta: + keytar: + optional: true + peerDependenciesMeta: + "@swc/core": + optional: true + checksum: 10/6acadafb37df1c4628d1492a40dc94f61ec3ca6529fe4902a7a660f61b406162795b92669d49c09554652881dadbd6188261da62841055f1230b9671e976758b + languageName: node + linkType: hard + +"@backstage/cli@npm:^0.36.7": + version: 0.36.7 + resolution: "@backstage/cli@npm:0.36.7" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-defaults": "npm:^0.1.7" + "@backstage/cli-module-build": "npm:^0.1.9" + "@backstage/cli-module-test-jest": "npm:^0.1.7" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/eslint-plugin": "npm:^0.3.3" + "@manypkg/get-packages": "npm:^1.1.3" + "@spotify/eslint-config-base": "npm:^15.0.0" + "@spotify/eslint-config-react": "npm:^15.0.0" + "@spotify/eslint-config-typescript": "npm:^15.0.0" + "@swc/core": "npm:^1.15.6" + "@swc/jest": "npm:^0.2.39" + "@types/webpack-env": "npm:^1.15.2" + "@typescript-eslint/eslint-plugin": "npm:^8.17.0" + "@typescript-eslint/parser": "npm:^8.16.0" + chalk: "npm:^4.0.0" + cross-fetch: "npm:^4.0.0" + eslint: "npm:^8.6.0" + eslint-config-prettier: "npm:^9.0.0" + eslint-plugin-import: "npm:^2.31.0" + eslint-plugin-jest: "npm:^28.9.0" + eslint-plugin-jsx-a11y: "npm:^6.10.2" + eslint-plugin-react: "npm:^7.37.2" + eslint-plugin-react-hooks: "npm:^5.0.0" + eslint-plugin-unused-imports: "npm:^4.1.4" + fs-extra: "npm:^11.2.0" + glob: "npm:^13.0.0" + jest-css-modules: "npm:^2.1.0" + pirates: "npm:^4.0.6" + postcss: "npm:^8.1.0" + sucrase: "npm:^3.20.2" + yaml: "npm:^2.0.0" + peerDependencies: + "@jest/environment-jsdom-abstract": ^30.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-environment-jsdom: "*" + jsdom: ^27.1.0 + peerDependenciesMeta: + "@jest/environment-jsdom-abstract": + optional: true + jest-environment-jsdom: + optional: true + jsdom: + optional: true + bin: + backstage-cli: bin/backstage-cli + checksum: 10/5c63b2dd124275a27faaf5985b9a8db003fc9aa995613b4e10f8609c57b9968e78964bf254a67dd138677dd26cb4bd7f4a73ea0cfa2216d0f7c8c5391ac534dd + languageName: node + linkType: hard + +"@backstage/config-loader@npm:^1.11.4": + version: 1.11.4 + resolution: "@backstage/config-loader@npm:1.11.4" + dependencies: + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@types/json-schema": "npm:^7.0.6" + ajv: "npm:^8.10.0" + chokidar: "npm:^3.5.2" + fs-extra: "npm:^11.2.0" + json-schema-merge-allof: "npm:^0.8.1" + json-schema-traverse: "npm:^1.0.0" + lodash: "npm:^4.17.21" + minimist: "npm:^1.2.5" + ts-json-schema-generator: "npm:^2.9.0" + typescript: "npm:^5.9.3" + yaml: "npm:^2.0.0" + checksum: 10/d909aea7e6852ca5e57b7192b86dc1adc75a1f68176bbce62b6556fbebc1294dd4123eda72803b4c60b3c20f138f284044469ca091904a20e3fc4a3813bb379c + languageName: node + linkType: hard + +"@backstage/config@npm:^1.3.10": + version: 1.3.10 + resolution: "@backstage/config@npm:1.3.10" + dependencies: + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + ms: "npm:^2.1.3" + checksum: 10/ffd0f4ec5e5c47b984f22e48d04c3be5c9e682e2947d7de23ff1910f5742b8620d6ca45a8569e1cc2cfe1bf58052a832d08a5ab77766ffa989d4d3a75bc2aa12 + languageName: node + linkType: hard + +"@backstage/connections@npm:^0.4.1": + version: 0.4.1 + resolution: "@backstage/connections@npm:0.4.1" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + zod: "npm:^4.0.0" + checksum: 10/a91df837de7fb581039159534a00cadd811466a9299b9137f2a948e90a6ad5d7daf7085cb1fd374ff31998f19fefd5223cc2672b4fbc7a69cdaca470c9a4d006 + languageName: node + linkType: hard + +"@backstage/e2e-test-utils@npm:^0.1.2": + version: 0.1.2 + resolution: "@backstage/e2e-test-utils@npm:0.1.2" + dependencies: + "@manypkg/get-packages": "npm:^1.1.3" + fs-extra: "npm:^11.0.0" + peerDependencies: + "@playwright/test": ^1.32.3 + peerDependenciesMeta: + "@playwright/test": + optional: true + checksum: 10/425fe6c4fc4f5710e6142a513fb9ef756133fb6a3640c3102ed61d2627ab683e1a5252ac6849f5c8926d09a9d5aba2033888e4cc13bfd5cc7af3d340e125071c + languageName: node + linkType: hard + +"@backstage/errors@npm:^1.3.2": + version: 1.3.2 + resolution: "@backstage/errors@npm:1.3.2" + dependencies: + "@backstage/types": "npm:^1.2.2" + serialize-error: "npm:^8.0.1" + checksum: 10/6771341dc0328cf23c81462e9dd1398f765d91db344cd3a15aff42921b4ab6b42e57d6b32dcecf172643e4414c6546195d147a753124b05c6c3063dd609609cc + languageName: node + linkType: hard + +"@backstage/eslint-plugin@npm:^0.3.3": + version: 0.3.3 + resolution: "@backstage/eslint-plugin@npm:0.3.3" + dependencies: + "@manypkg/get-packages": "npm:^1.1.3" + minimatch: "npm:^10.2.1" + checksum: 10/9c91b7c716be3707624bd7fe3d19beafe4922750a9140f57862266fe47d51226ecb5f09c13c22783a1b1a663c4e4a541cc1d845dfadaf4ed6d2832cbd946a00f + languageName: node + linkType: hard + +"@backstage/filter-predicates@npm:^0.2.0": + version: 0.2.0 + resolution: "@backstage/filter-predicates@npm:0.2.0" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + zod: "npm:^3.25.76 || ^4.0.0" + zod-validation-error: "npm:^5.0.0" + checksum: 10/75cb8733c18f61170144ab521ac1a2a73c1a80af72487ffcfaf82c49753400b51affa8ed67d018a62fc013abf53292574c7c9c68d73d9e3160ceb85afaee8e2c + languageName: node + linkType: hard + +"@backstage/module-federation-common@npm:^0.1.6": + version: 0.1.6 + resolution: "@backstage/module-federation-common@npm:0.1.6" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@module-federation/runtime": "npm:~2.8.2" + peerDependencies: + "@emotion/react": ^11.10.5 + "@material-ui/core": ^4.12.2 + "@material-ui/styles": ^4.10.0 + "@mui/material": ^5.12.2 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router: ^6.30.2 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/983edd8a2a828dea76c724b6e94c296f354f31a282933f793158e978af12c6742ed55ef248b91d67741ea56f210d9d09c5003ae3869c35308db682d97d5e7c25 + languageName: node + linkType: hard + +"@backstage/plugin-auth-node@npm:^0.7.7": + version: 0.7.7 + resolution: "@backstage/plugin-auth-node@npm:0.7.7" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.11.0" + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/passport": "npm:^1.0.3" + express: "npm:^4.22.0" + jose: "npm:^5.0.0" + lodash: "npm:^4.17.21" + passport: "npm:^0.7.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + zod-validation-error: "npm:^5.0.0" + checksum: 10/f6938bf766a5002096c4d89b40dd76068fc078a1007a5a1096ba624d0eca43d6f0ef57a3353630e21a73cce9b473430f2e26c9297feb66cace181c9a6c53806a + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@npm:^1.2.1": + version: 1.2.1 + resolution: "@backstage/plugin-catalog-common@npm:1.2.1" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/plugin-search-common": "npm:^1.2.26" + checksum: 10/ccf35e7c2d5cdabc1e97e981673631bb58b878b982193238768359929ccfa8efc8d23977cde23e99480e05cbced232256afb082418c78fc6cb900e6b6cf6ad7b + languageName: node + linkType: hard + +"@backstage/plugin-permission-common@npm:^0.9.12": + version: 0.9.12 + resolution: "@backstage/plugin-permission-common@npm:0.9.12" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + cross-fetch: "npm:^4.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + checksum: 10/abc9b9ee19c9dd18dad75923b8d81cb63c7fe03bac5045f9e8e5af20479903a292452e6d5f0db0cc4dcff6c9cee4e254c3fa0a7c186c14d9aee1651f34c60a6f + languageName: node + linkType: hard + +"@backstage/plugin-permission-node@npm:^0.11.5": + version: 0.11.5 + resolution: "@backstage/plugin-permission-node@npm:0.11.5" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.11.0" + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@standard-schema/spec": "npm:^1.1.0" + "@types/express": "npm:^4.17.6" + express: "npm:^4.22.0" + express-promise-router: "npm:^4.1.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + checksum: 10/66305f637d79c305795acdc3df2214bad3fd013aa11eb6778d6209c16e452ca5e975294aeb4025d4edfde22d9869cc88d5362cb6681ec8e238e305b9e23a624b + languageName: node + linkType: hard + +"@backstage/plugin-search-common@npm:^1.2.26": + version: 1.2.26 + resolution: "@backstage/plugin-search-common@npm:1.2.26" + dependencies: + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/types": "npm:^1.2.2" + checksum: 10/07dbfc435e537c0023f0a4405fc753307e751b5f208e94f54f27da70905783278b32f2f7b45f7ca85b3fa42d4228ab8502c80ca794a1601eff199709c647513d + languageName: node + linkType: hard + +"@backstage/release-manifests@npm:^0.0.15": + version: 0.0.15 + resolution: "@backstage/release-manifests@npm:0.0.15" + checksum: 10/0e52fb2d584f4c4d281bfeb8975d84766ae0d3607a5c385c5b214cbada18c90e4e9b82f185c53da2d835614d90bda210b20ea492eb21f1cb0ab006c62eda9523 + languageName: node + linkType: hard + +"@backstage/repo-tools@npm:^0.19.2": + version: 0.19.2 + resolution: "@backstage/repo-tools@npm:0.19.2" + dependencies: + "@apidevtools/swagger-parser": "npm:^10.1.0" + "@apisyouwonthate/style-guide": "npm:^1.4.0" + "@backstage/backend-plugin-api": "npm:^1.11.0" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/cli-common": "npm:^0.3.2" + "@backstage/cli-node": "npm:^0.3.5" + "@backstage/config-loader": "npm:^1.11.4" + "@backstage/errors": "npm:^1.3.2" + "@electric-sql/pglite": "npm:^0.5.8" + "@manypkg/get-packages": "npm:^1.1.3" + "@microsoft/api-documenter": "npm:^7.28.1" + "@microsoft/api-extractor": "npm:^7.57.3" + "@openapitools/openapi-generator-cli": "npm:^2.41.0" + "@prettier/sync": "npm:^0.6.1" + "@stoplight/spectral-core": "npm:^1.18.0" + "@stoplight/spectral-formatters": "npm:^1.1.0" + "@stoplight/spectral-functions": "npm:^1.7.2" + "@stoplight/spectral-parsers": "npm:^1.0.2" + "@stoplight/spectral-rulesets": "npm:^1.18.0" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:^14.0.0" + chalk: "npm:^4.0.0" + chokidar: "npm:^3.5.3" + codeowners-utils: "npm:^1.0.2" + command-exists: "npm:^1.2.9" + commander: "npm:^14.0.3" + diff: "npm:^9.0.0" + fs-extra: "npm:^11.2.0" + glob: "npm:^13.0.0" + globby: "npm:^11.0.0" + is-glob: "npm:^4.0.3" + js-yaml: "npm:^5.0.0" + just-diff: "npm:^6.0.2" + knex: "npm:^3.0.0" + knex-pglite: "npm:^0.14.0" + knip: "npm:^5.42.0" + lodash: "npm:^4.17.21" + minimatch: "npm:^10.2.1" + openapi-types: "npm:^12.0.0" + p-limit: "npm:^3.0.2" + tar: "npm:^7.5.21" + ts-morph: "npm:^24.0.0" + yaml-diff-patch: "npm:^2.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@microsoft/api-extractor-model": "*" + "@microsoft/tsdoc": "*" + "@microsoft/tsdoc-config": "*" + prettier: ^2.8.1 || ^3.8.1 + typedoc: ^0.28.0 + typescript: "> 3.0.0" + peerDependenciesMeta: + prettier: + optional: true + typedoc: + optional: true + bin: + backstage-repo-tools: bin/backstage-repo-tools + checksum: 10/8f749e24ba3552d31d5998a8e32d618f345fae2e4e7636b63e728e1d2aa5a5b3e491624f9e1a2a29540a2b4b256fa13575179ae3c6629d9bc5b4f833c3c80099 + languageName: node + linkType: hard + +"@backstage/types@npm:^1.2.2": + version: 1.2.2 + resolution: "@backstage/types@npm:1.2.2" + checksum: 10/813129ae2f4be2765b54a16457955c8bbeb7cc6685bc2cae8b981ae7010353d9cd1110acf846f5c23cf7fbbb6bee6d56b629d5f59933247bb529f4816218c1e7 + languageName: node + linkType: hard + +"@borewit/text-codec@npm:^0.2.1": + version: 0.2.2 + resolution: "@borewit/text-codec@npm:0.2.2" + checksum: 10/c971790a72d9e766286db71f68613d1bac3b8bd9eaba52fbf18a8b17903c095968ed5369efdba378751926440aab93f3dd17c89242ef20525808ddced22d49b8 + languageName: node + linkType: hard + +"@changesets/apply-release-plan@npm:^7.1.1": + version: 7.1.1 + resolution: "@changesets/apply-release-plan@npm:7.1.1" + dependencies: + "@changesets/config": "npm:^3.1.4" + "@changesets/get-version-range-type": "npm:^0.4.0" + "@changesets/git": "npm:^3.0.4" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + detect-indent: "npm:^6.0.0" + fs-extra: "npm:^7.0.1" + lodash.startcase: "npm:^4.4.0" + outdent: "npm:^0.5.0" + prettier: "npm:^2.7.1" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.5.3" + checksum: 10/6810c645c08f5f54a7d40025e41b79fe0d52cf83830b1ce1562d34ba6cbc26d9ce2c7482580623ebf3ea5fa1b01f32e9f61f6b7e1b4296d8ac45d8ba7a6bcae0 + languageName: node + linkType: hard + +"@changesets/assemble-release-plan@npm:^6.0.10": + version: 6.0.10 + resolution: "@changesets/assemble-release-plan@npm:6.0.10" + dependencies: + "@changesets/errors": "npm:^0.2.0" + "@changesets/get-dependents-graph": "npm:^2.1.4" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + semver: "npm:^7.5.3" + checksum: 10/75abf5d008d7aed4f29cdb8c46a7d3bcb16531a317be7d2cdbd51b6b6a80cffb350ac5dafe658954402440de1836cd0096f1b69c0768c2bec8939f4ff26cc34e + languageName: node + linkType: hard + +"@changesets/changelog-git@npm:^0.2.1": + version: 0.2.1 + resolution: "@changesets/changelog-git@npm:0.2.1" + dependencies: + "@changesets/types": "npm:^6.1.0" + checksum: 10/c22f3c0baf50c102a6890046351ee42f65ff6d58747ba4f75e5e40da1ed5fbcfd0dc2d11cdfb86acbb3262e58acb93f096c798827cac570c1e22e8f32f58a30f + languageName: node + linkType: hard + +"@changesets/cli@npm:^2.27.1": + version: 2.31.1 + resolution: "@changesets/cli@npm:2.31.1" + dependencies: + "@changesets/apply-release-plan": "npm:^7.1.1" + "@changesets/assemble-release-plan": "npm:^6.0.10" + "@changesets/changelog-git": "npm:^0.2.1" + "@changesets/config": "npm:^3.1.4" + "@changesets/errors": "npm:^0.2.0" + "@changesets/get-dependents-graph": "npm:^2.1.4" + "@changesets/get-release-plan": "npm:^4.0.16" + "@changesets/git": "npm:^3.0.4" + "@changesets/logger": "npm:^0.1.1" + "@changesets/pre": "npm:^2.0.2" + "@changesets/read": "npm:^0.6.7" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" + "@changesets/write": "npm:^0.4.0" + "@inquirer/external-editor": "npm:^1.0.2" + "@manypkg/get-packages": "npm:^1.1.3" + ansi-colors: "npm:^4.1.3" + enquirer: "npm:^2.4.1" + fs-extra: "npm:^7.0.1" + mri: "npm:^1.2.0" + package-manager-detector: "npm:^0.2.0" + picocolors: "npm:^1.1.0" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.5.3" + spawndamnit: "npm:^3.0.1" + term-size: "npm:^2.1.0" + bin: + changeset: bin.js + checksum: 10/cdd707e821cd1b589eb2301b9c2f4219c118a6f4bdf20ec9f0a0ad43e99a8a4ef5883f90ab926723cee904217f7aabe14ee43346eda873495254f40e28672585 + languageName: node + linkType: hard + +"@changesets/config@npm:^3.1.4": + version: 3.1.4 + resolution: "@changesets/config@npm:3.1.4" + dependencies: + "@changesets/errors": "npm:^0.2.0" + "@changesets/get-dependents-graph": "npm:^2.1.4" + "@changesets/logger": "npm:^0.1.1" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + fs-extra: "npm:^7.0.1" + micromatch: "npm:^4.0.8" + checksum: 10/d563b0613c3fa387d517bd137c64755bd8246f74dc070c6a9cd5d2d05b2cd7b95cc042f8064fc01f4c18b04d5becc28e1c35f72e386e7c89ec5f0de781d30bf6 + languageName: node + linkType: hard + +"@changesets/errors@npm:^0.2.0": + version: 0.2.0 + resolution: "@changesets/errors@npm:0.2.0" + dependencies: + extendable-error: "npm:^0.1.5" + checksum: 10/4b79373f92287af4f723e8dbbccaf0299aa8735fc043243d0ad587f04a7614615ea50180be575d4438b9f00aa82d1cf85e902b77a55bdd3e0a8dd97e77b18c60 + languageName: node + linkType: hard + +"@changesets/get-dependents-graph@npm:^2.1.4": + version: 2.1.4 + resolution: "@changesets/get-dependents-graph@npm:2.1.4" + dependencies: + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + picocolors: "npm:^1.1.0" + semver: "npm:^7.5.3" + checksum: 10/4b4895a69a47315e286b365d68af00216e29cba0b1033374cc4b7db0ec75625dd829e9e54aecf2ca7131ba7cc50f1ff1f51beb79a901b6da845c310f85d94464 + languageName: node + linkType: hard + +"@changesets/get-release-plan@npm:^4.0.16": + version: 4.0.16 + resolution: "@changesets/get-release-plan@npm:4.0.16" + dependencies: + "@changesets/assemble-release-plan": "npm:^6.0.10" + "@changesets/config": "npm:^3.1.4" + "@changesets/pre": "npm:^2.0.2" + "@changesets/read": "npm:^0.6.7" + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + checksum: 10/bb19b1ed535071d0d706731c91f19f6e87f18f78e583fa1e4fb7ab944c166ce1be5aa5f70b31cc5178aee6155b214522e49e0fd44a74eab416f8524411e07be6 + languageName: node + linkType: hard + +"@changesets/get-version-range-type@npm:^0.4.0": + version: 0.4.0 + resolution: "@changesets/get-version-range-type@npm:0.4.0" + checksum: 10/9868e99b31af652d3fa08fc33d55b9636f2feed1f4efdb318a6dbb4bb061281868de089b93041ce7f2775ab9cf454b92b1199767d0f4f228d8bbc483e61d2fd8 + languageName: node + linkType: hard + +"@changesets/git@npm:^3.0.4": + version: 3.0.4 + resolution: "@changesets/git@npm:3.0.4" + dependencies: + "@changesets/errors": "npm:^0.2.0" + "@manypkg/get-packages": "npm:^1.1.3" + is-subdir: "npm:^1.1.1" + micromatch: "npm:^4.0.8" + spawndamnit: "npm:^3.0.1" + checksum: 10/4f5a1f3354ec39d530df78b198eaaf2a8ef6cca873dd18efb8706aae09cab04e0d985abd236288644fac5d10cc5cb6ba2538c3e0be023c4d80790ff841f39fa6 + languageName: node + linkType: hard + +"@changesets/logger@npm:^0.1.1": + version: 0.1.1 + resolution: "@changesets/logger@npm:0.1.1" + dependencies: + picocolors: "npm:^1.1.0" + checksum: 10/bbfc050ddd0afdaa95bb790e81894b7548a2def059deeaed1685e22c10ede245ec2264df42bb2200cc0c8bd040e427bcd68a7afcca2633dc263a28e923d7c175 + languageName: node + linkType: hard + +"@changesets/parse@npm:^0.4.3": + version: 0.4.3 + resolution: "@changesets/parse@npm:0.4.3" + dependencies: + "@changesets/types": "npm:^6.1.0" + js-yaml: "npm:^4.1.1" + checksum: 10/f5742266a4ecb90a8283868f2bec740ce7be94745dee7df0b2f47882775d700bdfa3b660c2ec8d06b64153cf9b02cb3d46064f391c62933c9c60a9570763f928 + languageName: node + linkType: hard + +"@changesets/pre@npm:^2.0.2": + version: 2.0.2 + resolution: "@changesets/pre@npm:2.0.2" + dependencies: + "@changesets/errors": "npm:^0.2.0" + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + fs-extra: "npm:^7.0.1" + checksum: 10/daaedd2747492ced61f107d38f90e535607bcb073b10ffac3d9e3bcad1a4cc082370884224fc6785af2d92d37f6b0a3bf853f9759b8fda294878d00d24344415 + languageName: node + linkType: hard + +"@changesets/read@npm:^0.6.7": + version: 0.6.7 + resolution: "@changesets/read@npm:0.6.7" + dependencies: + "@changesets/git": "npm:^3.0.4" + "@changesets/logger": "npm:^0.1.1" + "@changesets/parse": "npm:^0.4.3" + "@changesets/types": "npm:^6.1.0" + fs-extra: "npm:^7.0.1" + p-filter: "npm:^2.1.0" + picocolors: "npm:^1.1.0" + checksum: 10/6bf3fd4b0c743d2ef53cb39c4e52731622949a695f031412ff6ea9f30860620a1d9deb1cfd1af0c92d2e2d275b6d949c0cc1e83c192f2094e0071d690c48a42e + languageName: node + linkType: hard + +"@changesets/should-skip-package@npm:^0.1.2": + version: 0.1.2 + resolution: "@changesets/should-skip-package@npm:0.1.2" + dependencies: + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + checksum: 10/d09fcf1200ee201f0dd5b8049d90e8b5e0cfd34cc94f5c661c4cdab182a8263628733f9bc5886550a92f6f7857339d79fc77f12ffd53559b029a2bf9a2fa7ace + languageName: node + linkType: hard + +"@changesets/types@npm:^4.0.1": + version: 4.1.0 + resolution: "@changesets/types@npm:4.1.0" + checksum: 10/4d7c65a447400ac474b2dc2d79bc1a5341c305fbce4a648ef59d9939bc1bbbbd6852684c417a9a4ef0226468b9cb522b9ac2b5393f21fa5f20f1b12bee94eab5 + languageName: node + linkType: hard + +"@changesets/types@npm:^6.1.0": + version: 6.1.0 + resolution: "@changesets/types@npm:6.1.0" + checksum: 10/2dcd00712cb85d0c53afdd8d0e856b4bf9c0ce8dc36c838c918d44799aacd9ba8659b9ff610ff92b94fc03c8fd2b52c5b05418fcf8a1bd138cd9182414ede373 + languageName: node + linkType: hard + +"@changesets/write@npm:^0.4.0": + version: 0.4.0 + resolution: "@changesets/write@npm:0.4.0" + dependencies: + "@changesets/types": "npm:^6.1.0" + fs-extra: "npm:^7.0.1" + human-id: "npm:^4.1.1" + prettier: "npm:^2.7.1" + checksum: 10/bcea8431a09e282bdf66adbd8411d5d3cc19b4a2df519a42586c912b23a7b3ef18d1d0765e2d1a27ff175e2dfc9ef4c2df95cfa920dd4dd2972aaaf662afc6b9 + languageName: node + linkType: hard + +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: 10/9d226461c1e91e95f067be2bdc5e6f99cfe55a721f45afb44122e23e4b8602eeac4ff7325af6b5a369f36396ee1514d3809af3f57769066d80d83790d8e53339 + languageName: node + linkType: hard + +"@electric-sql/pglite@npm:^0.5.8": + version: 0.5.11 + resolution: "@electric-sql/pglite@npm:0.5.11" + checksum: 10/e352241196c929f5c69521f0b24ed354b3ecb6f71b18d3eb9e953b07bd6d509ca51825062ba331808d3c4fc1879b377e2a17e27e1c41dc80b25018f1d0bad6c6 + languageName: node + linkType: hard + +"@emnapi/core@npm:1.11.2": + version: 1.11.2 + resolution: "@emnapi/core@npm:1.11.2" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.2" + tslib: "npm:^2.4.0" + checksum: 10/b3e9693f79ca1d8bb90cb8a950150c7738f54eca0ae1849d3d5103a87ce4e388c2669fb253cc123d3449ad2ae12583435455dbdc0270b1e9efb0cfd502c952b4 + languageName: node + linkType: hard + +"@emnapi/core@npm:^1.5.0": + version: 1.11.3 + resolution: "@emnapi/core@npm:1.11.3" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.3" + tslib: "npm:^2.4.0" + checksum: 10/6ed871d5bbd0f6e25a09fe91583e886e4b90ae9344fa9292c78f0891b0b2a7d84899ea65a7d576450b9ac50440c698dad1907907e3d686ec9460ed876a9363a2 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.11.2": + version: 1.11.2 + resolution: "@emnapi/runtime@npm:1.11.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/280a219d3bf302615dabaaa248223b0e5fe9c49bacf0987dd958ca37ab425b62cf05287053cb188e711681418aaa5e447eaed6b62a0848c0a1303b2707864600 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.5.0": + version: 1.11.3 + resolution: "@emnapi/runtime@npm:1.11.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/ec834cc0fe248e06dd84f6dee10162133f8a692636189e99aa992303c791d4be1679536ee91aeee6661c4478609768cee9c085acd858caa92784c67acaab44a5 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.2": + version: 1.2.2 + resolution: "@emnapi/wasi-threads@npm:1.2.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/297fb6b1d89744bd0b41d5fec32bade05dc8dcf1f70eba86527226609fb3f6ad3fa96b3b2377b7449709715b3bd1569654c9def1dbbc85fb6b9cb0cff5bc5ebf + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.3": + version: 1.2.3 + resolution: "@emnapi/wasi-threads@npm:1.2.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/d9fef5c321a6df1988e813e0b621ed1e01d274c23d3028ff9511af97f8935adc921ae60a35167ccf4e0414fecc040b66b9b13458e7c00cfaad622457e1b03529 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/aix-ppc64@npm:0.28.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm64@npm:0.28.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm@npm:0.28.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-x64@npm:0.28.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-arm64@npm:0.28.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-x64@npm:0.28.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-arm64@npm:0.28.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-x64@npm:0.28.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm64@npm:0.28.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm@npm:0.28.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ia32@npm:0.28.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-loong64@npm:0.28.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-mips64el@npm:0.28.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ppc64@npm:0.28.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-riscv64@npm:0.28.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-s390x@npm:0.28.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-x64@npm:0.28.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-arm64@npm:0.28.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-x64@npm:0.28.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-arm64@npm:0.28.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-x64@npm:0.28.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openharmony-arm64@npm:0.28.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/sunos-x64@npm:0.28.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-arm64@npm:0.28.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-ia32@npm:0.28.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-x64@npm:0.28.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.9.1": + version: 4.10.1 + resolution: "@eslint-community/eslint-utils@npm:4.10.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10/61059b9f0192df5a86c441c03e0eedbda8c3810bb788775839afe4c5ec6bbdaa6433ac18001046b319390552435da3f6b8f5e18cca255993b3df37fe97a42b90 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10/049b280fddf71dd325514e0a520024969431dc3a8b02fa77476e6820e9122f28ab4c9168c11821f91a27982d2453bcd7a66193356ea84e84fb7c8d793be1ba0c + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 + languageName: node + linkType: hard + +"@inquirer/core@npm:^6.0.0": + version: 6.0.0 + resolution: "@inquirer/core@npm:6.0.0" + dependencies: + "@inquirer/type": "npm:^1.1.6" + "@types/mute-stream": "npm:^0.0.4" + "@types/node": "npm:^20.10.7" + "@types/wrap-ansi": "npm:^3.0.0" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + cli-spinners: "npm:^2.9.2" + cli-width: "npm:^4.1.0" + figures: "npm:^3.2.0" + mute-stream: "npm:^1.0.0" + run-async: "npm:^3.0.0" + signal-exit: "npm:^4.1.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + checksum: 10/a9f79fe538deab439afc845e16fa8832872b4562be6e39a5de8b50eca3e2b27be0e470fc4ee014f202a750213adc8a06068402d51d6d7b34b118b12b08200f85 + languageName: node + linkType: hard + +"@inquirer/external-editor@npm:^1.0.0, @inquirer/external-editor@npm:^1.0.2": + version: 1.0.3 + resolution: "@inquirer/external-editor@npm:1.0.3" + dependencies: + chardet: "npm:^2.1.1" + iconv-lite: "npm:^0.7.0" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/c95d7237a885b32031715089f92820525731d4d3c2bd7afdb826307dc296cc2b39e7a644b0bb265441963348cca42e7785feb29c3aaf18fd2b63131769bf6587 + languageName: node + linkType: hard + +"@inquirer/select@npm:1.3.3": + version: 1.3.3 + resolution: "@inquirer/select@npm:1.3.3" + dependencies: + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + figures: "npm:^3.2.0" + checksum: 10/0f33c51ab69c156b96092bfb107d08dd0f4227274917b9406aa23877e3ba94fd6738800fb973c44c051aaebdba72d07dc328df4b76e6e1285f68aa01a7ed0ed8 + languageName: node + linkType: hard + +"@inquirer/type@npm:^1.1.6": + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 10/bd3f3d7510785af4ad599e042e99e4be6380f52f79f3db140fe6fed0a605acf27b1a0a20fb5cc688eaf7b8aa0c36dacb1d89c7bba4586f38cbf58ba9f159e7b5 + languageName: node + linkType: hard + +"@internal/guided-tours@workspace:.": + version: 0.0.0-use.local + resolution: "@internal/guided-tours@workspace:." + dependencies: + "@backstage/cli": "npm:^0.36.7" + "@backstage/cli-defaults": "npm:^0.1.7" + "@backstage/e2e-test-utils": "npm:^0.1.2" + "@backstage/repo-tools": "npm:^0.19.2" + "@changesets/cli": "npm:^2.27.1" + knip: "npm:^5.27.4" + node-gyp: "npm:^10.0.0" + prettier: "npm:^2.3.2" + typescript: "npm:~5.8.0" + languageName: unknown + linkType: soft + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10/e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10/4412e9e6713c89c1e66d80bb0bb5a2a93192f10477623a27d08f228ba0316bb880affabc5bfe7f838f58a34d26c2c190da726e576cdfc18c49a72e89adabdcf5 + languageName: node + linkType: hard + +"@jest/create-cache-key-function@npm:^30.0.0": + version: 30.5.1 + resolution: "@jest/create-cache-key-function@npm:30.5.1" + dependencies: + "@jest/types": "npm:30.5.1" + checksum: 10/09ebb5965bf4b08019aa31dabd69e6ebff689888698fae5a6ce009e62c190cf71c17ac8e11354cfc486b4e1e37da042de51096c86e67ed763788d39f2eef7d9e + languageName: node + linkType: hard + +"@jest/pattern@npm:30.5.0": + version: 30.5.0 + resolution: "@jest/pattern@npm:30.5.0" + dependencies: + "@types/node": "npm:*" + jest-regex-util: "npm:30.5.0" + checksum: 10/3a4afb55901cb442ce15d70b46aa59f43c6f39055c92aafd8a3b7982df7a95a9403ed257da2a1585fe5f76df9dd45bdb44994d712994a3c6e6f3ff43e1f37c9b + languageName: node + linkType: hard + +"@jest/schemas@npm:30.5.0": + version: 30.5.0 + resolution: "@jest/schemas@npm:30.5.0" + dependencies: + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10/8b882db2f056f96f4ef82cafca6270cbc0ab3a6201cd76f43214bc17cc3e16df3e5a10ffc03e5667c2381c8141f7dd79f49d03cb85354b38c33c228c832408e5 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10/910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/types@npm:30.5.1": + version: 30.5.1 + resolution: "@jest/types@npm:30.5.1" + dependencies: + "@jest/pattern": "npm:30.5.0" + "@jest/schemas": "npm:30.5.0" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + "@types/istanbul-reports": "npm:^3.0.4" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.33" + chalk: "npm:^4.1.2" + checksum: 10/721d25d6a9f92d972feca03ec3b3a7200f7c1d12c30a91956fffc42516b80068291aa1e195f14dab8ffe56d73298edbe42a47e8924a1380ecf8acc0cc7a01e9d + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10/f74bf512fd09bbe2433a2ad460b04668b7075235eea9a0c77d6a42222c10a79b9747dc2b2a623f140ed40d6865a2ed8f538f3cbb75169120ea863f29a7ed76cd + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/902f8261dcf450b4af7b93f9656918e02eec80a2169e155000cb2059f90113dd98f3ccf6efc6072cee1dd84cac48cade51da236972d942babc40e4c23da4d62a + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/c2bb01856e65b506d439455f28aceacf130d6c023d1d4e3b48705e88def3571753e1a887daa04b078b562316c92d26ce36408a60534bceca3f830aec88a339ad + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10/847f1177d3d133a0966ef61ca29abea0d79788a0652f90ee1893b3da968c190b7e31c3534cc53701179dd6b14601eef3d78644e727e05b1a08c68d281aedc4ba + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.6.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.6.0" + checksum: 10/eb53fbf7eb4051302a599d6b91425f381168b2856f321336fb00852cea1e0c1904af2610c157b1535e94a61caa98f0bd068d1d0394dd46adf9e9c45c4e11af91 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.31": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/da0283270e691bdb5543806077548532791608e52386cfbbf3b9e8fb00457859d1bd01d512851161c886eb3a2f3ce6fd9bcf25db8edf3bddedd275bd4a88d606 + languageName: node + linkType: hard + +"@jsdevtools/ono@npm:^7.1.3": + version: 7.1.3 + resolution: "@jsdevtools/ono@npm:7.1.3" + checksum: 10/d4a036ccb9d2b21b7e4cec077c59a5a83fad58adacbce89e7e6b77a703050481ff5b6d813aef7f5ff0a8347a85a0eedf599e2e6bb5784a971a93e53e43b10157 + languageName: node + linkType: hard + +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.4.0 + resolution: "@jsep-plugin/assignment@npm:1.4.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10/8f6298159b10344684ecd128a4763bd8b8290ff6b947ea9e7cad8004d49b10ee7e9652a56b2873c83b71cb28619e61e6df8b38625400e782a10ae9a2a6945da5 + languageName: node + linkType: hard + +"@jsep-plugin/regex@npm:^1.0.1, @jsep-plugin/regex@npm:^1.0.4": + version: 1.1.0 + resolution: "@jsep-plugin/regex@npm:1.1.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10/cd7cd08360f7c76125583ab4a28026df1f6ccdc3c54ab192eaa3ed59e04f4dfbf2bfeb60df7c5fa56dae4c8c0a326bc862e5d07618f2f2a95f6d6613048d2a97 + languageName: node + linkType: hard + +"@jsep-plugin/ternary@npm:^1.0.2": + version: 1.2.0 + resolution: "@jsep-plugin/ternary@npm:1.2.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10/8286cba25b738770fc97b8b949eb87b9a5af771dd5d3f847a6fa5456ed5a9b632a2d775d6a5b60acd413f10667bd7934ff104eaab8a49f88ec5216776d2f12b2 + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/base64@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/ae44b0c4c83ecc5c0ee1911706a665e18e89d64a2b705cc458d7f6fc3c3c7db0e621261e978d02b74ded6a9fe1aafc8e708eb8a133e794a92bb033c50a0c4ccd + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10/d76bb58eff841c090d9bf69a073611ffa73c40a664ccbcea689f65961f57d7b24051269d06b437e4f6204285d6ba92f50f587c5e95c5f9e4f10b36a2ed4cd0c8 + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:17.67.0, @jsonjoy.com/buffers@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/buffers@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/6c8f6c4c73ec4ddab538a88be0bf72d8a934752755d43b0289fbe19ce9fa6123f082d1cd5ae179495e121a2f50267d26d36641f6dadedd8d5d2a2f980426e8ff + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" + peerDependencies: + tslib: 2 + checksum: 10/8ef4784d05c0fb4d0f27a1f78f5b0ae1f3b537d237f978d10be0b88f59a534ae44db2a4bde28eee0eb461ede31dc194aab5927ac001ed2b764629fa43ae9b60b + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/codegen@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/e2462836c708999d045c4a15099f12e721089a3731f0ad33da210559a52ed763b8bddbec3c181857341984ef12ea355290609f37f0dc6f8de1545c028090adf5 + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:^1.0.0": + version: 1.0.0 + resolution: "@jsonjoy.com/codegen@npm:1.0.0" + peerDependencies: + tslib: 2 + checksum: 10/a0afb03d2af4fbc1377c547e507f5db99a25f515d8c4b6b2cef1ff28145ac59fff12b6e1f41f9734cb62ea5619e7f9be1acd0908305d6f4176898ee534ee9a64 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-core@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-core@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/b321c8617810a118e83a7713271902502af1e125e1e0e051a9865b2429b9fa68f0f604712441dd0dd8fbc40c75374aed6d053c20a1c7902de758fcd91c476529 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-fsa@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-fsa@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.80.0" + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/6bb9c9892731d4736d01aa6df6214f311cbe0cced0e11bc9195ed269004a6164d75a92401d57f889fefcd93c13b1a86637eb71ea3aeb28eba36d6b09312f6d4a + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-builtins@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-node-builtins@npm:4.80.0" + peerDependencies: + tslib: 2 + checksum: 10/47043886cc5ca3456e6faebea6777833352193958a5ab285dba4c719fa3f9022c0c1d3edc3a7e9039a49c005da686a52b0e6a69779a99075a97bb2e6f2329dd1 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-to-fsa@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-fsa": "npm:4.80.0" + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + peerDependencies: + tslib: 2 + checksum: 10/42969e3972307961722dc3e088a5ebaf0edf0090a2d9e4e8d8357fc4e70774f497a0679b6dd30d7788c88e5545645a056d77dbc5557c06b38f2ef6b775313886 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-utils@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-node-utils@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + glob-to-regex.js: "npm:^1.3.1" + peerDependencies: + tslib: 2 + checksum: 10/5a6d521b6259effb9a75f1df7248134b91657654597e43b44b95587e916a8f7dd60ab1f231061819de7f1a3e236f1662638dc337040e29a5abb6df1e8828e7c5 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-node@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.80.0" + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + "@jsonjoy.com/fs-print": "npm:4.80.0" + "@jsonjoy.com/fs-snapshot": "npm:4.80.0" + glob-to-regex.js: "npm:^1.3.1" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/be0a5825e41258b6611a4de58ea668c795beabccc6faca5b114d04d265e45e0df84d5b8ae9740a510a866b083f402c24a709c31f6f0067b459368ccca29c9171 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-print@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-print@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/8a8c1ea8bfdced7e78f35a4f08b46bfc3e7cb758e4dafdeba744ab6eba9e6f5cb85788459c4d2aa3210426a57299498b5ca5de41a3dc6682a313be7fad2e184b + languageName: node + linkType: hard + +"@jsonjoy.com/fs-snapshot@npm:4.80.0": + version: 4.80.0 + resolution: "@jsonjoy.com/fs-snapshot@npm:4.80.0" + dependencies: + "@jsonjoy.com/buffers": "npm:^17.65.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + "@jsonjoy.com/json-pack": "npm:^17.65.0" + "@jsonjoy.com/util": "npm:^17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/923d3f0bd85ef1a53f108103d50df2af21c32ab84e9b661b6c2fb0f1e372c779dab4095b1c9fd5668bf534db6feb3a4d038ecb5cea202f2f5981b5a295480f74 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.2" + "@jsonjoy.com/buffers": "npm:^1.2.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/json-pointer": "npm:^1.0.2" + "@jsonjoy.com/util": "npm:^1.9.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/138b7eb8c96e6e435b0218c8f2eb5554e4eb49198a8718673a65e81da53b4617553ffa7124b51d6ea00fdfb868d6ff8b5ad6365e8336380ca7025f04d0412ee7 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pack@npm:17.67.0" + dependencies: + "@jsonjoy.com/base64": "npm:17.67.0" + "@jsonjoy.com/buffers": "npm:17.67.0" + "@jsonjoy.com/codegen": "npm:17.67.0" + "@jsonjoy.com/json-pointer": "npm:17.67.0" + "@jsonjoy.com/util": "npm:17.67.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/9ff4403862e49433fe607175e90af749d64902640d63919ba559e5748d1a3db60d7366cc3b84dcc4a57ad478540e5eecb22fed80766e293482a0ab8e583b1b0b + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pointer@npm:17.67.0" + dependencies: + "@jsonjoy.com/util": "npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/5a27c6b5b1276d357cfc3e8a05112d6305ccd17bf672190f25dfac2f4108ced170e784451d64728f60f93305c0007e3f832ddd175b8a47f3eb652cbabcec31ad + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" + dependencies: + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/util": "npm:^1.9.0" + peerDependencies: + tslib: 2 + checksum: 10/f22baeb3abc8ace2d8902d06ec297343431d4486dcf399aaaffd26ace7e62e194fe0efb4b7880e45b3b7939224ee838d3213448ef654fc8a61c91a76fe994d94 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:17.67.0, @jsonjoy.com/util@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/util@npm:17.67.0" + dependencies: + "@jsonjoy.com/buffers": "npm:17.67.0" + "@jsonjoy.com/codegen": "npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/b0facf65c3190d6ed1ada7e5b7679d80fa5da73bfbd02f2bb2f3af1c28c0d854b6ee2350824313b7ba82c0e5191da94903b4af61255bc232dbb7feedd2f31e0c + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.9.0": + version: 1.9.0 + resolution: "@jsonjoy.com/util@npm:1.9.0" + dependencies: + "@jsonjoy.com/buffers": "npm:^1.0.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + peerDependencies: + tslib: 2 + checksum: 10/1a6e5301d725a7161b93ff707eb1a954bf4552a2fa96eee9a960d3ae3ed5f993d18b56dcff29e98036341a5968c5d1b2dfe21f76695390e7f0d89b81f24c85e0 + languageName: node + linkType: hard + +"@leichtgewicht/ip-codec@npm:^2.0.1": + version: 2.0.5 + resolution: "@leichtgewicht/ip-codec@npm:2.0.5" + checksum: 10/cb98c608392abe59457a14e00134e7dfa57c0c9b459871730cd4e907bb12b834cbd03e08ad8663fea9e486f260da7f1293ccd9af0376bf5524dd8536192f248c + languageName: node + linkType: hard + +"@lukeed/csprng@npm:^1.0.0": + version: 1.1.0 + resolution: "@lukeed/csprng@npm:1.1.0" + checksum: 10/926f5f7fc629470ca9a8af355bfcd0271d34535f7be3890f69902432bddc3262029bb5dbe9025542cf6c9883d878692eef2815fc2f3ba5b92e9da1f9eba2e51b + languageName: node + linkType: hard + +"@manypkg/find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "@manypkg/find-root@npm:1.1.0" + dependencies: + "@babel/runtime": "npm:^7.5.5" + "@types/node": "npm:^12.7.1" + find-up: "npm:^4.1.0" + fs-extra: "npm:^8.1.0" + checksum: 10/31e7dde82612a0e37ebb07876d76b1bf2aedc5b285b5e50d94cdf63edbf1fa3970349b84a5837a3c687e5b643e9a4f4588ae1f4b4ae9d412516d57bf977a08db + languageName: node + linkType: hard + +"@manypkg/get-packages@npm:^1.1.3": + version: 1.1.3 + resolution: "@manypkg/get-packages@npm:1.1.3" + dependencies: + "@babel/runtime": "npm:^7.5.5" + "@changesets/types": "npm:^4.0.1" + "@manypkg/find-root": "npm:^1.1.0" + fs-extra: "npm:^8.1.0" + globby: "npm:^11.0.0" + read-yaml-file: "npm:^1.1.0" + checksum: 10/4912e002199ff3974ec48586376a04c5f1815a4faa5f4d36b0698838eec143c9d4e3d42c41e0de009f48a1e2251802ed63c1311ab44de225b50102f85919a248 + languageName: node + linkType: hard + +"@microsoft/api-documenter@npm:^7.28.1": + version: 7.30.18 + resolution: "@microsoft/api-documenter@npm:7.30.18" + dependencies: + "@microsoft/api-extractor-model": "npm:7.33.15" + "@microsoft/tsdoc": "npm:~0.17.0" + "@rushstack/node-core-library": "npm:5.25.1" + "@rushstack/terminal": "npm:0.24.7" + "@rushstack/ts-command-line": "npm:5.3.17" + js-yaml: "npm:~4.3.2" + resolve: "npm:~1.22.1" + bin: + api-documenter: bin/api-documenter + checksum: 10/01038a700070832f326ffed0f825eadd2226a63ea92a110dd6fd21aa073937647dcba9872a6d30d4053e0c0514a00f46bb983b5336a47422950867812cbe27cd + languageName: node + linkType: hard + +"@microsoft/api-extractor-model@npm:7.33.15": + version: 7.33.15 + resolution: "@microsoft/api-extractor-model@npm:7.33.15" + dependencies: + "@microsoft/tsdoc": "npm:~0.17.0" + "@microsoft/tsdoc-config": "npm:~0.18.2" + "@rushstack/node-core-library": "npm:5.25.1" + checksum: 10/bbcbe04726f661bd4f1e5833740d10b83eb1ee1b8306c6243e4042cdc01255f0a10329eb7cfc1072abe10b261a29c4550d67a70c43204d431b8ec3485dde172e + languageName: node + linkType: hard + +"@microsoft/api-extractor@npm:^7.57.3": + version: 7.59.4 + resolution: "@microsoft/api-extractor@npm:7.59.4" + dependencies: + "@microsoft/api-extractor-model": "npm:7.33.15" + "@microsoft/tsdoc": "npm:~0.17.0" + "@microsoft/tsdoc-config": "npm:~0.18.2" + "@rushstack/node-core-library": "npm:5.25.1" + "@rushstack/rig-package": "npm:0.7.4" + "@rushstack/terminal": "npm:0.24.7" + "@rushstack/ts-command-line": "npm:5.3.17" + diff: "npm:~8.0.2" + minimatch: "npm:10.2.3" + resolve: "npm:~1.22.1" + semver: "npm:~7.7.4" + source-map: "npm:~0.6.1" + typescript: "npm:5.9.3" + bin: + api-extractor: bin/api-extractor + checksum: 10/d840e070d02548bc068fa10c4b99cc2352070797689631eb182ab27f1df478590b2e9443bddd6d777887e012742a697d20b823cfce48b83dc38f52ac2744f2c7 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:~0.18.2": + version: 0.18.3 + resolution: "@microsoft/tsdoc-config@npm:0.18.3" + dependencies: + "@microsoft/tsdoc": "npm:0.17.1" + ajv: "npm:~8.18.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.2" + checksum: 10/2a264f8d6207d9de43fc95673c96201b0990eb4ef6f9c0e7d433de669ce72d7ce5460ee6b74e4fbd3b359b7f40f2294b910663fe109cc818c5331606272b8ab9 + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.17.1, @microsoft/tsdoc@npm:~0.17.0": + version: 0.17.1 + resolution: "@microsoft/tsdoc@npm:0.17.1" + checksum: 10/b028f2c69256077589c6c01ab6782787136e1382e37769bceaa478c6be02824054c8cf9c38a03ef441d8b78cdb50cd1b57c3fa55094efbdb5d2d4dc0a9177eda + languageName: node + linkType: hard + +"@module-federation/bridge-react-webpack-plugin@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/bridge-react-webpack-plugin@npm:2.8.2" + dependencies: + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/b0b2c44c4223c09b668770a54dd22606ac1080a957d5243e0989ef35b8a81a6380e63f7a08ac434cd292dd303dc114b083385454bb11240b2aede7c15dd0f496 + languageName: node + linkType: hard + +"@module-federation/cli@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/cli@npm:2.8.2" + dependencies: + "@module-federation/dts-plugin": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + commander: "npm:11.1.0" + jiti: "npm:2.4.2" + bin: + mf: bin/mf.js + checksum: 10/08fe421786df31230bd490af04fc3d8efb837f9ddec9b22e8be8a9bfecc5f82f757bb0b44d4ef0e3a77ced7d6a5488d47a4017eafabaf5efce74db62aa706e78 + languageName: node + linkType: hard + +"@module-federation/dts-plugin@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/dts-plugin@npm:2.8.2" + dependencies: + "@module-federation/error-codes": "npm:2.8.2" + "@module-federation/managers": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + "@module-federation/third-party-dts-extractor": "npm:2.8.2" + adm-zip: "npm:0.6.0" + isomorphic-ws: "npm:5.0.0" + undici: "npm:7.29.0" + ws: "npm:8.21.0" + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + vue-tsc: + optional: true + checksum: 10/f326d9c8f14bf4aec6c41aec6bcbe064fb912fbbb008f980d6993e9796497aae13eb0fce877486bff32abdc757425bc0685ce68b4920d9a1553b64b1300fb1c8 + languageName: node + linkType: hard + +"@module-federation/enhanced@npm:~2.8.2": + version: 2.8.2 + resolution: "@module-federation/enhanced@npm:2.8.2" + dependencies: + "@module-federation/bridge-react-webpack-plugin": "npm:2.8.2" + "@module-federation/cli": "npm:2.8.2" + "@module-federation/dts-plugin": "npm:2.8.2" + "@module-federation/error-codes": "npm:2.8.2" + "@module-federation/inject-external-runtime-core-plugin": "npm:2.8.2" + "@module-federation/managers": "npm:2.8.2" + "@module-federation/manifest": "npm:2.8.2" + "@module-federation/rspack": "npm:2.8.2" + "@module-federation/runtime-tools": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + "@module-federation/webpack-bundler-runtime": "npm:2.8.2" + schema-utils: "npm:4.3.0" + tapable: "npm:2.3.0" + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vue-tsc: ">=1.0.24" + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + bin: + mf: bin/mf.js + checksum: 10/41ea5399e551796c9d69f0680a1391b632e3d9ef4424a25802b57cce1758bb9f3d15f5becaca6e86d1d42e0df952f9eff0a6ec6c34d4c42402a3895b2ca246d1 + languageName: node + linkType: hard + +"@module-federation/error-codes@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/error-codes@npm:0.22.0" + checksum: 10/4edb269e9f3039899f879788c84d2bfecff94ca8e87ffcd80dbf8589d8543ec32558b3fa05c8549a8abd3ac33e856ff2aacf458dea5c0d7bea608bf12bb13359 + languageName: node + linkType: hard + +"@module-federation/error-codes@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/error-codes@npm:2.8.2" + checksum: 10/81d70499d6855d0779023778f8b7e0c9175453172ca27c382f9d4fd51f17391db48c0747f0946a0dc22d5f9b3ecc4e5d0baddfa696242f7e5e09c4e388d7e166 + languageName: node + linkType: hard + +"@module-federation/inject-external-runtime-core-plugin@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/inject-external-runtime-core-plugin@npm:2.8.2" + peerDependencies: + "@module-federation/runtime-tools": 2.8.2 + checksum: 10/a997a47f17316efa74fb6d365b773e669cf3c83c94f0a6fe4804b3246a4b1b1b368374a49b9a3e99f1e09a2474879472571282dc5e0c1f9f4744d15bce832577 + languageName: node + linkType: hard + +"@module-federation/managers@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/managers@npm:2.8.2" + dependencies: + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/abf7ec3231125d7134faeae7395a9d9da4a1e5bc843e104666e30cd2f061c1c3afe9c2c34e7d547954164cd9ba9e24dbc29cfc08babd3dccd0a04d7e5f4758dd + languageName: node + linkType: hard + +"@module-federation/manifest@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/manifest@npm:2.8.2" + dependencies: + "@module-federation/dts-plugin": "npm:2.8.2" + "@module-federation/managers": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/f6792351664b74e9195b4d966250faa46277d779bfdf2ba4c8903e7f47bb03c98c47a0707b174cc07a1029a023bc462ee293ba14cf641df670c955d3271a494c + languageName: node + linkType: hard + +"@module-federation/rspack@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/rspack@npm:2.8.2" + dependencies: + "@module-federation/bridge-react-webpack-plugin": "npm:2.8.2" + "@module-federation/dts-plugin": "npm:2.8.2" + "@module-federation/inject-external-runtime-core-plugin": "npm:2.8.2" + "@module-federation/managers": "npm:2.8.2" + "@module-federation/manifest": "npm:2.8.2" + "@module-federation/runtime-tools": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + peerDependencies: + "@rspack/core": ^0.7.0 || ^1.0.0 || ^2.0.0-0 + typescript: ^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + checksum: 10/cccce9839770c79989157d7f69f830d8ed737c81b20f27f41391271d917e6674b0f3753417385524024c0544e0a53fecc9eef8eaeada3740b280c6da9c64ca7f + languageName: node + linkType: hard + +"@module-federation/runtime-core@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime-core@npm:0.22.0" + dependencies: + "@module-federation/error-codes": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/d21969198322b6f79e0513b702d0af5097613d47819724c849b6c677c163cd10fb8c89e3ff62b798bec498ee4d8e95dec71861071bc4ed74bd86a7e43193bc05 + languageName: node + linkType: hard + +"@module-federation/runtime-core@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/runtime-core@npm:2.8.2" + dependencies: + "@module-federation/error-codes": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/7899271733facc96351001eee107cd41c684ea0602cf772596e7043b38201d665926fc6a4e7a5b7a3dd99eea6f6e06c60bbd229b557a6bb70f53027228a0636d + languageName: node + linkType: hard + +"@module-federation/runtime-tools@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime-tools@npm:0.22.0" + dependencies: + "@module-federation/runtime": "npm:0.22.0" + "@module-federation/webpack-bundler-runtime": "npm:0.22.0" + checksum: 10/0e7693c1ec02fc5bef770b478c8757cad9cfefb2310d1943151d0ad079b72472d9b2c8a087299e9124dfcd6b649c83290c7fdfa333865baab4ba193f39e7b6bd + languageName: node + linkType: hard + +"@module-federation/runtime-tools@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/runtime-tools@npm:2.8.2" + dependencies: + "@module-federation/runtime": "npm:2.8.2" + "@module-federation/webpack-bundler-runtime": "npm:2.8.2" + checksum: 10/b1af8d2a3339696b27e2f9c2325f598c9d0676a737c225203adb3c77024ba0b1e2ea38d88b76b8e00ee5fdcc4395040ec698c714c09708c3d0c468a367e280c7 + languageName: node + linkType: hard + +"@module-federation/runtime@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime@npm:0.22.0" + dependencies: + "@module-federation/error-codes": "npm:0.22.0" + "@module-federation/runtime-core": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/eca608be999d7d2e83abc1169643c2f795a5ed950f9e2bdf7000400a30b3e1e0ca4bdaa5daa09f55e44868383d444707e40236cec1aaa7b40432b0cce800b7f3 + languageName: node + linkType: hard + +"@module-federation/runtime@npm:2.8.2, @module-federation/runtime@npm:~2.8.2": + version: 2.8.2 + resolution: "@module-federation/runtime@npm:2.8.2" + dependencies: + "@module-federation/error-codes": "npm:2.8.2" + "@module-federation/runtime-core": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/356ef46ffcaf173efdfbe82ed14f7f94a20d961c97c058580f455503ee4003fd69a9a67e7387b92ad600569fa659d808e9867ae2b370789cb4e781b9072c516c + languageName: node + linkType: hard + +"@module-federation/sdk@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/sdk@npm:0.22.0" + checksum: 10/d7085d883730a33145052520787a7e59cf9c54b51b2946bebc7c63a6bb668bcc6cbdc27fa0b7354a62f5a7ee4e8829a66b84e644607498f2e37cfd5eb4ded0da + languageName: node + linkType: hard + +"@module-federation/sdk@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/sdk@npm:2.8.2" + checksum: 10/11dd8653499e702d74dcea03352267cbd39d82aa2a429186ef15912f98fe719ccf7a7f63d4ececce8f7a3d3df73903991feeb80fe45a65016bcf733697215ffa + languageName: node + linkType: hard + +"@module-federation/third-party-dts-extractor@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/third-party-dts-extractor@npm:2.8.2" + checksum: 10/8db40f3fc73dfcb2e0d6412c79c386a697b1ff6ef25b85e425bbfa22597dcd0235122de7ac035096b0d7572c43f462024bd63ca4e5f4db1fbaafb0a87ee3e8f2 + languageName: node + linkType: hard + +"@module-federation/webpack-bundler-runtime@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.22.0" + dependencies: + "@module-federation/runtime": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/afd24406817dfc6474ebcf5be714ccf26690eb3f6f5172bda711c8f23dba149fe47293f7aa2d0733dfed0334c98d4d3d9e7c2da2be78750cae5a72d72f32ce93 + languageName: node + linkType: hard + +"@module-federation/webpack-bundler-runtime@npm:2.8.2": + version: 2.8.2 + resolution: "@module-federation/webpack-bundler-runtime@npm:2.8.2" + dependencies: + "@module-federation/error-codes": "npm:2.8.2" + "@module-federation/runtime": "npm:2.8.2" + "@module-federation/sdk": "npm:2.8.2" + checksum: 10/63474c6057af511d9af77f5896a772e34ba03a7c00c147a5abe654d9c3a1fef3573723535e45a2dcacb417a9b06b2a59538d8fedcc634e349338761e087f04b6 + languageName: node + linkType: hard + +"@napi-rs/lzma-linux-x64-gnu@npm:1.5.1": + version: 1.5.1 + resolution: "@napi-rs/lzma-linux-x64-gnu@npm:1.5.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:1.0.7": + version: 1.0.7 + resolution: "@napi-rs/wasm-runtime@npm:1.0.7" + dependencies: + "@emnapi/core": "npm:^1.5.0" + "@emnapi/runtime": "npm:^1.5.0" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10/6bc32d32d486d07b83220a9b7b2b715e39acacbacef0011ebca05c00b41d80a0535123da10fea7a7d6d7e206712bb50dc50ac3cf88b770754d44378570fb5c05 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^1.1.6": + version: 1.2.5 + resolution: "@napi-rs/wasm-runtime@npm:1.2.5" + dependencies: + "@tybys/wasm-util": "npm:^0.10.3" + peerDependencies: + "@emnapi/core": ^1.7.1 || ^2.0.0-alpha.4 + "@emnapi/runtime": ^1.7.1 || ^2.0.0-alpha.4 + checksum: 10/b8367e6d47ff12b429efeefdfe42e316e920ca2fa4478d7bb926c50d101be43302084c89a519cb54d0ca1719d798b64e7d579dc2df8448d311aae999f44dfdd7 + languageName: node + linkType: hard + +"@nestjs/axios@npm:4.0.1": + version: 4.0.1 + resolution: "@nestjs/axios@npm:4.0.1" + peerDependencies: + "@nestjs/common": ^10.0.0 || ^11.0.0 + axios: ^1.3.1 + rxjs: ^7.0.0 + checksum: 10/0cc741e4fbfc39920afbb6c58050e0dbfecc8e2f7b249d879802a5b03b65df3714e828970e2bf12283d3d27e1f1ab7ca5ec62b5698dc50f105680e100a0a33f6 + languageName: node + linkType: hard + +"@nestjs/common@npm:11.2.3": + version: 11.2.3 + resolution: "@nestjs/common@npm:11.2.3" + dependencies: + file-type: "npm:21.3.4" + iterare: "npm:1.2.1" + load-esm: "npm:1.0.3" + tslib: "npm:2.8.1" + uid: "npm:2.0.2" + peerDependencies: + class-transformer: ">=0.4.1" + class-validator: ">=0.13.2" + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + checksum: 10/f1247e62279b5ceb4273ecfed07b883862683665b44a86baac5411bb8193586387e872f4e87fdb439eefc5ec87eba46bf23cbc1b89f22bb67f4b7c2d80a578d5 + languageName: node + linkType: hard + +"@nestjs/core@npm:11.2.3": + version: 11.2.3 + resolution: "@nestjs/core@npm:11.2.3" + dependencies: + fast-safe-stringify: "npm:2.1.1" + iterare: "npm:1.2.1" + path-to-regexp: "npm:8.4.2" + tslib: "npm:2.8.1" + uid: "npm:2.0.2" + peerDependencies: + "@nestjs/common": ^11.0.0 + "@nestjs/microservices": ^11.0.0 + "@nestjs/platform-express": ^11.0.0 + "@nestjs/websockets": ^11.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + "@nestjs/microservices": + optional: true + "@nestjs/platform-express": + optional: true + "@nestjs/websockets": + optional: true + checksum: 10/6e744ec2e77d79b0541edb8ebd7061d8ead42e8e61e7778dd033990390c31218984d9bb3ad300ad231d3e909554328a7a1edc826bfb9c13357f1a21f2c8c3591 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.8.0": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: 10/474b7f56bc6fb2d5b3a42132561e221b0ea4f91e590f4655312ca13667840896b34195e2b53b7f097ec080a1fdd3b58d902c2a8d0fbdf51d2e238b53808a177e + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10/96fc0036b101bae5032dc2a4cd832efb815ce9b33f9ee2f29909ee49d96a0026b3565f73c507a69eb8603f5cb32e0ae45a70cab1e2655990a4e06ae99f7f572a + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/1e0e04087049b24b38bc0b30d87a9388ee3ca1d3fdfc347c2f77d84fcfe6a51f250bc57ba2c1f614d7e4285c6c62bf8c769bc19aa0949ea39e5b043ee023b0bd + languageName: node + linkType: hard + +"@nuxtjs/opencollective@npm:0.3.2": + version: 0.3.2 + resolution: "@nuxtjs/opencollective@npm:0.3.2" + dependencies: + chalk: "npm:^4.1.0" + consola: "npm:^2.15.0" + node-fetch: "npm:^2.6.1" + bin: + opencollective: bin/opencollective.js + checksum: 10/0512871f424a2eae41e9385671ac840f28e8508a209df68c363cc97e009b95a6fd4bdfa2a34c9df78a74fa36d7e171e28792cd11da0b2be28c20ee1806b3ea5e + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^9.0.6": + version: 9.0.6 + resolution: "@octokit/endpoint@npm:9.0.6" + dependencies: + "@octokit/types": "npm:^13.1.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/2bf776423365ee926bf3f722a664e52f1070758eff4a176279fb132103fd0c76e3541f83ace49bbad9a64f9c9b8de453be565ca8d6136989e9514dea65380ecf + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^24.2.0": + version: 24.2.0 + resolution: "@octokit/openapi-types@npm:24.2.0" + checksum: 10/000897ebc6e247c2591049d6081e95eb5636f73798dadd695ee6048496772b58065df88823e74a760201828545a7ac601dd3c1bcd2e00079a62a9ee9d389409c + languageName: node + linkType: hard + +"@octokit/request-error@npm:^5.1.1": + version: 5.1.1 + resolution: "@octokit/request-error@npm:5.1.1" + dependencies: + "@octokit/types": "npm:^13.1.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10/6ad98626407ba57bb33fa197611be74bee1dd9abc8d5d845648d6a2a04aa6840c0eb7f4be341d55dfcab5bc19181ad5fd25194869a7aaac6245f74b3a14d9662 + languageName: node + linkType: hard + +"@octokit/request@npm:^8.0.0": + version: 8.4.1 + resolution: "@octokit/request@npm:8.4.1" + dependencies: + "@octokit/endpoint": "npm:^9.0.6" + "@octokit/request-error": "npm:^5.1.1" + "@octokit/types": "npm:^13.1.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/2b2c9131cc9b608baeeef8ce2943768cc9db5fbe36a665f734a099bd921561c760e4391fbdf39d5aefb725db26742db1488c65624940ef7cec522e10863caa5e + languageName: node + linkType: hard + +"@octokit/types@npm:^13.1.0": + version: 13.10.0 + resolution: "@octokit/types@npm:13.10.0" + dependencies: + "@octokit/openapi-types": "npm:^24.2.0" + checksum: 10/32f8f5010d7faae128b0cdd0c221f0ca8c3781fe44483ecd87162b3da507db667f7369acda81340f6e2c9c374d9a938803409c6085c2c01d98210b6c58efb99a + languageName: node + linkType: hard + +"@openapitools/openapi-generator-cli@npm:^2.41.0": + version: 2.42.0 + resolution: "@openapitools/openapi-generator-cli@npm:2.42.0" + dependencies: + "@inquirer/select": "npm:1.3.3" + "@nestjs/axios": "npm:4.0.1" + "@nestjs/common": "npm:11.2.3" + "@nestjs/core": "npm:11.2.3" + "@nuxtjs/opencollective": "npm:0.3.2" + axios: "npm:^1.20.0" + chalk: "npm:4.1.2" + commander: "npm:8.3.0" + compare-versions: "npm:6.1.1" + concurrently: "npm:^10.0.5" + console.table: "npm:0.10.0" + fs-extra: "npm:11.4.0" + glob: "npm:13.0.6" + proxy-agent: "npm:8.0.2" + reflect-metadata: "npm:0.2.2" + rxjs: "npm:7.8.2" + tslib: "npm:2.8.1" + bin: + openapi-generator-cli: main.js + checksum: 10/f91a7b3f9807c4258003b03c6fbcee722e01f0dd8c28ce3f7801f9d7eaa9d1ae051510a1b339f2b489386729f51fe7d31b8f1a73ae30c58b599452113dff3756 + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm-eabi@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.24.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm64@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.24.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-arm64@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.24.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.24.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.24.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.24.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.24.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.24.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.24.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.24.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.24.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.24.2" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.24.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.24.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.24.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-openharmony-arm64@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.24.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.24.2" + dependencies: + "@emnapi/core": "npm:1.11.2" + "@emnapi/runtime": "npm:1.11.2" + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.24.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:11.24.2": + version: 11.24.2 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.24.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@peculiar/asn1-cms@npm:^2.11.0, @peculiar/asn1-cms@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-cms@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + "@peculiar/asn1-x509-attr": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/97a3f04e4c8d4f49d8014475edd74a9f4e808507882683c72752dba0e54fbdc21f8b0a271b7cbaf7e954a46e5f77d2572fa0fbb9b3c858c8046cd97bdbc7fcc2 + languageName: node + linkType: hard + +"@peculiar/asn1-csr@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-csr@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/6378b9f69d19674d9efa40517518d29cee48e43718c216f70237ee561894c520b1339c92a4a6b53e67187faf776541b95f88542474d2ec427b1297392b26a093 + languageName: node + linkType: hard + +"@peculiar/asn1-ecc@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-ecc@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/47c685b8020e97e758250322cdac263c9991dc27a812a0019d283ab66e9968e1a8b446891aa8ae2e90023008ee093cbe5160f3e5c73efc03e2f3f059bee7490e + languageName: node + linkType: hard + +"@peculiar/asn1-pfx@npm:^2.11.0": + version: 2.11.0 + resolution: "@peculiar/asn1-pfx@npm:2.11.0" + dependencies: + "@peculiar/asn1-cms": "npm:^2.11.0" + "@peculiar/asn1-pkcs8": "npm:^2.11.0" + "@peculiar/asn1-rsa": "npm:^2.11.0" + "@peculiar/asn1-schema": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/f1b4b6c366a45f1cffc14917f594ef04faa2f2e2105580dca4e044cc632597de7b4a540408f66fa2991834cf8817b4f3ce8cd77dd31271b6ed4b5f81f2618089 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs8@npm:^2.11.0": + version: 2.11.0 + resolution: "@peculiar/asn1-pkcs8@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/e21a4b5889d8f9b2e9c77026d331ef87ecd9ad2a00de342a4d04398871a5e68971dcf4871608fa8fe2a91166f36b23a68b5f401053dbe6bf3b82b096dbd66af4 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs9@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-pkcs9@npm:2.11.0" + dependencies: + "@peculiar/asn1-cms": "npm:^2.11.0" + "@peculiar/asn1-pfx": "npm:^2.11.0" + "@peculiar/asn1-pkcs8": "npm:^2.11.0" + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + "@peculiar/asn1-x509-attr": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/bd7a70a48af9ea82c1305c3320274ed51f3184f2a872915551c0aa2ad365e834c46c3fb4a85033475eb3abfb39296cf6f0e3e49ee0930a00820bc372394f377e + languageName: node + linkType: hard + +"@peculiar/asn1-rsa@npm:^2.11.0, @peculiar/asn1-rsa@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-rsa@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/331fded14d222c493d00ab9610e43bf6fb19ddacb267bd5add9fea156ef9fa753af5ea15f39fb5dd00fa6d6a82d29b66d5333bc02c20639a15fc365502b894cf + languageName: node + linkType: hard + +"@peculiar/asn1-schema@npm:^2.11.0, @peculiar/asn1-schema@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-schema@npm:2.11.0" + dependencies: + "@peculiar/utils": "npm:^2.0.2" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/4e0c166f53de47e735bc409c2ce520b0307267d91fe17e6a0b489b32d4f1831f54e617ffdf14220e5f2d610f72da6c1df94772356d5dfcc33f89086dbcd8c9e8 + languageName: node + linkType: hard + +"@peculiar/asn1-x509-attr@npm:^2.11.0": + version: 2.11.0 + resolution: "@peculiar/asn1-x509-attr@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/asn1-x509": "npm:^2.11.0" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/5e9a3b3f0058d57db0f362107bcc7ae39d3319d54eccc06fd946577fdfc613437fb82808fccf65db2cdd35ef5b23e5b2786ad0170c11f5ebe67260f5028db8f0 + languageName: node + linkType: hard + +"@peculiar/asn1-x509@npm:^2.11.0, @peculiar/asn1-x509@npm:^2.6.0": + version: 2.11.0 + resolution: "@peculiar/asn1-x509@npm:2.11.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.11.0" + "@peculiar/utils": "npm:^2.0.2" + asn1js: "npm:^3.0.10" + tslib: "npm:^2.8.1" + checksum: 10/8e72a608f67f5c8e3d551d9df00f4d08e372297eb43ffe7e7c071c35df0ea06ff6aca88e4179470e7b4a7db813de024024daa1e5f7180ef317603de924eb33c8 + languageName: node + linkType: hard + +"@peculiar/utils@npm:^2.0.2": + version: 2.0.3 + resolution: "@peculiar/utils@npm:2.0.3" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10/e6b212db06e15f0ffa33482336f0e41108ce2d95fa69fa2c6f001120df1056404dc007b62bc6c90cc58d743f0cf4b23bfff89cdb8c121415d36ff0f9d60aead2 + languageName: node + linkType: hard + +"@peculiar/x509@npm:^1.14.2": + version: 1.14.3 + resolution: "@peculiar/x509@npm:1.14.3" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-csr": "npm:^2.6.0" + "@peculiar/asn1-ecc": "npm:^2.6.0" + "@peculiar/asn1-pkcs9": "npm:^2.6.0" + "@peculiar/asn1-rsa": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + pvtsutils: "npm:^1.3.6" + reflect-metadata: "npm:^0.2.2" + tslib: "npm:^2.8.1" + tsyringe: "npm:^4.10.0" + checksum: 10/d37c56fa5f2c644141948d85010e14f0e4963089e3b0b81edd0bfe85bdfea0eb3f38ab6ff20d322db2bd6977117824cc498a77b2d35af111983b4d58b5e2ccd1 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@pmmmwh/react-refresh-webpack-plugin@npm:^0.6.0": + version: 0.6.3 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.6.3" + dependencies: + anser: "npm:^2.1.1" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + schema-utils: "npm:^4.2.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <6.0.0" + webpack: ^5.0.0 + webpack-dev-server: ^4.8.0 || 5.x || 6.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10/fc357103a822c22312d5521f601ab88606b6207ff40f3d748a2e74c1e58841b467ceb20120f57cba6385325559d99db0311ee179ffc70a463bf4ce45511c3321 + languageName: node + linkType: hard + +"@prettier/sync@npm:^0.6.1": + version: 0.6.1 + resolution: "@prettier/sync@npm:0.6.1" + dependencies: + make-synchronized: "npm:^0.8.0" + peerDependencies: + prettier: "*" + checksum: 10/2c53cd4ee718e2ebd2fb31aa5ec4773f743b9c29fcc6db6794dc3553bc87aa8fe7db47b51add6809cab655520b7550329d1cce2ca837f6f4643991eff44abad1 + languageName: node + linkType: hard + +"@rollup/plugin-commonjs@npm:^26.0.0": + version: 26.0.3 + resolution: "@rollup/plugin-commonjs@npm:26.0.3" + dependencies: + "@rollup/pluginutils": "npm:^5.0.1" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.2" + glob: "npm:^10.4.1" + is-reference: "npm:1.2.1" + magic-string: "npm:^0.30.3" + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/e7443025339c047e32572c30e248958bead86d2ea993d5db006f3df12df06e9676ed13c38884b5f63bb4f5c8fc979875841909a6fe410f980488ae80d456e711 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.0.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/cc018d20c80242a2b8b44fae61a968049cf31bb8406218187cc7cda35747616594e79452dd65722e7da6dd825b392e90d4599d43cd4461a02fefa2865945164e + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^15.0.0": + version: 15.3.1 + resolution: "@rollup/plugin-node-resolve@npm:15.3.1" + dependencies: + "@rollup/pluginutils": "npm:^5.0.1" + "@types/resolve": "npm:1.20.2" + deepmerge: "npm:^4.2.2" + is-module: "npm:^1.0.0" + resolve: "npm:^1.22.1" + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/874494c0daca8fb0d633a237dd9df0d30609b374326e57508710f2b6d7ddaa93d203d8daa0257960b2b6723f56dfec1177573126f31ff9604700303b6f5fdbe3 + languageName: node + linkType: hard + +"@rollup/plugin-yaml@npm:^4.0.0": + version: 4.1.2 + resolution: "@rollup/plugin-yaml@npm:4.1.2" + dependencies: + "@rollup/pluginutils": "npm:^5.0.1" + js-yaml: "npm:^4.1.0" + tosource: "npm:^2.0.0-alpha.3" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/a044bb4568a10712465553ea5f31c13a2b7bc371a7f8382014e6b8048c0a264f5645f83f4d70ce9ab46b75117b94cdc032b597e9315fd2adcd8f30637f44bbea + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": + version: 5.5.1 + resolution: "@rollup/pluginutils@npm:5.5.1" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/a2f8ae672f7c155966a34d813a15906c5c2e78adf062048364c2859aad1db58c515f5ad6baf88bbe6ca62a1516cc19d87fcf15e7951cbdbbaffac434d2ecbd2d + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.65.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-android-arm64@npm:4.65.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.65.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.65.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.65.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.65.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.65.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.65.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.65.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.65.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.65.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.65.0" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.65.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.65.0" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.65.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.65.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.65.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.65.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.65.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-openbsd-x64@npm:4.65.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.65.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.65.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.65.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.65.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.65.0": + version: 4.65.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.65.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding-darwin-arm64@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-darwin-arm64@npm:1.7.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-darwin-x64@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-darwin-x64@npm:1.7.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-gnu@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.7.12" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-musl@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.7.12" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-gnu@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.7.12" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-musl@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-linux-x64-musl@npm:1.7.12" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-wasm32-wasi@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-wasm32-wasi@npm:1.7.12" + dependencies: + "@napi-rs/wasm-runtime": "npm:1.0.7" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rspack/binding-win32-arm64-msvc@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.7.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-win32-ia32-msvc@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.7.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rspack/binding-win32-x64-msvc@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.7.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding@npm:1.7.12": + version: 1.7.12 + resolution: "@rspack/binding@npm:1.7.12" + dependencies: + "@rspack/binding-darwin-arm64": "npm:1.7.12" + "@rspack/binding-darwin-x64": "npm:1.7.12" + "@rspack/binding-linux-arm64-gnu": "npm:1.7.12" + "@rspack/binding-linux-arm64-musl": "npm:1.7.12" + "@rspack/binding-linux-x64-gnu": "npm:1.7.12" + "@rspack/binding-linux-x64-musl": "npm:1.7.12" + "@rspack/binding-wasm32-wasi": "npm:1.7.12" + "@rspack/binding-win32-arm64-msvc": "npm:1.7.12" + "@rspack/binding-win32-ia32-msvc": "npm:1.7.12" + "@rspack/binding-win32-x64-msvc": "npm:1.7.12" + dependenciesMeta: + "@rspack/binding-darwin-arm64": + optional: true + "@rspack/binding-darwin-x64": + optional: true + "@rspack/binding-linux-arm64-gnu": + optional: true + "@rspack/binding-linux-arm64-musl": + optional: true + "@rspack/binding-linux-x64-gnu": + optional: true + "@rspack/binding-linux-x64-musl": + optional: true + "@rspack/binding-wasm32-wasi": + optional: true + "@rspack/binding-win32-arm64-msvc": + optional: true + "@rspack/binding-win32-ia32-msvc": + optional: true + "@rspack/binding-win32-x64-msvc": + optional: true + checksum: 10/0431a871f70849bac0617c7e0cb993175ce04a892926d78cf255126efa415b0b2e996f0e58cdd3820aa230c005ab9c6702f85f754960b09223d538007a101ffd + languageName: node + linkType: hard + +"@rspack/core@npm:^1.4.11": + version: 1.7.12 + resolution: "@rspack/core@npm:1.7.12" + dependencies: + "@module-federation/runtime-tools": "npm:0.22.0" + "@rspack/binding": "npm:1.7.12" + "@rspack/lite-tapable": "npm:1.1.0" + peerDependencies: + "@swc/helpers": ">=0.5.1" + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/f47b03788fe77172ed5495043a915eec3fcf1ed0ed3952a7c793659bd0dae85e23f90593f4069da6f6f4205f00d9993fc8f0058bb6e8e9f78f9b648f47312664 + languageName: node + linkType: hard + +"@rspack/dev-server@npm:^1.1.4": + version: 1.2.1 + resolution: "@rspack/dev-server@npm:1.2.1" + dependencies: + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.25" + "@types/express-serve-static-core": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" + colorette: "npm:^2.0.10" + compression: "npm:^1.8.1" + connect-history-api-fallback: "npm:^2.0.0" + express: "npm:^4.22.1" + graceful-fs: "npm:^4.2.6" + http-proxy-middleware: "npm:^2.0.9" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.6.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^2.4.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" + peerDependencies: + "@rspack/core": "*" + checksum: 10/154808faef8079dc1d6eae1712455864cc7bc1ec686f3020f7117ad3e5f2906940f27ec514eb40230276132371570ecdf6b47f7ab117ad209462bcba7c2b0692 + languageName: node + linkType: hard + +"@rspack/lite-tapable@npm:1.1.0": + version: 1.1.0 + resolution: "@rspack/lite-tapable@npm:1.1.0" + checksum: 10/41ff73fe5e1b8dccaad746c9c1bd36dd67649e1ad35776f311b5ba94333a397704e11158579e25a6a7e677c51abe35e66987b1b000faef48d4e4ad2470fea150 + languageName: node + linkType: hard + +"@rspack/lite-tapable@npm:^1.3.0": + version: 1.3.0 + resolution: "@rspack/lite-tapable@npm:1.3.0" + checksum: 10/ffaea3bb4cfe6e811ee58c0d7f4b15eb1acc27070f93d46e66d2226bd3ff7ef677dee7ed21f21f4130b360c35be0f57b792c59157282e6a01a5a6fcb81c783b8 + languageName: node + linkType: hard + +"@rspack/plugin-react-refresh@npm:^1.4.3": + version: 1.6.2 + resolution: "@rspack/plugin-react-refresh@npm:1.6.2" + dependencies: + error-stack-parser: "npm:^2.1.4" + peerDependencies: + react-refresh: ">=0.10.0 <1.0.0" + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + checksum: 10/870d70e341c9a25da50d90ba289adc4feac2e002cdf024ae4a96193f0e0ecea9cd541a89cb67f7865d304eea6204a7628cc6b1ae25f3146705cd04da553c6b87 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10/17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + +"@rushstack/node-core-library@npm:5.25.1": + version: 5.25.1 + resolution: "@rushstack/node-core-library@npm:5.25.1" + dependencies: + ajv: "npm:~8.20.0" + ajv-draft-04: "npm:~1.0.0" + ajv-formats: "npm:~3.0.1" + fs-extra: "npm:~11.3.0" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.7.4" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/a39735f655fd006f10eb6f8c789d4fa68974a469a94cee477171008997b0cc4371b014da00c74483090d26c0120072a53317a5e5e41de067e95edcf82e05e3b7 + languageName: node + linkType: hard + +"@rushstack/problem-matcher@npm:0.2.1": + version: 0.2.1 + resolution: "@rushstack/problem-matcher@npm:0.2.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/62fda91629577a2f57de19be357cd0990da145ff4933f4d2cd48f423cc03b92fca06dd8916dcbaf1d307a201c104847c77066d45d79fd3c323c4949f0c99bf44 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.7.4": + version: 0.7.4 + resolution: "@rushstack/rig-package@npm:0.7.4" + dependencies: + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + checksum: 10/d2dc8cbd8e88e4c0a12eb3d017fe4724df7747c3e56a559f4e6c5831c3708eaddd7c8cda5e7a6f722fb03fea9bac8a45da6bf28c920130a3607b1ed665b51ed1 + languageName: node + linkType: hard + +"@rushstack/terminal@npm:0.24.7": + version: 0.24.7 + resolution: "@rushstack/terminal@npm:0.24.7" + dependencies: + "@rushstack/node-core-library": "npm:5.25.1" + "@rushstack/problem-matcher": "npm:0.2.1" + supports-color: "npm:~8.1.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/e6197c89853688fe4165dcc676e960e1f10385c093b0aa172d2fc102ed7f8230aa4e8777b58d6c6dfc26bee19e80d9e0c4655ce711516e2f7a56cfbd60e6fb45 + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:5.3.17": + version: 5.3.17 + resolution: "@rushstack/ts-command-line@npm:5.3.17" + dependencies: + "@rushstack/terminal": "npm:0.24.7" + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + string-argv: "npm:~0.3.1" + checksum: 10/f2f4f3fc86cc0ca14506d492c6b67216e37492401273ae44f3a97bd0d38df2deed35e937fb7be28c0485ca462707e4fb656d1bf243544685f6f207219395fc5a + languageName: node + linkType: hard + +"@scarf/scarf@npm:^1.4.0": + version: 1.4.0 + resolution: "@scarf/scarf@npm:1.4.0" + checksum: 10/1b39a18fa29e91cfbc134c588e20c5f01a1b21ec4473614123801155b48378e9c3bf72adaca8c67e433ae951ab653268e9502cc5733230d8927532f74a6b89c9 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.12 + resolution: "@sinclair/typebox@npm:0.27.12" + checksum: 10/ff50dbe61a4abf33599093d80d02254555252049a101e33c300e8ce7dd09641a4827e44b792e57eb57ed6fe5b149bb244fb5fdbd592535a9a2a87ddaab1f3e0e + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.52 + resolution: "@sinclair/typebox@npm:0.34.52" + checksum: 10/693a7ab6c8935cbb6e89698bd75ac465038ecfff8b8ad22c50ad6d93a049b0e7cfe4d759200d0401707c5679d6f7a3791fd6dee139bcbb250fa3aae3c17e8bd1 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.6.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10/e7f36ed72abfcd5e0355f7423a72918b9748bb1ef370a59f3e5ad8d40b728b85d63b272f65f63eec1faf417cda89dcb0aeebe94015647b6054659c1442fe5ce0 + languageName: node + linkType: hard + +"@spotify/eslint-config-base@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-base@npm:15.0.0" + peerDependencies: + eslint: ">=7.x" + checksum: 10/2babdd0aa03ae2ac159796875c6b1c51d6d69e376b6ca25fc08d1297c12f3d1a83207427ca9a75e143c29337d0ae37057573a36262cce717a074e38a47117178 + languageName: node + linkType: hard + +"@spotify/eslint-config-react@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-react@npm:15.0.0" + peerDependencies: + eslint: ">=8.x" + eslint-plugin-jsx-a11y: 6.x + eslint-plugin-react: ">=7.7.0 <8" + eslint-plugin-react-hooks: ^4.0.0 + checksum: 10/402135a0548b412959e6bf8fed1e90ff74f42502d9c6f50c77a6aa028a09eec0a993b9e066c7d548b2aaac6f0eda11636750f81773c519ebc14b8d22f3e3c1af + languageName: node + linkType: hard + +"@spotify/eslint-config-typescript@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-typescript@npm:15.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ">=5" + "@typescript-eslint/parser": ">=5" + eslint: ">=8.x" + checksum: 10/33627cff3a7ff6360cd73e26d28c50b3a49cc027716e1e0044187cad1fbfd6f9da13c83d2ae16bffa4755c8004f2ee9dafa4d520906905a8c9a7209987c93e5d + languageName: node + linkType: hard + +"@standard-schema/spec@npm:^1.1.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10/a209615c9e8b2ea535d7db0a5f6aa0f962fd4ab73ee86a46c100fb78116964af1f55a27c1794d4801e534a196794223daa25ff5135021e03c7828aa3d95e1763 + languageName: node + linkType: hard + +"@stoplight/better-ajv-errors@npm:1.0.3": + version: 1.0.3 + resolution: "@stoplight/better-ajv-errors@npm:1.0.3" + dependencies: + jsonpointer: "npm:^5.0.0" + leven: "npm:^3.1.0" + peerDependencies: + ajv: ">=8" + checksum: 10/0fae5139986192ebf9ea65672a921480cd66308832d1ca33f6ca4f9d9caad109e7ea900cb2352b3348b38fb17f7e2322ceb9c8381d9518ccd3fbde4e972ff807 + languageName: node + linkType: hard + +"@stoplight/json-ref-readers@npm:1.2.2": + version: 1.2.2 + resolution: "@stoplight/json-ref-readers@npm:1.2.2" + dependencies: + node-fetch: "npm:^2.6.0" + tslib: "npm:^1.14.1" + checksum: 10/1cb60a4c037ebc03bc4f4ef83e831e72c65954a63633ec77a39316458d2791a27701c0ccb962b85892f2e2b412fb7eb866a7bf9ccb449fe035948e1f31b37acb + languageName: node + linkType: hard + +"@stoplight/json-ref-resolver@npm:~3.1.6": + version: 3.1.6 + resolution: "@stoplight/json-ref-resolver@npm:3.1.6" + dependencies: + "@stoplight/json": "npm:^3.21.0" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^12.3.0 || ^13.0.0" + "@types/urijs": "npm:^1.19.19" + dependency-graph: "npm:~0.11.0" + fast-memoize: "npm:^2.5.2" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + tslib: "npm:^2.6.0" + urijs: "npm:^1.19.11" + checksum: 10/f70b3c7db148ccbf34a634962e13fabb91ea0721e11b693f34f17d65411f4ea7e5e92062d3184c455205dc3372a8f0e81b843f08048c2ea6a001595f88cf7440 + languageName: node + linkType: hard + +"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1, @stoplight/json@npm:^3.20.1, @stoplight/json@npm:^3.21.0, @stoplight/json@npm:~3.21.0": + version: 3.21.7 + resolution: "@stoplight/json@npm:3.21.7" + dependencies: + "@stoplight/ordered-object-literal": "npm:^1.0.3" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^13.6.0" + jsonc-parser: "npm:~2.2.1" + lodash: "npm:^4.17.21" + safe-stable-stringify: "npm:^1.1" + checksum: 10/f7a1069150937ca0676d46856c3f8e7c3f21314c576507ed40fe4d4f60b4b8c414a1b590904c5959048a1e8e37cd59163c93fd3b31656da76d14c225b2c2ee4f + languageName: node + linkType: hard + +"@stoplight/ordered-object-literal@npm:^1.0.3, @stoplight/ordered-object-literal@npm:^1.0.5": + version: 1.0.5 + resolution: "@stoplight/ordered-object-literal@npm:1.0.5" + checksum: 10/d12374f46ef8ab7237196024cc387aa50c0ec8029a421ef1eac726d342687f79972a9d0f0dc39802719511b8f8a82f06b3859b8219ada040a7640bf9d954cd62 + languageName: node + linkType: hard + +"@stoplight/path@npm:1.3.2, @stoplight/path@npm:^1.3.2": + version: 1.3.2 + resolution: "@stoplight/path@npm:1.3.2" + checksum: 10/74e3d019cd389a93701c599e7a8124862bcb3fc71d93dfe126f16683df2e63021a1c2029e58cb6e33b5368592baff26c5a0641a746ae2e7dbfbfa8fb232811fd + languageName: node + linkType: hard + +"@stoplight/spectral-core@npm:^1.18.0, @stoplight/spectral-core@npm:^1.19.4, @stoplight/spectral-core@npm:^1.23.0": + version: 1.24.0 + resolution: "@stoplight/spectral-core@npm:1.24.0" + dependencies: + "@scarf/scarf": "npm:^1.4.0" + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:~3.21.0" + "@stoplight/path": "npm:1.3.2" + "@stoplight/spectral-parsers": "npm:^1.0.0" + "@stoplight/spectral-ref-resolver": "npm:^1.0.4" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:~13.6.0" + "@types/es-aggregate-error": "npm:^1.0.2" + "@types/json-schema": "npm:^7.0.11" + ajv: "npm:^8.18.0" + ajv-errors: "npm:~3.0.0" + ajv-formats: "npm:~2.1.1" + es-aggregate-error: "npm:^1.0.7" + expr-eval-fork: "npm:^3.0.1" + jsonpath-plus: "npm:^10.3.0" + lodash: "npm:^4.18.1" + lodash.topath: "npm:^4.5.2" + minimatch: "npm:^3.1.4" + nimma: "npm:0.2.3" + pony-cause: "npm:^1.1.1" + tslib: "npm:^2.8.1" + checksum: 10/72fd3ce33a10e259314e2f293881e1fa851fcbf86874c8157edb1c165ee82812d54716c82e20ca22fcbacbda482d12e1d48005c65763b5a9c86e12a584c90052 + languageName: node + linkType: hard + +"@stoplight/spectral-formats@npm:^1.2.0, @stoplight/spectral-formats@npm:^1.8.1": + version: 1.9.0 + resolution: "@stoplight/spectral-formats@npm:1.9.0" + dependencies: + "@scarf/scarf": "npm:^1.4.0" + "@stoplight/json": "npm:^3.17.0" + "@stoplight/spectral-core": "npm:^1.23.0" + "@types/json-schema": "npm:^7.0.7" + tslib: "npm:^2.8.1" + checksum: 10/7016c2d8afd9ade11fb6fce91a89baf8a6bc73818f28c609453852fd6714e77a0ea464f19d93edd604a4f980e00a45344505165f54f8ab822669492cb315fb60 + languageName: node + linkType: hard + +"@stoplight/spectral-formatters@npm:^1.1.0": + version: 1.6.0 + resolution: "@stoplight/spectral-formatters@npm:1.6.0" + dependencies: + "@stoplight/path": "npm:^1.3.2" + "@stoplight/spectral-core": "npm:^1.19.4" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:^13.15.0" + "@types/markdown-escape": "npm:^1.1.3" + chalk: "npm:4.1.2" + cliui: "npm:7.0.4" + lodash: "npm:^4.18.1" + markdown-escape: "npm:^2.0.0" + node-sarif-builder: "npm:^2.0.3" + strip-ansi: "npm:6.0" + text-table: "npm:^0.2.0" + tslib: "npm:^2.8.1" + checksum: 10/7a7148fad52fb86ea78c5a2b2afd460faaddb1a578788d562b9dabb8ed6a8ac8f6b1f55b87f7f0401081ee7e8eaa5d003e622b211e8f9d4f4a29a1ebf047cb03 + languageName: node + linkType: hard + +"@stoplight/spectral-functions@npm:^1.6.1, @stoplight/spectral-functions@npm:^1.7.2, @stoplight/spectral-functions@npm:^1.9.1": + version: 1.11.0 + resolution: "@stoplight/spectral-functions@npm:1.11.0" + dependencies: + "@scarf/scarf": "npm:^1.4.0" + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:^3.17.1" + "@stoplight/spectral-core": "npm:^1.23.0" + "@stoplight/spectral-formats": "npm:^1.8.1" + "@stoplight/spectral-runtime": "npm:^1.1.2" + ajv: "npm:^8.18.0" + ajv-draft-04: "npm:~1.0.0" + ajv-errors: "npm:~3.0.0" + ajv-formats: "npm:~2.1.1" + lodash: "npm:^4.18.1" + tslib: "npm:^2.8.1" + checksum: 10/04249f4146d43c5e3ae803bd9a7d7e12a7bd36cbead4717f9b8d342a37f9557f9749f0fb365ae2465d94c105d24caf2652506e8109b8bc8741c92197ce7e7644 + languageName: node + linkType: hard + +"@stoplight/spectral-parsers@npm:^1.0.0, @stoplight/spectral-parsers@npm:^1.0.2": + version: 1.0.5 + resolution: "@stoplight/spectral-parsers@npm:1.0.5" + dependencies: + "@stoplight/json": "npm:~3.21.0" + "@stoplight/types": "npm:^14.1.1" + "@stoplight/yaml": "npm:~4.3.0" + tslib: "npm:^2.8.1" + checksum: 10/3103be1509116ca0b095f31e14decdf3c8301fee0aa5bfa80d076f479dfa4577762c69cec802a04e3e4c469c6f07e467a685384873e520755a212b091dc69c8b + languageName: node + linkType: hard + +"@stoplight/spectral-ref-resolver@npm:^1.0.4": + version: 1.0.5 + resolution: "@stoplight/spectral-ref-resolver@npm:1.0.5" + dependencies: + "@stoplight/json-ref-readers": "npm:1.2.2" + "@stoplight/json-ref-resolver": "npm:~3.1.6" + "@stoplight/spectral-runtime": "npm:^1.1.2" + dependency-graph: "npm:0.11.0" + tslib: "npm:^2.8.1" + checksum: 10/a010c8f415d4ec2668298f5cb6b1d8c83d59ea6da15f0576181a23f90c49a4bb5bcd0a22c06a46f38eec5da38d15721a6ae444f99a025efd4da7b69fa173e579 + languageName: node + linkType: hard + +"@stoplight/spectral-rulesets@npm:^1.18.0": + version: 1.23.0 + resolution: "@stoplight/spectral-rulesets@npm:1.23.0" + dependencies: + "@asyncapi/specs": "npm:6.11.1" + "@scarf/scarf": "npm:^1.4.0" + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:^3.17.0" + "@stoplight/spectral-core": "npm:^1.23.0" + "@stoplight/spectral-formats": "npm:^1.8.1" + "@stoplight/spectral-functions": "npm:^1.9.1" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:^13.6.0" + "@types/json-schema": "npm:^7.0.7" + ajv: "npm:^8.18.0" + ajv-formats: "npm:~2.1.1" + json-schema-traverse: "npm:^1.0.0" + leven: "npm:3.1.0" + lodash: "npm:^4.18.1" + tslib: "npm:^2.8.1" + checksum: 10/cb5c79afb31c3deab051f329087b3cc5e494570339e66bb456275f2b0872cfaa6a905bdd1ad0fcc0c05c896f30b37106309020e658bf27b55a6added72fd4e65 + languageName: node + linkType: hard + +"@stoplight/spectral-runtime@npm:^1.1.2": + version: 1.1.6 + resolution: "@stoplight/spectral-runtime@npm:1.1.6" + dependencies: + "@stoplight/json": "npm:^3.20.1" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^13.6.0" + lodash: "npm:^4.18.1" + node-fetch: "npm:^2.7.0" + tslib: "npm:^2.8.1" + checksum: 10/e1e73b467c2e86b91cc91ea1f6829f34d58d189fec1fcc309882eb04f609a489985bbf576c6e51723c7f0d21c52f4ff5ad5b0911e3a489ace61c1431bc408f3b + languageName: node + linkType: hard + +"@stoplight/types@npm:^12.3.0 || ^13.0.0, @stoplight/types@npm:^13.15.0, @stoplight/types@npm:^13.6.0": + version: 13.20.0 + resolution: "@stoplight/types@npm:13.20.0" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/4493d75cd7b37766e9e5255cbdee92a639b06d75ef8019a6cad6ab81348377423852e34966a46b270a3e23fc1a1365481d11885c64e98696a28224714d7d676d + languageName: node + linkType: hard + +"@stoplight/types@npm:^14.0.0, @stoplight/types@npm:^14.1.1": + version: 14.1.1 + resolution: "@stoplight/types@npm:14.1.1" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/1d053f4276872a1c31ef809ec13f57fcfcc3cac65cdd74ddc735c3b4397da6f8a5a8efd99d8c4f5d74cd8342dd28def304d69a4ef623e1f94bd0d5efe6e368be + languageName: node + linkType: hard + +"@stoplight/types@npm:~13.6.0": + version: 13.6.0 + resolution: "@stoplight/types@npm:13.6.0" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/63b04720784ad267607248aa6059dd7e4f4211deff491fc42b2665e30fb352abb15893c489a5d1f4b6c2675506c5cc420ee772eebd0310dae062eaedcb218cac + languageName: node + linkType: hard + +"@stoplight/yaml-ast-parser@npm:0.0.50": + version: 0.0.50 + resolution: "@stoplight/yaml-ast-parser@npm:0.0.50" + checksum: 10/f3683c515eec5f5abcd301fad9c37f290506b8feeffc72fdb269c733561a5f6a8fa6f30acc67b861fd350b3859eb6ab9993373ed838dbf157d11d72b3319cfe9 + languageName: node + linkType: hard + +"@stoplight/yaml@npm:~4.3.0": + version: 4.3.0 + resolution: "@stoplight/yaml@npm:4.3.0" + dependencies: + "@stoplight/ordered-object-literal": "npm:^1.0.5" + "@stoplight/types": "npm:^14.1.1" + "@stoplight/yaml-ast-parser": "npm:0.0.50" + tslib: "npm:^2.2.0" + checksum: 10/4a3eacfb5fb8936cb4b229f69542224e5905f71a6e2baeb70f73a67de6ce3b20178079a79d7744a437db901f67740dcdfd9b53dafb918ce75cbbb498ec548fd7 + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-darwin-arm64@npm:1.16.20" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-darwin-x64@npm:1.16.20" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.16.20" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-arm64-gnu@npm:1.16.20" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-arm64-musl@npm:1.16.20" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-ppc64-gnu@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-ppc64-gnu@npm:1.16.20" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-s390x-gnu@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-s390x-gnu@npm:1.16.20" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-x64-gnu@npm:1.16.20" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-linux-x64-musl@npm:1.16.20" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-win32-arm64-msvc@npm:1.16.20" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-win32-ia32-msvc@npm:1.16.20" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.16.20": + version: 1.16.20 + resolution: "@swc/core-win32-x64-msvc@npm:1.16.20" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.15.6": + version: 1.16.20 + resolution: "@swc/core@npm:1.16.20" + dependencies: + "@swc/core-darwin-arm64": "npm:1.16.20" + "@swc/core-darwin-x64": "npm:1.16.20" + "@swc/core-linux-arm-gnueabihf": "npm:1.16.20" + "@swc/core-linux-arm64-gnu": "npm:1.16.20" + "@swc/core-linux-arm64-musl": "npm:1.16.20" + "@swc/core-linux-ppc64-gnu": "npm:1.16.20" + "@swc/core-linux-s390x-gnu": "npm:1.16.20" + "@swc/core-linux-x64-gnu": "npm:1.16.20" + "@swc/core-linux-x64-musl": "npm:1.16.20" + "@swc/core-win32-arm64-msvc": "npm:1.16.20" + "@swc/core-win32-ia32-msvc": "npm:1.16.20" + "@swc/core-win32-x64-msvc": "npm:1.16.20" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.28" + peerDependencies: + "@swc/helpers": ">=0.5.17" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-ppc64-gnu": + optional: true + "@swc/core-linux-s390x-gnu": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/0468ff010246a684d25099f4853b5bb6a631f03a01900b77177cb4a22cf39b914358e1189b98bc5fe7ae354c65e3e784767499fc68a44bffa5c4ad77b2084b00 + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 + languageName: node + linkType: hard + +"@swc/jest@npm:^0.2.39": + version: 0.2.39 + resolution: "@swc/jest@npm:0.2.39" + dependencies: + "@jest/create-cache-key-function": "npm:^30.0.0" + "@swc/counter": "npm:^0.1.3" + jsonc-parser: "npm:^3.2.0" + peerDependencies: + "@swc/core": "*" + checksum: 10/a2b7ed6fbb908867e673d1bbff9efde7eee225a57ad75735216ce2005e40c5cfb92285bd807d2058f1c0317e3d48ed71f5577fe85b28bebc80c1bc2c3a03306e + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.28": + version: 0.1.28 + resolution: "@swc/types@npm:0.1.28" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 10/9cd2b13a640c36d28235a30567dc38330e01dc54ba0ca6ff4000fc56f0be27252b91c3df4989a9ef019b9df9eb722e73fb273913675f8b891428981fb9cc9a0f + languageName: node + linkType: hard + +"@tokenizer/inflate@npm:^0.4.1": + version: 0.4.1 + resolution: "@tokenizer/inflate@npm:0.4.1" + dependencies: + debug: "npm:^4.4.3" + token-types: "npm:^6.1.1" + checksum: 10/27d58757e1a6c004e86f8a5f1a40fe47cb48aa6891864d03de6eab27d42fafc1456f396bc8bc300e16913b0a85f42034d011db0213d17e544ed201a7fc24244e + languageName: node + linkType: hard + +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 10/889c1f1e63ac7c92c0ea22d4a2861142f1b43c3d92eb70ec42aa9e9851fab2e9952211d50f541b287781280df2f979bf5600a9c1f91fbc61b7fcf9994e9376a5 + languageName: node + linkType: hard + +"@ts-morph/common@npm:~0.25.0": + version: 0.25.0 + resolution: "@ts-morph/common@npm:0.25.0" + dependencies: + minimatch: "npm:^9.0.4" + path-browserify: "npm:^1.0.1" + tinyglobby: "npm:^0.2.9" + checksum: 10/9b192dfebb7179e96267ea1720f6afe77964f9f89ecaca41d372da206cdfd838a77c1080026c73115a5d3a88752b1504ec7380907e26b6424e8fb7f7625c7461 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.10.1, @tybys/wasm-util@npm:^0.10.3": + version: 0.10.4 + resolution: "@tybys/wasm-util@npm:0.10.4" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/da910a0439afad49a6427e4d16fcd5a52199cb471e07c262e1dd5ed7664908e6f142f4dca1b09895c53f4ca4402663042d760f41c9fa7ff33f76c662739646df + languageName: node + linkType: hard + +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 10/26ed7e3f1e3595efdb883a852f5205f971b798e4c28b7e30a32c5298eee596e8b45834ce831f014d250b9730819ab05acff5b31229666d3af4ba465b4697d0eb + languageName: node + linkType: hard + +"@types/body-parser@npm:*": + version: 1.19.6 + resolution: "@types/body-parser@npm:1.19.6" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10/33041e88eae00af2cfa0827e951e5f1751eafab2a8b6fce06cd89ef368a988907996436b1325180edaeddd1c0c7d0d0d4c20a6c9ff294a91e0039a9db9e9b658 + languageName: node + linkType: hard + +"@types/bonjour@npm:^3.5.13": + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" + dependencies: + "@types/node": "npm:*" + checksum: 10/e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee + languageName: node + linkType: hard + +"@types/connect-history-api-fallback@npm:^1.5.4": + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" + dependencies: + "@types/express-serve-static-core": "npm:*" + "@types/node": "npm:*" + checksum: 10/e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10/7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 + languageName: node + linkType: hard + +"@types/es-aggregate-error@npm:^1.0.2": + version: 1.0.6 + resolution: "@types/es-aggregate-error@npm:1.0.6" + dependencies: + "@types/node": "npm:*" + checksum: 10/a5b2155f664a3460d3cbc1e84e76fc0f3e751c6cebb04bf79d38e2809f44a4ba6765b83761a1e5cc0bba1b7852f7ba4fae2231110dee6218405835024dd372ac + languageName: node + linkType: hard + +"@types/eslint@npm:^8.56.10": + version: 8.56.12 + resolution: "@types/eslint@npm:8.56.12" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10/bd998b5d3f98ac430ec8db6223f1cff1820774c1e72eabda05463256875d97065fd357fba7379dd25e6bfbeb73296f28faff6f4dcbc320f890bb49b09087644d + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.9, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.8": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 10/16aabfa703b5bdac83f719b07ce92a11b2d3c9b8628eacc92889d8af46cab2d78fc45c7b5378de383d0500585cea5c2f79125eeddfe5fbc6bd6a27eb0c8ccee5 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.1.3 + resolution: "@types/express-serve-static-core@npm:5.1.3" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10/455822d3269510d3fd45fba7c1e5d4d6de7a1b9767d8afcce5a1ff9ab9743df01db471a6ba1510a1acf3c970a7b31fd26ee99a245e297acae2f66cf6231c86b7 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": + version: 4.19.9 + resolution: "@types/express-serve-static-core@npm:4.19.9" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10/5f87b539e0a322e1eed7dde6c7c268a32580fb75893a288af2fc013ef44c970128223178e68486d92b8e2814fbe843f150e53e158d833d3856de083fe84b5ea8 + languageName: node + linkType: hard + +"@types/express@npm:*": + version: 5.0.6 + resolution: "@types/express@npm:5.0.6" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/serve-static": "npm:^2" + checksum: 10/da2cc3de1b1a4d7f20ed3fb6f0a8ee08e99feb3c2eb5a8d643db77017d8d0e70fee9e95da38a73f51bcdf5eda3bb6435073c0271dc04fb16fda92e55daf911fa + languageName: node + linkType: hard + +"@types/express@npm:^4.17.25, @types/express@npm:^4.17.6": + version: 4.17.25 + resolution: "@types/express@npm:4.17.25" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:^1" + checksum: 10/c309fdb79fb8569b5d8d8f11268d0160b271f8b38f0a82c20a0733e526baf033eb7a921cd51d54fe4333c616de9e31caf7d4f3ef73baaf212d61f23f460b0369 + languageName: node + linkType: hard + +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10/06bb3e1e8ebff43602c826d67f53f1fd3a6b9c751bfbc67d7ea4e85679446a639e20e60adad8c9d44ab4baf1337b3861b91e7e5e2be798575caf0cc1a5712552 + languageName: node + linkType: hard + +"@types/http-errors@npm:*": + version: 2.0.5 + resolution: "@types/http-errors@npm:2.0.5" + checksum: 10/a88da669366bc483e8f3b3eb3d34ada5f8d13eeeef851b1204d77e2ba6fc42aba4566d877cca5c095204a3f4349b87fe397e3e21288837bdd945dd514120755b + languageName: node + linkType: hard + +"@types/http-proxy@npm:^1.17.8": + version: 1.17.17 + resolution: "@types/http-proxy@npm:1.17.17" + dependencies: + "@types/node": "npm:*" + checksum: 10/893e46e12be576baa471cf2fc13a4f0e413eaf30a5850de8fdbea3040e138ad4171234c59b986cf7137ff20a1582b254bf0c44cfd715d5ed772e1ab94dd75cd1 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.6": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10/b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0, @types/istanbul-reports@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10/93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10/4e5aed58cabb2bbf6f725da13421aa50a49abb6bc17bfab6c31b8774b073fa7b50d557c61f961a09a85f6056151190f8ac95f13f5b48136ba5841f7d4484ec56 + languageName: node + linkType: hard + +"@types/luxon@npm:^3.0.0": + version: 3.7.6 + resolution: "@types/luxon@npm:3.7.6" + checksum: 10/2bc7a58b2cf231455085314821fe9b05a8e97cef2447d8da50be0a8794f0ddfa6d4bbd18eb6259ee881be0da0d08843ce66830a30d5926a25981f91bd5f588a9 + languageName: node + linkType: hard + +"@types/markdown-escape@npm:^1.1.3": + version: 1.1.3 + resolution: "@types/markdown-escape@npm:1.1.3" + checksum: 10/cb2e410993271f0ccc526190391a08344f4f602be69e06fee989d36d5886866ba9ba2184054895d0ad2a12d57b02f3ccf86d7a1fe8904be48bcc1ee61b98e32f + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10/e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 + languageName: node + linkType: hard + +"@types/mute-stream@npm:^0.0.4": + version: 0.0.4 + resolution: "@types/mute-stream@npm:0.0.4" + dependencies: + "@types/node": "npm:*" + checksum: 10/af8d83ad7b68ea05d9357985daf81b6c9b73af4feacb2f5c2693c7fd3e13e5135ef1bd083ce8d5bdc8e97acd28563b61bb32dec4e4508a8067fcd31b8a098632 + languageName: node + linkType: hard + +"@types/node-forge@npm:^1.3.0": + version: 1.3.14 + resolution: "@types/node-forge@npm:1.3.14" + dependencies: + "@types/node": "npm:*" + checksum: 10/500ce72435285fca145837da079b49a09a5bdf8391b0effc3eb2455783dd81ab129e574a36e1a0374a4823d889d5328177ebfd6fe45b432c0c43d48d790fe39c + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 26.6.5 + resolution: "@types/node@npm:26.6.5" + dependencies: + undici-types: "npm:~8.9.0" + checksum: 10/03780cc68280b566af47c0f673318e665258dbdcc953737a83c11593424d55aecb8b2642a573da33f76cb4dd5457379548388b78ab284cb3b762030e5d58b252 + languageName: node + linkType: hard + +"@types/node@npm:^12.7.1": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: 10/1f916a06fff02faadb09a16ed6e31820ce170798b202ef0b14fc244bfbd721938c54a3a99836e185e4414ca461fe96c5bb5c67c3d248f153555b7e6347f061dd + languageName: node + linkType: hard + +"@types/node@npm:^20.10.7": + version: 20.19.43 + resolution: "@types/node@npm:20.19.43" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10/cb060ea17ef9f1fc9d47cfb00098175b25fc6f6bae3c08a89ec7ba1be3353445ccf8af62d88c591e6413c09713f7705a71684a27ef01d2bccac4be96b00cacac + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10/5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 + languageName: node + linkType: hard + +"@types/passport@npm:^1.0.3": + version: 1.0.17 + resolution: "@types/passport@npm:1.0.17" + dependencies: + "@types/express": "npm:*" + checksum: 10/3db90645d58d928796dd8e9c328dec8040b71a43f3691d42a08fb4779efcbfc7dccc43ea612066a961a41be0869800096d52fd8aaa71518a89aa4483f67f5914 + languageName: node + linkType: hard + +"@types/qs@npm:*": + version: 6.15.1 + resolution: "@types/qs@npm:6.15.1" + checksum: 10/fd04a36c683dbb1ec5819c01773905259955bfd84d7294af178ad609990a9b8d75d458629ca3bf97b151fe2934eb12ade7fdeb98f2e3ad40d138f0a7d195ac7c + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10/95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a + languageName: node + linkType: hard + +"@types/resolve@npm:1.20.2": + version: 1.20.2 + resolution: "@types/resolve@npm:1.20.2" + checksum: 10/1bff0d3875e7e1557b6c030c465beca9bf3b1173ebc6937cac547654b0af3bb3ff0f16470e9c4d7c5dc308ad9ac8627c38dbff24ef698b66673ff5bd4ead7f7e + languageName: node + linkType: hard + +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a + languageName: node + linkType: hard + +"@types/sarif@npm:^2.1.4": + version: 2.1.7 + resolution: "@types/sarif@npm:2.1.7" + checksum: 10/0901acef0b77b7c9eaacd6827796cda9c124cc7b871aa6f91de6ec8869fbc699c6d5c510d61f9e6b1c312ea668aa33f08d81cdd2bd55c462bbbe323a5e4c8c5e + languageName: node + linkType: hard + +"@types/send@npm:*": + version: 1.2.1 + resolution: "@types/send@npm:1.2.1" + dependencies: + "@types/node": "npm:*" + checksum: 10/81ef5790037ba1d2d458392e4241501f0f8b4838cc8797e169e179e099410e12069ec68e8dbd39211cb097c4a9b1ff1682dbcea897ab4ce21dad93438b862d27 + languageName: node + linkType: hard + +"@types/send@npm:<1": + version: 0.17.6 + resolution: "@types/send@npm:0.17.6" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10/4948ab32ab84a81a0073f8243dd48ee766bc80608d5391060360afd1249f83c08a7476f142669ac0b0b8831c89d909a88bcb392d1b39ee48b276a91b50f3d8d1 + languageName: node + linkType: hard + +"@types/serve-index@npm:^1.9.4": + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" + dependencies: + "@types/express": "npm:*" + checksum: 10/72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 + languageName: node + linkType: hard + +"@types/serve-static@npm:^1, @types/serve-static@npm:^1.15.5": + version: 1.15.10 + resolution: "@types/serve-static@npm:1.15.10" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:<1" + checksum: 10/d9be72487540b9598e7d77260d533f241eb2e5db5181bb885ef2d6bc4592dad1c9e8c0e27f465d59478b2faf90edd2d535e834f20fbd9dd3c0928d43dc486404 + languageName: node + linkType: hard + +"@types/serve-static@npm:^2": + version: 2.2.0 + resolution: "@types/serve-static@npm:2.2.0" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + checksum: 10/f2bad1304c7d0d3b7221faff3e490c40129d3803f4fb1b2fb84f31f561071c5e6a4b876c41bbbe82d5645034eea936e946bcaaf993dac1093ce68b56effad6e0 + languageName: node + linkType: hard + +"@types/sockjs@npm:^0.3.36": + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" + dependencies: + "@types/node": "npm:*" + checksum: 10/b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc + languageName: node + linkType: hard + +"@types/urijs@npm:^1.19.19": + version: 1.19.26 + resolution: "@types/urijs@npm:1.19.26" + checksum: 10/1c5e5b821bb3030a2b1d9c89bffacfd0ec23d61ecf63a990bc1a7f4fe8a882bbfe4aec7431c5f8e731d5384dce69f83217d6822e89126c9b993ddd4ac9bfebb6 + languageName: node + linkType: hard + +"@types/webpack-env@npm:^1.15.2": + version: 1.18.8 + resolution: "@types/webpack-env@npm:1.18.8" + checksum: 10/f3932f3d6c2530f644cfc898eda1ab8182d6ae57f555c2f0179d813549b639078671b71e4041831fc306c5ebe61f5cdac794fe4ceae281fce8bf67e23661a488 + languageName: node + linkType: hard + +"@types/wrap-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/wrap-ansi@npm:3.0.0" + checksum: 10/8aa644946ca4e859668c36b8e2bcf2ac4bdee59dac760414730ea57be8a93ae9166ebd40a088f2ab714843aaea2a2a67f0e6e6ec11cfc9c8701b2466ca1c4089 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.10": + version: 8.18.2 + resolution: "@types/ws@npm:8.18.2" + dependencies: + "@types/node": "npm:*" + checksum: 10/7d87483731222387ba7d49a752b7eca6c29baeb3439d9c0a2ebe57b06bad0ce868cd850f4794c81aa93a90b2a35d7673c9b0362e7b940aace446144c17a894c2 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10/a794eb750e8ebc6273a51b12a0002de41343ffe46befef460bdbb57262d187fdf608bc6615b7b11c462c63c3ceb70abe2564c8dd8ee0f7628f38a314f74a9b9b + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.33, @types/yargs@npm:^17.0.8": + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10/47bcd4476a4194ea11617ea71cba8a1eddf5505fc39c44336c1a08d452a0de4486aedbc13f47a017c8efbcb5a8aa358d976880663732ebcbc6dbcbbecadb0581 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^8.17.0": + version: 8.72.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.72.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.72.0" + "@typescript-eslint/type-utils": "npm:8.72.0" + "@typescript-eslint/utils": "npm:8.72.0" + "@typescript-eslint/visitor-keys": "npm:8.72.0" + ignore: "npm:^7.0.5" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + "@typescript-eslint/parser": ^8.72.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/81234a9cdf232c1933b7ab81001a6a3ebfced991c41ace0a591ec37586a21c846bf5b03806efee3cf3b2c9add8e2da489ab823c92445e09ee24303b87fd383a0 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^8.16.0": + version: 8.72.0 + resolution: "@typescript-eslint/parser@npm:8.72.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.72.0" + "@typescript-eslint/types": "npm:8.72.0" + "@typescript-eslint/typescript-estree": "npm:8.72.0" + "@typescript-eslint/visitor-keys": "npm:8.72.0" + debug: "npm:^4.4.3" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/2ebb386c3c9d67ac555968334fd7a61f516705235ad71c2a9f489ada83112dc568b202dc1f9f95794be5cb850f6e69c9b8c80701151ddfe49c18abef008e13ac + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/project-service@npm:8.72.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.72.0" + "@typescript-eslint/types": "npm:^8.72.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/856d52de4ad0ee093ea4eaf8e6fec0e9b916e484b876e26eab29c956c08324f752c9e621604f6381a57168762a8ae9ba0b249d37873f16ed87c721e3303d11a5 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/scope-manager@npm:8.72.0" + dependencies: + "@typescript-eslint/types": "npm:8.72.0" + "@typescript-eslint/visitor-keys": "npm:8.72.0" + checksum: 10/2784d013091912cabc8bf86ac05e2038c3f22bd3d41b0fa28774cedf258eb968bf2823f4c318e42f723080686b1026f9de1b9880bd3cc1f57cdd4ddc4521b31c + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.72.0, @typescript-eslint/tsconfig-utils@npm:^8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.72.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/b6b446513e475fabcc900efe58d0c5f24d69e9e9fb717d3f49f8bb7e4f44b4906123ec21af2feb15a847e82f008310c6a5707cc0d473fdfd5226b63475e302a6 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/type-utils@npm:8.72.0" + dependencies: + "@typescript-eslint/types": "npm:8.72.0" + "@typescript-eslint/typescript-estree": "npm:8.72.0" + "@typescript-eslint/utils": "npm:8.72.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/5ea5d5879c05b003460e8b6345a8d9df8ac73a41bcc161e5fd03d1e7b94201b1b3a4739b5fec508a1674500e979ebfc08b9ea4d52649a48017c7563e40944c7e + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.72.0, @typescript-eslint/types@npm:^8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/types@npm:8.72.0" + checksum: 10/45d3b3b667b50352934feead34507930b2cbbb2ab8efffa507c89ba5cf99fdfa8d0e62346547f6c9f8463d2afa2e16e527c861160bd096ccafc660b602d9d415 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.72.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.72.0" + "@typescript-eslint/tsconfig-utils": "npm:8.72.0" + "@typescript-eslint/types": "npm:8.72.0" + "@typescript-eslint/visitor-keys": "npm:8.72.0" + debug: "npm:^4.4.3" + minimatch: "npm:^10.2.2" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/b588b1423ef38bfeff9e74313454998acff84e2bfe3bed524cfc22303318b58819a8589ceabb5a6de25b11d2670706803b6b00ca3a8428208469f68e5a4a4ad1 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.72.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.72.0 + resolution: "@typescript-eslint/utils@npm:8.72.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.72.0" + "@typescript-eslint/types": "npm:8.72.0" + "@typescript-eslint/typescript-estree": "npm:8.72.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/2f4f0083a7f4775f892eaf36bca0999917de027a3985a4c5ab02e0f8f1771a163e947e7b1d5e928cf12624b78bc112ca0fdf5e1c233100ab6cf790f733293153 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.72.0": + version: 8.72.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.72.0" + dependencies: + "@typescript-eslint/types": "npm:8.72.0" + eslint-visitor-keys: "npm:^5.0.0" + checksum: 10/db348dce2e373cae5e56410a5ea0b5cc33ccfc9abeb254ed46464dbbe0087d92a0c7000adba75e5c050d310b7df6cf5fb1f872c6b11cb3b2519af930d6d9d5ac + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.4.0 + resolution: "@ungap/structured-clone@npm:1.4.0" + checksum: 10/dee21ff372783fa1d4defba14ffdaf5133a27804032261a61293fa75331d1e6c8d137d95e00f5f19a53e580d689f9c8608542f9fc854cd0706bd395a0b55f5b1 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10/f83e6abe38057f5d87c1fb356513a371a8b43c9b87657f2790741a66b1ef8ecf958d1391bc42f27c5fb33f58ab8286a38ea849fdd21f433cd4df1307424bab45 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10/e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10/48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10/9690afeafa5e765a34620aa6216e9d40f9126d4e37e9726a2594bf60cab6b211ef20ab6670fd3c4449dd4a3497e69e49b2b725c8da0fb213208c7f45f15f5d5b + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10/e4c7d0b09811e1cda8eec644a022b560b28f4e974f50195375ccd007df5ee48a922a6dcff5ac40b6a8ec850d56d0ea6419318eee49fec7819ede14e90417a6a4 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10/3edd191fff7296df1ef3b023bdbe6cb5ea668f6386fd197ccfce46015c6f2a8cc9763cfb86503a0b94973ad27996645afff2252ee39a236513833259a47af6ed + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10/6b73874f906532512371181d7088460f767966f26309e836060c5a8e4e4bfe6d523fb5f4c034b34aa22ebb1192815f95f0e264298769485c1f0980fdd63ae0ce + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10/d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10/3a10542c86807061ec3230bac8ee732289c852b6bceb4b88ebd521a12fbcecec7c432848284b298154f28619e2746efbed19d6904aef06c49ef20a0b85f650cf + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10/27885e5d19f339501feb210867d69613f281eda695ac508f04d69fa3398133d05b6870969c0242b054dc05420ed1cc49a64dea4fe0588c18d211cddb0117cc54 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10/c62c50eadcf80876713f8c9f24106b18cf208160ab842fcb92060fd78c37bf37e7fcf0b7cbf1afc05d230277c2ce0f3f728432082c472dd1293e184a95f9dbdd + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/6085166b0987d3031355fe17a4f9ef0f412e08098d95454059aced2bd72a4c3df2bc099fa4d32d640551fc3eca1ac1a997b44432e46dc9d84642688e42c17ed4 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10/fa5d1ef8d2156e7390927f938f513b7fb4440dd6804b3d6c8622b7b1cf25a3abf1a5809f615896d4918e04b27b52bc3cbcf18faf2d563cb563ae0a9204a492db + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/07d9805fda88a893c984ed93d5a772d20d671e9731358ab61c6c1af8e0e58d1c42fc230c18974dfddebc9d2dd7775d514ba4d445e70080b16478b4b16c39c7d9 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10/cef09aad2fcd291bfcf9efdae2ea1e961a1ba0f925d1d9dcdd8c746d32fbaf431b6d26a0241699c0e39f82139018aa720b4ceb84ac6f4c78f13072747480db69 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10/ab033b032927d77e2f9fa67accdf31b1ca7440974c21c9cfabc8349e10ca2817646171c4f23be98d0e31896d6c2c3462a074fe37752e523abc3e45c79254259c + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10/7217bae9fe240e0d804969e7b2af11cb04ec608837c78b56ca88831991b287e232a0b7fce8d548beaff42aaf0197ffa471d81be6ac4c4e53b0148025a2c076ec + languageName: node + linkType: hard + +"@yarnpkg/fslib@npm:^3.1.2": + version: 3.1.5 + resolution: "@yarnpkg/fslib@npm:3.1.5" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/67b4850cdfbf0c11460302d997c0eacab46246cc8c7718a045beca346c494163e15768e2d20ab719ff6a98adbe7eaa9efcecdfd5cb0b8539f84a96449ac7ceaa + languageName: node + linkType: hard + +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 10/cd19e1114aaf10a05126aeea8833ef4ca8af8a46e88e12884f8359d19333fd19711036dbc2698dbe937f81f037070cf9a8da45c2e8c6ca19cafd7d15659094ed + languageName: node + linkType: hard + +"@yarnpkg/parsers@npm:^3.0.0": + version: 3.1.0 + resolution: "@yarnpkg/parsers@npm:3.1.0" + dependencies: + js-yaml: "npm:^4.3.0" + tslib: "npm:^2.4.0" + checksum: 10/8b2aee239e4798df8dc8c7bf9093a6905b32f9e91c5a2176a77a045baf429bb96e4b1fdbb2548dbf5ba320284a2725c020b7160493cb022a37547a7d0f5d700f + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10/ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 + languageName: node + linkType: hard + +"abbrev@npm:^5.0.0": + version: 5.0.0 + resolution: "abbrev@npm:5.0.0" + checksum: 10/a32641fb7a8ba0ad6f65efda80a632c965a2567f52c988897bffc47f473c4e9c3f0166de19d939866b1ed58ec50ce36f697d54a476589ca2706f8b5605ed41f0 + languageName: node + linkType: hard + +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10/67eaaa90e2917c58418e7a9b89392002d2b1ccd69bcca4799135d0c632f3b082f23f4ae4ddeedbced5aa59bcc7bdf4699c69ebed4593696c922462b7bc5744d6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/d4371eaef7995530b5b5ca4183ff6f062ca17901a6d3f673c9ac011b01ede37e7a1f7f61f8f5cfe709e88054757bb8f3277dc4061087cdf4f2a1f90ccbcdb977 + languageName: node + linkType: hard + +"acorn@npm:^8.15.0, acorn@npm:^8.9.0": + version: 8.19.0 + resolution: "acorn@npm:8.19.0" + bin: + acorn: bin/acorn + checksum: 10/99307d577b38d6a441cd478456633b5b669d32bc722633ff84f1f3c88d361735d7cf01d04ecbf1113c70f1f39e5ceceb95cd5bf93b15bacaddc8fca1ea5e7496 + languageName: node + linkType: hard + +"address@npm:^1.0.1, address@npm:^1.1.2": + version: 1.2.2 + resolution: "address@npm:1.2.2" + checksum: 10/57d80a0c6ccadc8769ad3aeb130c1599e8aee86a8d25f671216c40df9b8489d6c3ef879bc2752b40d1458aa768f947c2d91e5b2fedfe63cf702c40afdfda9ba9 + languageName: node + linkType: hard + +"adm-zip@npm:0.6.0": + version: 0.6.0 + resolution: "adm-zip@npm:0.6.0" + checksum: 10/6a49ab39055d8f716958d3a2055491ab86fe3359c4afeed9b14bbce78fb847bcd3cbaa0ff4921aaa19824aaa29d06691def1f53263db5224d06c068f922c5ba2 + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10/21fb903e0917e5cb16591b4d0ef6a028a54b83ac30cd1fca58dece3d4e0990512a8723f9f83130d88a41e2af8b1f7be1386fda3ea2d181bb1a62155e75e95e23 + languageName: node + linkType: hard + +"agent-base@npm:9.0.0": + version: 9.0.0 + resolution: "agent-base@npm:9.0.0" + checksum: 10/3a61414cd10dbb17fa8dae35124ffaa55fbb00f495004b2e7a8f4eca3a2b6ed9879474d4e2ebc27ee2f4207265652341525b4154e85c4d479be4854acd786bfb + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10/79bef167247789f955aaba113bae74bf64aa1e1acca4b1d6bb444bdf91d82c3e07e9451ef6a6e2e35e8f71a6f97ce33e3d855a5328eb9fad1bc3cc4cfd031ed8 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10/1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv-draft-04@npm:^1.0.0, ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/3f11fa0e7f7359bef6608657f02ab78e9cc62b1fb7bdd860db0d00351b3863a1189c1a23b72466d2d82726cab4eb20725c76f5e7c134a89865e2bfd0e6828137 + languageName: node + linkType: hard + +"ajv-errors@npm:^3.0.0, ajv-errors@npm:~3.0.0": + version: 3.0.0 + resolution: "ajv-errors@npm:3.0.0" + peerDependencies: + ajv: ^8.0.1 + checksum: 10/bd3403f8547dc12f7417c40b6a003f6d891c0123e365b4b3cd9fffb0edd29100ae682b92ef47dcb3a3b4642a702a246873d3758c3fb92e24dfa3443f97476421 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1, ajv-formats@npm:~2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/70c263ded219bf277ffd9127f793b625f10a46113b2e901e150da41931fcfd7f5592da6d66862f4449bb157ffe65867c3294a7df1d661cc232c4163d5a1718ed + languageName: node + linkType: hard + +"ajv-formats@npm:^3.0.1, ajv-formats@npm:~3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/5679b9f9ced9d0213a202a37f3aa91efcffe59a6de1a6e3da5c873344d3c161820a1f11cc29899661fee36271fd2895dd3851b6461c902a752ad661d1c1e8722 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10/d57c9d5bf8849bddcbd801b79bc3d2ddc736c2adb6b93a6a365429589dd7993ddbd5d37c6025ed6a7f89c27506b80131d5345c5b1fa6a97e40cd10a96bcd228c + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10/5021f96ab7ddd03a4005326bd06f45f448ebfbb0fe7018b1b70b6c28142fa68372bda2057359814b83fd0b2d4c8726c297f0a7557b15377be7b56ce5344533d8 + languageName: node + linkType: hard + +"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.15.0 + resolution: "ajv@npm:6.15.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10/0916dda09c152fb5857bc1cc7ce61718e9cec5b7faeff44a74f5e324eed8a556e1a84856724ea322a067b436ecad9f74ac8295fd395449788cca52f0c25bd5fb + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.17.1, ajv@npm:^8.18.0, ajv@npm:^8.20.0, ajv@npm:^8.9.0, ajv@npm:~8.20.0": + version: 8.20.0 + resolution: "ajv@npm:8.20.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/5ce59c0537f4c2aca9a758b412659ec70acb4d5dde971c10ecf21d2e3d799f99acdb4a08e1f5fb2e067c8542930398aae793bb996bb07d3feb81dae22fe2ada9 + languageName: node + linkType: hard + +"ajv@npm:~8.18.0": + version: 8.18.0 + resolution: "ajv@npm:8.18.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/bfed9de827a2b27c6d4084324eda76a4e32bdde27410b3e9b81d06e6f8f5c78370fc6b93fe1d869f1939ff1d7c4ae8896960995acb8425e3e9288c8884247c48 + languageName: node + linkType: hard + +"anser@npm:^2.1.1": + version: 2.3.5 + resolution: "anser@npm:2.3.5" + checksum: 10/55301fd884ea18ac55fb2ececef2133cbb5ea9b9749f57815cc78f22f5f6fee7783f6d0f079f8664cb9a85638f94d321e53836a589315dad80ef6ea5d881194f + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10/8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 + languageName: node + linkType: hard + +"ansi-escapes@npm:^7.0.0": + version: 7.3.0 + resolution: "ansi-escapes@npm:7.3.0" + dependencies: + environment: "npm:^1.0.0" + checksum: 10/189e23e75aacf00ee647ba0545687456cc4bc62547dd0cf6c7728f91fce88854c8e885d5819a278b39981bb846d9427693d2380c562aecdb0cf91d3342141e93 + languageName: node + linkType: hard + +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10/08df3696720edacd001a8d53b197bb5728242c55484680117dab9f7633a6320e961a939bddd88ee5c71d4a64f3ddb49444d1c694bd0668adbb3f95ba114f2386 + languageName: node + linkType: hard + +"ansi-regex@npm:^4.1.0": + version: 4.1.1 + resolution: "ansi-regex@npm:4.1.1" + checksum: 10/b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10/2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.1.0, ansi-regex@npm:^6.2.2": + version: 6.4.0 + resolution: "ansi-regex@npm:6.4.0" + checksum: 10/8d0305a47218c994a15348d556d358c9a0b3a7abbd51be1c502447813839fb2b0f12700fca9e842acdd79e5740bb2a2d291880b4d770c1634068732a2a3091e5 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10/b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10/c49dad7639f3e48859bd51824c93b9eb0db628afc243c51c3dd2410c4a15ede1a83881c6c7341aa2b159c4f90c11befb38f2ba848c07c66c9f9de4bcd7cb9f30 + languageName: node + linkType: hard + +"ansis@npm:4.2.0": + version: 4.2.0 + resolution: "ansis@npm:4.2.0" + checksum: 10/493e15fad267bd6e3e275d6886c3b3c96a075784d9eae3e16d16383d488e94cc3deb1b357e1246f572599767360548ef9e5b7eab9b72e4ee3f7bad9ce6bc8797 + languageName: node + linkType: hard + +"any-promise@npm:^1.0.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 10/6737469ba353b5becf29e4dc3680736b9caa06d300bda6548812a8fee63ae7d336d756f88572fa6b5219aed36698d808fa55f62af3e7e6845c7a1dc77d240edb + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10/3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7, argparse@npm:~1.0.9": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10/c6a621343a553ff3779390bb5ee9c2263d6643ebcd7843227bdde6cc7adbed796eb5540ca98db19e3fd7b4714e1faa51551f8849b268bb62df27ddb15cbcd91e + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10/18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef + languageName: node + linkType: hard + +"argparse@npm:^3.0.3": + version: 3.0.3 + resolution: "argparse@npm:3.0.3" + checksum: 10/6834e247fe8a8d21a0061dc2b7134ae79625d9ab795eca043d8ba9434be3bc1e7d049c9a4aa01bd3d6bfc145b29addfb290d17b8b3f7b11710cc52ab13629f31 + languageName: node + linkType: hard + +"aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10/b2fe9bc98bd401bc322ccb99717c1ae2aaf53ea0d468d6e7aebdc02fac736e4a99b46971ee05b783b08ade23c675b2d8b60e4a1222a95f6e27bc4d2a0bfdcc03 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10/0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10/e13c9d247241be82f8b4ec71d035ed7204baa82fae820d4db6948d30d3c4a9f2b3905eb2eec2b937d4aa3565200bd3a1c500480114cff649fa748747d2a50feb + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8, array-includes@npm:^3.1.9": + version: 3.2.0 + resolution: "array-includes@npm:3.2.0" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.2" + es-object-atoms: "npm:^1.1.2" + es-shim-unscopables: "npm:^1.1.0" + is-string: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + checksum: 10/c6b00774aa3f0100dbc5443722b69b0aa7ff5e31e28d2fc9ac69adc394c9fba4bc5cfea292bfbb20369a9657a8a67e0e9a128863cc0f9c426852e7cb11f6715e + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10/5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/7dffcc665aa965718ad6de7e17ac50df0c5e38798c0a5bf9340cf24feb8594df6ec6f3fcbe714c1577728a1b18b5704b15669474b27bceeca91ef06ce2a23c31 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.6": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-shim-unscopables: "npm:^1.1.0" + checksum: 10/5ddb6420e820bef6ddfdcc08ce780d0fd5e627e97457919c27e32359916de5a11ce12f7c55073555e503856618eaaa70845d6ca11dcba724766f38eb1c22f7a2 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/f9b992fa0775d8f7c97abc91eb7f7b2f0ed8430dd9aeb9fdc2967ac4760cdd7fc2ef7ead6528fef40c7261e4d790e117808ce0d3e7e89e91514d4963a531cd01 + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/473534573aa4b37b1d80705d0ce642f5933cccf5617c9f3e8a56686e9815ba93d469138e86a1f25d2fe8af999c3d24f54d703ec1fc2db2e6778d46d0f4ac951e + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/874694e5d50e138894ff5b853e639c29b0aa42bbd355acda8e8e9cd337f1c80565f21edc15e8c727fa4c0877fd9d8783c575809e440cc4d2d19acaa048bf967d + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10/4821ebdfe7d699f910c7f09bc9fa996f09b96b80bccb4f5dd4b59deae582f6ad6e505ecef6376f8beac1eda06df2dbc89b70e82835d104d6fcabd33c1aed1ae9 + languageName: node + linkType: hard + +"asn1.js@npm:^4.10.1": + version: 4.10.1 + resolution: "asn1.js@npm:4.10.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10/5a02104b9ba167917c786a3fdac9840a057d29e6b609250e6af924d0529ead1a32417da13eec809cadea8f991eb67782196f3df427c5b4f30eaf22044fc64fda + languageName: node + linkType: hard + +"asn1js@npm:^3.0.10, asn1js@npm:^3.0.6": + version: 3.1.0 + resolution: "asn1js@npm:3.1.0" + dependencies: + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.2.0" + tslib: "npm:^2.8.1" + checksum: 10/bc08cdd2ad0bd03606719f2153660ba0641d548c40ee137c79369fddcccaf3e2a0a0e4c5893e677ae74b21e2356d177654464efaee519a30f2f2891de9dc6471 + languageName: node + linkType: hard + +"assert@npm:^2.0.0": + version: 2.1.0 + resolution: "assert@npm:2.1.0" + dependencies: + call-bind: "npm:^1.0.2" + is-nan: "npm:^1.3.2" + object-is: "npm:^1.1.5" + object.assign: "npm:^4.1.4" + util: "npm:^0.12.5" + checksum: 10/6b9d813c8eef1c0ac13feac5553972e4bd180ae16000d4eb5c0ded2489188737c75a5aacefc97a985008b37502f62fe1bad34da1a7481a54bbfabec3964c8aa7 + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 10/85a1c24af4707871c27cfe456bd2ff7fcbe678f3d1c878ac968c9557735a171a17bdcc8c8f903ceab3fc3c49d5b3da2194e6ab0a6be7fec0e133fa028f21ba1b + languageName: node + linkType: hard + +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10/c55b375b9aaf44713d8c0f77a08215ab6d44f368b13e44f2141c421022af3c62b615a30c8ea629457f0cbaec409c713401c0188a124552c8fe4a5ad6b17ff3c3 + languageName: node + linkType: hard + +"astring@npm:^1.8.1": + version: 1.9.0 + resolution: "astring@npm:1.9.0" + bin: + astring: bin/astring + checksum: 10/ee88f71d8534557b27993d6d035ae85d78488d8dbc6429cd8e8fdfcafec3c65928a3bdc518cf69767a1298d3361490559a4819cd4b314007edae1e94cf1f9e4c + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10/1a09379937d846f0ce7614e75071c12826945d4e417db634156bf0e4673c495989302f52186dfa9767a1d9181794554717badd193ca2bbab046ef1da741d8efd + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10/3d49e7acbeee9e84537f4cb0e0f91893df8eba976759875ae8ee9e3d3c82f6ecdebdb347c2fad9926b92596d93cdfc78ecc988bcdf407e40433e8e8e6fe5d78e + languageName: node + linkType: hard + +"async@npm:^3.2.6": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10/3ce727cbc78f69d6a4722517a58ee926c8c21083633b1d3fdf66fd688f6c127a53a592141bd4866f9b63240a86e9d8e974b13919450bd17fa33c2d22c4558ad8 + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 10/463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab + languageName: node + linkType: hard + +"axe-core@npm:^4.10.0": + version: 4.14.0 + resolution: "axe-core@npm:4.14.0" + checksum: 10/b41f9c5fb670b3e1812ba203b17570efa026071e6c722cd8384bacbe5f2be1578fc5d7544acf06df7758eb755c7d23629df922e86cc0655d656784157c0d8df5 + languageName: node + linkType: hard + +"axios@npm:^1.20.0": + version: 1.20.0 + resolution: "axios@npm:1.20.0" + dependencies: + follow-redirects: "npm:^1.16.0" + form-data: "npm:^4.0.6" + https-proxy-agent: "npm:^5.0.1" + proxy-from-env: "npm:^2.1.0" + checksum: 10/0376b6178baecbe0f5d36088f5b5f6c21362ce301e0731f77172f9c89be740bdee20d8ae6ab186340d7cb752020c6a4f1381290e5a5cd10f6f9003941615ac77 + languageName: node + linkType: hard + +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10/e275dea9b673f71170d914f2d2a18be5d57d8d29717b629e7fedd907dcc2ebdc7a37803ff975874810bd423f222f299c020d28fde40a146f537448bf6bfecb6e + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10/9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10/fb07bb66a0959c2843fc055838047e2a95ccebb837c519614afb067ebfdf2fa967ca8d712c35ced07f2cd26fc6f07964230b094891315ad74f11eba3d53178a0 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10/669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"baseline-browser-mapping@npm:^2.11.29": + version: 2.11.32 + resolution: "baseline-browser-mapping@npm:2.11.32" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10/970c9f6e3c56717f5ba8ef6af8fa919da249d57fbcd5d6f7de70b85141fdbafdd952d9e041a29da644287e3c9fc68c584311beca8ed4681bc1d7cd46b7e84211 + languageName: node + linkType: hard + +"basic-ftp@npm:^5.3.1": + version: 5.3.1 + resolution: "basic-ftp@npm:5.3.1" + checksum: 10/9232ee155114efafadf5adee86a6750208653a9071e53e9803dceac61a66b3ba3974771ff2490ff28f1a118fdfb806ffcc488f64609e61a9cedb52480b312843 + languageName: node + linkType: hard + +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 10/61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f + languageName: node + linkType: hard + +"better-path-resolve@npm:1.0.0": + version: 1.0.0 + resolution: "better-path-resolve@npm:1.0.0" + dependencies: + is-windows: "npm:^1.0.0" + checksum: 10/5392dbe04e7fe68b944eb37961d9dfa147aaac3ee9ee3f6e13d42e2c9fbe949e68d16e896c14ee9016fa5f8e6e53ec7fd8b5f01b50a32067a7d94ac9cfb9a050 + languageName: node + linkType: hard + +"bfj@npm:^9.0.2": + version: 9.1.4 + resolution: "bfj@npm:9.1.4" + dependencies: + check-types: "npm:^11.2.3" + hoopy: "npm:^0.1.4" + tryer: "npm:^1.0.1" + checksum: 10/07e3617898d7618e47eeae710c76d5496e33cb7ce8f72be05f6bc5d95b5079785be348f0a915cb07000b9f6ff547df3f2bcd213b133ccef583fbdeb6adc85196 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10/c04416aeb084f4aa1c5857722439c327cc0ada9bd99ab80b650e3f30e2e4f1b92a04527ed1e7df8ffcd7c0ea311745a04af12d53e2f091bf09a06f1292003827 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10/bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 + languageName: node + linkType: hard + +"bl@npm:^4.0.3, bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10/b7904e66ed0bdfc813c06ea6c3e35eafecb104369dbf5356d0f416af90c1546de3b74e5b63506f0629acf5e16a6f87c3798f16233dcff086e9129383aa02ab55 + languageName: node + linkType: hard + +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": + version: 4.12.5 + resolution: "bn.js@npm:4.12.5" + checksum: 10/be6afe3e31e812e240983a6661e4c8f31f7f5a28e6fc4fbd8ea04d18c887ce4a5089c4bd28d8495a535411deda84d1125f72bcfa253f223067d15f743d8e65a8 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.1, bn.js@npm:^5.2.3": + version: 5.2.5 + resolution: "bn.js@npm:5.2.5" + checksum: 10/10b1ac91e76fd828c1187cf65a9f1a0374e7afb9acd167e19c2d7c4108f6216841007c1e3aef145fa95cc7b3d07f705236a707184af1537667362b3a842d01ac + languageName: node + linkType: hard + +"body-parser@npm:~1.20.5": + version: 1.20.9 + resolution: "body-parser@npm:1.20.9" + dependencies: + bytes: "npm:~3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.16.0" + raw-body: "npm:~2.5.3" + type-is: "npm:~1.6.18" + unpipe: "npm:~1.0.0" + checksum: 10/e9ccf7a920205d674a83cdfae0e83ed3cfe32af668706034e9832a8bf3b80f06fbc18a7c26759611f72d334311683a4b1ff73661690038a352e8c3b4a424b709 + languageName: node + linkType: hard + +"bonjour-service@npm:^1.2.1": + version: 1.4.4 + resolution: "bonjour-service@npm:1.4.4" + dependencies: + fast-deep-equal: "npm:^3.1.3" + multicast-dns: "npm:^7.2.5" + checksum: 10/3a36f694cc05af3c5f2a9242478e8e4ede58e1ac6c8ac2aae38eee06fed48a3df4e3959672e3f4ef4a55585784325c47d512eca470d88b5bd75c29a4bedd4942 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10/3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.21 + resolution: "brace-expansion@npm:1.1.21" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10/6c0ed34107cb3bd3f44c01d90ec8c01baa3ed75b7755617e2e5797b5908bbf20b313edf575612b200a783b84c7d1826aec2f7a2f03de9905bbfae5dc3dea6a95 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1, brace-expansion@npm:^2.0.2": + version: 2.1.7 + resolution: "brace-expansion@npm:2.1.7" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10/4763be07b688136db4f98f71ab96c4a1a73b6785f69864c130c748f4429be961c6a9a4129c0a81aad4f9cfb08e31a3cf2809b2427509bf2990d1490b7b5dd2d0 + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.2, brace-expansion@npm:^5.0.8": + version: 5.0.12 + resolution: "brace-expansion@npm:5.0.12" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10/65b550f1836e3b43f512f12afbc3be96616eee5c353e16d70181b7dffec8c08beabffb51d69a3bbdb27d675840725cbab025fda9d10716b5cda7dd864dc7bc4a + languageName: node + linkType: hard + +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 + languageName: node + linkType: hard + +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10/8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be + languageName: node + linkType: hard + +"browser-resolve@npm:^2.0.0": + version: 2.0.0 + resolution: "browser-resolve@npm:2.0.0" + dependencies: + resolve: "npm:^1.17.0" + checksum: 10/ad5314db3429a903b07d6445137588665c4677d6276298bb08f0623f05cb107762b73c78f03b4f954a712bd1ebaf98e349b9d98e423123a42804924327a5acd4 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: "npm:^1.0.3" + cipher-base: "npm:^1.0.0" + create-hash: "npm:^1.1.0" + evp_bytestokey: "npm:^1.0.3" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10/2813058f74e083a00450b11ea9d5d1f072de7bf0133f5d122d4ff7b849bece56d52b9c51ad0db0fad21c0bc4e8272fd5196114bbe7b94a9b7feb0f9fbb33a3bf + languageName: node + linkType: hard + +"browserify-cipher@npm:^1.0.1": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: 10/2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13 + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10/2fd9018e598b1b25e002abaf656d46d8e0f2ee2666ff18852d37e5c3d0e47701d6824256b060fac395420d56a0c49c2b0d40a194e6fbd837bfdd893e7eb5ade4 + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.1": + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" + dependencies: + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 10/62ae0da60e49e8d5dd3b0922119b6edee94ebfa3a184211c804024b3a75f9dab31a1d124cc0545ed050e273f0325c2fd7aba6a51e44ba6f726fceae3210ddade + languageName: node + linkType: hard + +"browserify-sign@npm:^4.2.3": + version: 4.2.6 + resolution: "browserify-sign@npm:4.2.6" + dependencies: + bn.js: "npm:^5.2.3" + browserify-rsa: "npm:^4.1.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.6.1" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.9" + readable-stream: "npm:^2.3.8" + safe-buffer: "npm:^5.2.1" + checksum: 10/3fb106b3690958e0a0784e5a0a231839f3f0dfcb336b61cf793651280d3ee8603dc07d34aeaab42c3555f1cc8fbd0b705624c2dbfd7d184e845fbe5ba26fa61f + languageName: node + linkType: hard + +"browserify-zlib@npm:^0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: "npm:~1.0.5" + checksum: 10/852e72effdc00bf8acc6d167d835179eda9e5bd13721ae5d0a2d132dc542f33e73bead2959eb43a2f181a9c495bc2ae2bdb4ec37c4e37ff61a0277741cbaaa7a + languageName: node + linkType: hard + +"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.28.1": + version: 4.29.4 + resolution: "browserslist@npm:4.29.4" + dependencies: + baseline-browser-mapping: "npm:^2.11.29" + caniuse-lite: "npm:^1.0.30001816" + electron-to-chromium: "npm:^1.5.459" + node-releases: "npm:^2.0.59" + update-browserslist-db: "npm:^1.3.4" + bin: + browserslist: cli.js + checksum: 10/464cf2ecd1783c17f5c2195b58f4a0732922157e2262ceb1c4fcfaab8d39cb5f044296b4cfe54cfa08e7a0beb2ace2c2001a0d055a4b2c254063a30670401e39 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10/0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10/4a63d48b5117c7eda896d81cd3582d9707329b07c97a14b0ece2edc6e64220ea7ea17c94b295e8c2cb7b9f8291e2b079f9096be8ac14be238420a43e06ec66e2 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0, buffer@npm:^5.7.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10/997434d3c6e3b39e0be479a80288875f71cd1c07d75a3855e6f08ef848a3c966023f79534e22e415ff3a5112708ce06127277ab20e527146d55c84566405c7c6 + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10/b6bc68237ebf29bdacae48ce60e5e28fc53ae886301f2ad9496618efac49427ed79096750033e7eab1897a4f26ae374ace49106a5758f38fb70c78c9fda2c3b1 + languageName: node + linkType: hard + +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: 10/1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773 + languageName: node + linkType: hard + +"bundle-name@npm:^4.1.0": + version: 4.1.1 + resolution: "bundle-name@npm:4.1.1" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 10/2fe343a70368a3d3d8c6788ee50876bdbc1e698ba38588b1ddf09599917c57ca80b91a6b363d58e596caf2e06e240e34eb86cb9da672e35dcfc1dfff6f90b1d9 + languageName: node + linkType: hard + +"bytes@npm:3.1.2, bytes@npm:~3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 + languageName: node + linkType: hard + +"bytestreamjs@npm:^2.0.1": + version: 2.0.1 + resolution: "bytestreamjs@npm:2.0.1" + checksum: 10/523b1024e3f887cdc0b3db7c4fc14b8563aaeb75e6642a41991b3208277fd0ae9cd66003c73473fe706c42797bf0c3f1f498fb9880b431d75b332e5709d56a0c + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.4 + resolution: "cacache@npm:18.0.4" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10/ca2f7b2d3003f84d362da9580b5561058ccaecd46cba661cbcff0375c90734b610520d46b472a339fd032d91597ad6ed12dde8af81571197f3c9772b5d35b104 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": + version: 1.0.9 + resolution: "call-bind@npm:1.0.9" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + get-intrinsic: "npm:^1.3.0" + set-function-length: "npm:^1.2.2" + checksum: 10/25b1a98d6158f0adf9fface594ca82be4e3ed481d8ff7f36ad1fccb0c8377e38c6a04ff3248693723222d378677e93077c739defc8a6741c82b7e00bcee1245d + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 + languageName: node + linkType: hard + +"call-me-maybe@npm:^1.0.2": + version: 1.0.2 + resolution: "call-me-maybe@npm:1.0.2" + checksum: 10/3d375b6f810a82c751157b199daba60452876186c19ac653e81bfc5fc10d1e2ba7aedb8622367c3a8aca6879f0e6a29435a1193b35edb8f7fd8267a67ea32373 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10/bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + +"caniuse-api@npm:^3.0.0": + version: 3.0.0 + resolution: "caniuse-api@npm:3.0.0" + dependencies: + browserslist: "npm:^4.0.0" + caniuse-lite: "npm:^1.0.0" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10/db2a229383b20d0529b6b589dde99d7b6cb56ba371366f58cbbfa2929c9f42c01f873e2b6ef641d4eda9f0b4118de77dbb2805814670bdad4234bf08e720b0b4 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001816": + version: 1.0.30001819 + resolution: "caniuse-lite@npm:1.0.30001819" + checksum: 10/3ddcc8c96dab52d87c76caee88afd2409b0e66b4b67c9ce9dfe98b84a16b90f1d931ea0c31f52693d45b4318aaa25965b75ab51c1f12d03e261531d716cb34cd + languageName: node + linkType: hard + +"chalk@npm:2.4.2, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10/3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 + languageName: node + linkType: hard + +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 + languageName: node + linkType: hard + +"chalk@npm:5.6.2, chalk@npm:^5.4.1": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10/1b2f48f6fba1370670d5610f9cd54c391d6ede28f4b7062dd38244ea5768777af72e5be6b74fb6c6d54cb84c4a2dff3f3afa9b7cb5948f7f022cfd3d087989e0 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10/1ec5c2906adb9f84e7f6732a40baef05d7c85401b82ffcbc44b85fbd0f7a2b0c2a96f2eb9cf55cae3235dc12d4023003b88f09bcae8be9ae894f52ed746f4d48 + languageName: node + linkType: hard + +"chardet@npm:^2.1.1": + version: 2.2.0 + resolution: "chardet@npm:2.2.0" + checksum: 10/78d1e5ba7bdc7db23511a194eedca805918df90a511f9c57f9cc7c1fc03702ed4ad053e485a766ace930362869269c4a731feaf460ae24bd3ed7d190cde8087d + languageName: node + linkType: hard + +"check-types@npm:^11.2.3": + version: 11.2.3 + resolution: "check-types@npm:11.2.3" + checksum: 10/557e119fa018d7de4e873ada0a6c8917a0f6e0955dc19293396405f5292cfcfe190457557f4cc422e6845d715ef6bbb1d0ab9198ff6735dd96ac50e3ef1e2424 + languageName: node + linkType: hard + +"chokidar@npm:^3.3.1, chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + +"chokidar@npm:^4.0.1, chokidar@npm:^4.0.3": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10/bf2a575ea5596000e88f5db95461a9d59ad2047e939d5a4aac59dd472d126be8f1c1ff3c7654b477cf532d18f42a97279ef80ee847972fd2a25410bf00b80b59 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10/115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10/c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10/b63cb1f73d171d140a2ed8154ee6566c8ab775d3196b0e03a2a94b5f6a0ce7777ee5685ca56849403c8d17bd457a6540672f9a60696a6137c7a409097495b82c + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: 10/1762bed739774903bf5915fe3045c3120fc3c7f7d929d88e566447ea38944937a6370ccb687278318c43c24f837ad22dac780bed67c066336815557b8cf558c6 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.7 + resolution: "cipher-base@npm:1.0.7" + dependencies: + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + to-buffer: "npm:^1.2.2" + checksum: 10/9501d2241b7968aaae74fc3db1d6a69a804e0b14117a8fd5d811edf351fcd39a1807bfd98e090a799cfe98b183fbf2e01ebb57f1239080850db07b68dcd9ba02 + languageName: node + linkType: hard + +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10/2db1ae37b384c8ff0a06a12bfa80f56cc02b4abcaaf340db98c0ae88a61dd67c856653fd8135ace6eb0ec13aeab3089c425d2e4238d2a2ad6b6917e6ccc74729 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10/2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cleye@npm:^2.6.0": + version: 2.7.0 + resolution: "cleye@npm:2.7.0" + dependencies: + ansis: "npm:4.2.0" + terminal-columns: "npm:^2.0.0" + type-flag: "npm:^4.5.2" + checksum: 10/93f8615e5760b8b28511b3f45af163e89ce39196e8d7e2bc37f9d1445b5c5ad02b11a64bf590a38145be3c782303bd5235c2c919873388aae24c5c517808ee3a + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10/2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + languageName: node + linkType: hard + +"cli-highlight@npm:^2.1.11": + version: 2.1.11 + resolution: "cli-highlight@npm:2.1.11" + dependencies: + chalk: "npm:^4.0.0" + highlight.js: "npm:^10.7.1" + mz: "npm:^2.4.0" + parse5: "npm:^5.1.1" + parse5-htmlparser2-tree-adapter: "npm:^6.0.0" + yargs: "npm:^16.0.0" + bin: + highlight: bin/highlight + checksum: 10/05d2b5beb8a4d3259f693517d013bf53d04ad20f470b77c3d02e051963092fae388388e3127f67d3679884a0c32cb855bf590292017c5e68c0f8d86f4b8e146e + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10/a0a863f442df35ed7294424f5491fa1756bd8d2e4ff0c8736531d886cec0ece4d85e8663b77a5afaf1d296e3cbbebff92e2e99f52bbea89b667cbe789b994794 + languageName: node + linkType: hard + +"cli-table3@npm:^0.6.5": + version: 0.6.5 + resolution: "cli-table3@npm:0.6.5" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10/8dca71256f6f1367bab84c33add3f957367c7c43750a9828a4212ebd31b8df76bd7419d386e3391ac7419698a8540c25f1a474584028f35b170841cde2e055c5 + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 10/8730848b04fb189666ab037a35888d191c8f05b630b1d770b0b0e4c920b47bb5cc14bddf6b8ffe5bfc66cee97c8211d4d18e756c1ffcc75d7dbe7e1186cd7826 + languageName: node + linkType: hard + +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10/b58876fbf0310a8a35c79b72ecfcf579b354e18ad04e6b20588724ea2b522799a758507a37dfe132fafaf93a9922cafd9514d9e1598e6b2cd46694853aed099f + languageName: node + linkType: hard + +"cliui@npm:7.0.4, cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10/db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10/eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 + languageName: node + linkType: hard + +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" + dependencies: + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10/df43d8d1c6e3254cbb64b1905310d5f6672c595496a3cbe76946c6d24777136886470686f2772ac9edfe547a74bb70e8017530b3554715aee119efd7752fc0d9 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10/d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd + languageName: node + linkType: hard + +"code-block-writer@npm:^13.0.3": + version: 13.0.3 + resolution: "code-block-writer@npm:13.0.3" + checksum: 10/771546224f38610eecee0598e83c9e0f86dcd600ea316dbf27c2cfebaab4fed51b042325aa460b8e0f131fac5c1de208f6610a1ddbffe4b22e76f9b5256707cb + languageName: node + linkType: hard + +"codeowners-utils@npm:^1.0.2": + version: 1.0.2 + resolution: "codeowners-utils@npm:1.0.2" + dependencies: + cross-spawn: "npm:^7.0.2" + find-up: "npm:^4.1.0" + ignore: "npm:^5.1.4" + locate-path: "npm:^5.0.0" + checksum: 10/7457b4841054a81eba8e3c6634e0e7b629ab2e8289ebef064d83d6c5b34746f484d9c552749691131707d6625b65d0d2e4b8762286884f149a667399bfbd3edf + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10/fa00c91b4332b294de06b443923246bccebe9fab1b253f7fe1772d37b06a2269b4039a85e309abe1fe11b267b11c08d1d0473fda3badd6167f57313af2887a64 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"colord@npm:^2.9.1": + version: 2.10.0 + resolution: "colord@npm:2.10.0" + checksum: 10/0983763f320b52e9026a59bd7f7633f1487130310d1f381901d14939b3a6e0aef3128c8bd8e5669ededbda0b69e6ba12c801c8905fce6de359284d1ff5d48431 + languageName: node + linkType: hard + +"colorette@npm:2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 10/6e2606435cd30e1cae8fc6601b024fdd809e20515c57ce1e588d0518403cff0c98abf807912ba543645a9188af36763b69b67e353d47397f24a1c961aba300bd + languageName: node + linkType: hard + +"colorette@npm:^2.0.10": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10/0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10/2e969e637d05d09fa50b02d74c83a1186f6914aae89e6653b62595cc75a221464f884f55f231b8f4df7a49537fba60bdc0427acd2bf324c09a1dbb84837e36e4 + languageName: node + linkType: hard + +"command-exists@npm:^1.2.9": + version: 1.2.9 + resolution: "command-exists@npm:1.2.9" + checksum: 10/46fb3c4d626ca5a9d274f8fe241230817496abc34d12911505370b7411999e183c11adff7078dd8a03ec4cf1391290facda40c6a4faac8203ae38c985eaedd63 + languageName: node + linkType: hard + +"commander@npm:11.1.0": + version: 11.1.0 + resolution: "commander@npm:11.1.0" + checksum: 10/66bd2d8a0547f6cb1d34022efb25f348e433b0e04ad76a65279b1b09da108f59a4d3001ca539c60a7a46ea38bcf399fc17d91adad76a8cf43845d8dcbaf5cda1 + languageName: node + linkType: hard + +"commander@npm:8.3.0, commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10/6b7b5d334483ce24bd73c5dac2eab901a7dbb25fd983ea24a1eeac6e7166bb1967f641546e8abf1920afbde86a45fbfe5812fbc69d0dc451bb45ca416a12a3a3 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10/8799faa84a30da985802e661cc9856adfaee324d4b138413013ef7f087e8d7924b144c30a1f1405475f0909f467665cd9e1ce13270a2f41b141dab0b7a58f3fb + languageName: node + linkType: hard + +"commander@npm:^14.0.3": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10/dfa9ebe2a433d277de5cb0252d23b10a543d245d892db858d23b516336a835c50fd4f52bee4cd13c705cc8acb6f03dc632c73dd806f7d06d3353eb09953dd17a + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b + languageName: node + linkType: hard + +"commander@npm:^4.0.0": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: 10/3b2dc4125f387dab73b3294dbcb0ab2a862f9c0ad748ee2b27e3544d25325b7a8cdfbcc228d103a98a716960b14478114a5206b5415bd48cdafa38797891562c + languageName: node + linkType: hard + +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10/9973af10727ad4b44f26703bf3e9fdc323528660a7590efe3aa9ad5042b4584c0deed84ba443f61c9d6f02dade54a5a5d3c95e306a1e1630f8374ae6db16c06d + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10/4620bc4936a4ef12ce7dfcd272bb23a99f2ad68889a4e4ad766c9f8ad21af982511934d6f7050d4a8bde90011b1c15d56e61a1b4576d9913efbf697a20172d6c + languageName: node + linkType: hard + +"compare-versions@npm:6.1.1": + version: 6.1.1 + resolution: "compare-versions@npm:6.1.1" + checksum: 10/9325c0fadfba81afa0ec17e6fc2ef823ba785c693089698b8d9374e5460509f1916a88591644d4cb4045c9a58e47fafbcc0724fe8bf446d2a875a3d6eeddf165 + languageName: node + linkType: hard + +"compressible@npm:~2.0.18": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: "npm:>= 1.43.0 < 2" + checksum: 10/58321a85b375d39230405654721353f709d0c1442129e9a17081771b816302a012471a9b8f4864c7dbe02eef7f2aaac3c614795197092262e94b409c9be108f0 + languageName: node + linkType: hard + +"compression@npm:^1.8.1": + version: 1.8.2 + resolution: "compression@npm:1.8.2" + dependencies: + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" + debug: "npm:2.6.9" + destroy: "npm:1.2.0" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.1.0" + safe-buffer: "npm:5.2.1" + vary: "npm:~1.1.2" + checksum: 10/5b17675cf4abcaff03b83f4be417fb256df4568c7626a65fc4b38cb8ebeb9c0f3917ee79df20cbec90e53d5758ad0d9ae51d5d4669256e22247b16308d290a04 + languageName: node + linkType: hard + +"compute-gcd@npm:^1.2.1": + version: 1.2.1 + resolution: "compute-gcd@npm:1.2.1" + dependencies: + validate.io-array: "npm:^1.0.3" + validate.io-function: "npm:^1.0.2" + validate.io-integer-array: "npm:^1.0.0" + checksum: 10/51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 + languageName: node + linkType: hard + +"compute-lcm@npm:^1.1.2": + version: 1.1.2 + resolution: "compute-lcm@npm:1.1.2" + dependencies: + compute-gcd: "npm:^1.2.1" + validate.io-array: "npm:^1.0.3" + validate.io-function: "npm:^1.0.2" + validate.io-integer-array: "npm:^1.0.0" + checksum: 10/d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10/9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 + languageName: node + linkType: hard + +"concat-with-sourcemaps@npm:^1.1.0": + version: 1.1.0 + resolution: "concat-with-sourcemaps@npm:1.1.0" + dependencies: + source-map: "npm:^0.6.1" + checksum: 10/57faa6f4a6f38a1846a58f96b2745ec8435755e0021f069e89085c651d091b78d9bc20807ea76c38c85021acca80dc2fa4cedda666aade169b602604215d25b9 + languageName: node + linkType: hard + +"concurrently@npm:^10.0.5": + version: 10.0.6 + resolution: "concurrently@npm:10.0.6" + dependencies: + chalk: "npm:5.6.2" + rxjs: "npm:7.8.2" + shell-quote: "npm:1.12.0" + supports-color: "npm:10.2.2" + tree-kill: "npm:1.2.2" + yargs: "npm:18.0.0" + bin: + conc: dist/bin/index.js + concurrently: dist/bin/index.js + checksum: 10/52b7817ff389036e963a2f1a2b0e1180e76a85a169e067c497c7cc3c6e3da93617c69ae44440c9e62ace07d87326e5b9edd304eba564f41fa8fa3843df0c4b74 + languageName: node + linkType: hard + +"connect-history-api-fallback@npm:^2.0.0": + version: 2.0.0 + resolution: "connect-history-api-fallback@npm:2.0.0" + checksum: 10/3b26bf4041fdb33deacdcb3af9ae11e9a0b413fb14c95844d74a460b55e407625b364955dcf965c654605cde9d24ad5dad423c489aa430825aab2035859aba0c + languageName: node + linkType: hard + +"consola@npm:^2.15.0": + version: 2.15.3 + resolution: "consola@npm:2.15.3" + checksum: 10/ba5b3c6960b2eafb9d2ff2325444dd1d4eb53115df46eba823a4e7bfe6afbba0eb34747c0de82c7cd8a939db59b0cb5a8b8a54a94bb2e44feeddc26cefde3622 + languageName: node + linkType: hard + +"console-browserify@npm:^1.1.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 10/4f16c471fa84909af6ae00527ce8d19dd9ed587eab85923c145cadfbc35414139f87e7bdd61746138e22cd9df45c2a1ca060370998c2c39f801d4a778105bac5 + languageName: node + linkType: hard + +"console.table@npm:0.10.0": + version: 0.10.0 + resolution: "console.table@npm:0.10.0" + dependencies: + easy-table: "npm:1.1.0" + checksum: 10/bd7d1d1507c60e4d0fdfe5d94d18a6dac2d7929a216f9e3cece26fef7ee38bdc40ad96844547b0a16d978e7c410bb9f6acda249a71038e33be16160ce948121b + languageName: node + linkType: hard + +"constants-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: 10/49ef0babd907616dddde6905b80fe44ad5948e1eaaf6cf65d5f23a8c60c029ff63a1198c364665be1d6b2cb183d7e12921f33049cc126734ade84a3cfdbc83f6 + languageName: node + linkType: hard + +"content-disposition@npm:~0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10/b7f4ce176e324f19324be69b05bf6f6e411160ac94bc523b782248129eb1ef3be006f6cff431aaea5e337fe5d176ce8830b8c2a1b721626ead8933f0cbe78720 + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10/585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 + languageName: node + linkType: hard + +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10/1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 + languageName: node + linkType: hard + +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f + languageName: node + linkType: hard + +"core-js-pure@npm:^3.23.3": + version: 3.51.0 + resolution: "core-js-pure@npm:3.51.0" + checksum: 10/d71941be75d9dc905ac9b5dc27ee59e7167b30b24c5f534485cec11ce1fbaabd0d3b288a4214433a6eff123a35b7b17e310bad70061d62aa0cba57a9c57ac7a7 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10/9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + languageName: node + linkType: hard + +"cosmiconfig@npm:^6.0.0": + version: 6.0.0 + resolution: "cosmiconfig@npm:6.0.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.1.0" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.7.2" + checksum: 10/b184d2bfbced9ba6840fd097dbf3455c68b7258249bb9b1277913823d516d8dfdade8c5ccbf79db0ca8ebd4cc9b9be521ccc06a18396bd242d50023c208f1594 + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.2.0": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/91d082baca0f33b1c085bf010f9ded4af43cbedacba8821da0fb5667184d0a848addc52c31fadd080007f904a555319c238cf5f4c03e6d58ece2e4876b2e73d6 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.4": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 10/0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + md5.js: "npm:^1.3.4" + ripemd160: "npm:^2.0.1" + sha.js: "npm:^2.4.0" + checksum: 10/3cfef32043b47a8999602af9bcd74966db6971dd3eb828d1a479f3a44d7f58e38c1caf34aa21a01941cc8d9e1a841738a732f200f00ea155f8a8835133d2e7bc + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: "npm:^1.0.3" + create-hash: "npm:^1.1.0" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 10/2b26769f87e99ef72150bf99d1439d69272b2e510e23a2b8daf4e93e2412f4842504237d726044fa797cb20ee0ec8bee78d414b11f2d7ca93299185c93df0dae + languageName: node + linkType: hard + +"create-require@npm:^1.1.1": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10/a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-fetch@npm:^4.0.0": + version: 4.1.0 + resolution: "cross-fetch@npm:4.1.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10/07624940607b64777d27ec9c668ddb6649e8c59ee0a5a10e63a51ce857e2bbb1294a45854a31c10eccb91b65909a5b199fcb0217339b44156f85900a7384f489 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 + languageName: node + linkType: hard + +"crypto-browserify@npm:^3.12.1": + version: 3.12.1 + resolution: "crypto-browserify@npm:3.12.1" + dependencies: + browserify-cipher: "npm:^1.0.1" + browserify-sign: "npm:^4.2.3" + create-ecdh: "npm:^4.0.4" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + diffie-hellman: "npm:^5.0.3" + hash-base: "npm:~3.0.4" + inherits: "npm:^2.0.4" + pbkdf2: "npm:^3.1.2" + public-encrypt: "npm:^4.0.3" + randombytes: "npm:^2.1.0" + randomfill: "npm:^1.0.4" + checksum: 10/13da0b5f61b3e8e68fcbebf0394f2b2b4d35a0d0ba6ab762720c13391d3697ea42735260a26328a6a3d872be7d4cb5abe98a7a8f88bc93da7ba59b993331b409 + languageName: node + linkType: hard + +"css-declaration-sorter@npm:^6.3.1": + version: 6.4.1 + resolution: "css-declaration-sorter@npm:6.4.1" + peerDependencies: + postcss: ^8.0.9 + checksum: 10/06cbfd1f470b8accf5e235b0e658e2f82d33a1cea8c2a21b55dfef5280769b874a8979c50f2c035af9213836cf85fb7e4687748a9162d564d7638ed4a194888e + languageName: node + linkType: hard + +"css-loader@npm:^6.5.1": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/9e3665509f6786d46683de5c5f5c4bdd4aa62396b4017b41dbbb41ea5ada4012c80ee1e3302b79b504bc24da7fa69e3552d99006cecc953e0d9eef4a3053b929 + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.0.1" + domhandler: "npm:^4.3.1" + domutils: "npm:^2.8.0" + nth-check: "npm:^2.0.1" + checksum: 10/8f7310c9af30ccaba8f72cb4a54d32232c53bf9ba05d019b693e16bfd7ba5df0affc1f4d74b1ee55923643d23b80a837eedcf60938c53356e479b04049ff9994 + languageName: node + linkType: hard + +"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3": + version: 1.1.3 + resolution: "css-tree@npm:1.1.3" + dependencies: + mdn-data: "npm:2.0.14" + source-map: "npm:^0.6.1" + checksum: 10/29710728cc4b136f1e9b23ee1228ec403ec9f3d487bc94a9c5dbec563c1e08c59bc917dd6f82521a35e869ff655c298270f43ca673265005b0cd05b292eb05ab + languageName: node + linkType: hard + +"css-what@npm:^6.0.1": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10/3c5a53be94728089bd1716f915f7f96adde5dd8bf374610eb03982266f3d860bf1ebaf108cda30509d02ef748fe33eaa59aa75911e2c49ee05a85ef1f9fb5223 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10/0e161912c1306861d8f46e1883be1cbc8b1b2879f0f509287c0db71796e4ddfb97ac96bdfca38f77f452e2c10554e1bb5678c99b07a5cf947a12778f73e47e12 + languageName: node + linkType: hard + +"cssnano-preset-default@npm:^5.2.14": + version: 5.2.14 + resolution: "cssnano-preset-default@npm:5.2.14" + dependencies: + css-declaration-sorter: "npm:^6.3.1" + cssnano-utils: "npm:^3.1.0" + postcss-calc: "npm:^8.2.3" + postcss-colormin: "npm:^5.3.1" + postcss-convert-values: "npm:^5.1.3" + postcss-discard-comments: "npm:^5.1.2" + postcss-discard-duplicates: "npm:^5.1.0" + postcss-discard-empty: "npm:^5.1.1" + postcss-discard-overridden: "npm:^5.1.0" + postcss-merge-longhand: "npm:^5.1.7" + postcss-merge-rules: "npm:^5.1.4" + postcss-minify-font-values: "npm:^5.1.0" + postcss-minify-gradients: "npm:^5.1.1" + postcss-minify-params: "npm:^5.1.4" + postcss-minify-selectors: "npm:^5.2.1" + postcss-normalize-charset: "npm:^5.1.0" + postcss-normalize-display-values: "npm:^5.1.0" + postcss-normalize-positions: "npm:^5.1.1" + postcss-normalize-repeat-style: "npm:^5.1.1" + postcss-normalize-string: "npm:^5.1.0" + postcss-normalize-timing-functions: "npm:^5.1.0" + postcss-normalize-unicode: "npm:^5.1.1" + postcss-normalize-url: "npm:^5.1.0" + postcss-normalize-whitespace: "npm:^5.1.1" + postcss-ordered-values: "npm:^5.1.3" + postcss-reduce-initial: "npm:^5.1.2" + postcss-reduce-transforms: "npm:^5.1.0" + postcss-svgo: "npm:^5.1.0" + postcss-unique-selectors: "npm:^5.1.1" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/4103f879a594e24eef7b2f175cd46b59d777982be23f0d1b84e962d044e0bea2f26aa107dea59a711e6394fdd77faf313cee6ae4be61d34656fdf33ff278f69d + languageName: node + linkType: hard + +"cssnano-utils@npm:^3.1.0": + version: 3.1.0 + resolution: "cssnano-utils@npm:3.1.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/975c84ce9174cf23bb1da1e9faed8421954607e9ea76440cd3bb0c1bea7e17e490d800fca5ae2812d1d9e9d5524eef23ede0a3f52497d7ccc628e5d7321536f2 + languageName: node + linkType: hard + +"cssnano@npm:^5.0.1": + version: 5.1.15 + resolution: "cssnano@npm:5.1.15" + dependencies: + cssnano-preset-default: "npm:^5.2.14" + lilconfig: "npm:^2.0.3" + yaml: "npm:^1.10.2" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/8c5acbeabd10ffc05d01c63d3a82dcd8742299ead3f6da4016c853548b687d9b392de43e6d0f682dad1c2200d577c9360d8e709711c23721509aa4e55e052fb3 + languageName: node + linkType: hard + +"csso@npm:^4.2.0": + version: 4.2.0 + resolution: "csso@npm:4.2.0" + dependencies: + css-tree: "npm:^1.1.2" + checksum: 10/8b6a2dc687f2a8165dde13f67999d5afec63cb07a00ab100fbb41e4e8b28d986cfa0bc466b4f5ba5de7260c2448a64e6ad26ec718dd204d3a7d109982f0bf1aa + languageName: node + linkType: hard + +"ctrlc-windows@npm:^2.1.0": + version: 2.2.0 + resolution: "ctrlc-windows@npm:2.2.0" + checksum: 10/3d044eda5aa8c58d35e34b05249f9330e7258bec88999e50f25fd21807c2bedabbcab28e10a24e60c15748267ef0ebf9a915d4e430f484d5ce2ec5c75663c352 + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: 10/f4eba1c90170f96be25d95fa3857141b5f81e254f7e4d530da929217b19990ea9a0390fc53d3c1cafac9152fda78e722ea4894f765cf6216be413b5af1fbf821 + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:8.0.0": + version: 8.0.0 + resolution: "data-uri-to-buffer@npm:8.0.0" + checksum: 10/629a57906faab66bd56d299c3944f5314c2fe876d3c2a3553019635c0984464df00ec1938f23cd4e00fe34c32157eeaa73f49f8c994a56dd19f932ee628c99d8 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/c10b155a4e93999d3a215d08c23eea95f865e1f510b2e7748fcae1882b776df1afe8c99f483ace7fc0e5a3193ab08da138abebc9829d12003746c5a338c4d644 + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/2a47055fcf1ab3ec41b00b6f738c6461a841391a643c9ed9befec1117c1765b4d492661d97fb7cc899200c328949dca6ff189d2c6537d96d60e8a02dfe3c95f7 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/fa3bdfa0968bea6711ee50375094b39f561bce3f15f9e558df59de9c25f0bdd4cddc002d9c1d70ac7772ebd36854a7e22d1761e7302a934e6f1c2263bcf44aa2 + languageName: node + linkType: hard + +"debug@npm:2.6.9, debug@npm:^2.6.0": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10/e07005f2b40e04f1bd14a3dd20520e9c4f25f60224cb006ce9d6781732c917964e9ec029fc7f1a151083cd929025ad5133814d4dc624a9aaf020effe4914ed14 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad + languageName: node + linkType: hard + +"debug@npm:4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/0073c3bcbd9cb7d71dd5f6b55be8701af42df3e56e911186dfa46fac3a5b9eb7ce7f377dd1d3be6db8977221f8eb333d945216f645cf56f6b688cd484837d255 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10/d86fd7be2b85462297ea16f1934dc219335e802f629ca9a69b63ed8ed041dda492389bb2ee039217c02e5b54792b1c51aa96ae954cf28634d363a2360c7a1639 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10/d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10/7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10/ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 + languageName: node + linkType: hard + +"default-browser-id@npm:^5.0.0": + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 10/52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.5.1 + resolution: "default-browser@npm:5.5.1" + dependencies: + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 10/e2a74668f0dffff543a2e207ff400a2a99a13f50e99db3c23ad288c6fbc26d6133145e13762c842350ea1d854d876ca6328abc0031e56fd9d33b8f5080ead028 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10/3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10/abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 10/0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10/f28421cf9ee86eecaf5f3b8fe875f13d7009c2625e97645bfff7a2a49aca678270b86c39f9c32939e5ca7ab96b551377ed4139558c795e076774287ad3af1aa4 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10/b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + +"degenerator@npm:7.0.1": + version: 7.0.1 + resolution: "degenerator@npm:7.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + peerDependencies: + quickjs-wasi: ^2.2.0 + checksum: 10/dd6abd1a168b84093dd9d636f90222020c6025715bbd40400b9cab558901d62e3dab2c540926538678c2f00f82b910b7ebdb6293ab47a0d3ecaecfd62b0766ca + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10/46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:~2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca + languageName: node + linkType: hard + +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 10/2ed6966fc14463a9e85451db330ab8ba041efed0b9a1a472dbfc6fbf2f82bab66491915f996b25d8517dddc36c8c74e24c30879b34877f3c4410733444a51d1d + languageName: node + linkType: hard + +"dependency-graph@npm:0.11.0, dependency-graph@npm:~0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 10/6b5eb540303753037a613e781da4b81534d139cbabc92f342630ed622e3ef4c332fc40cf87823e1ec71a7aeb4b195f8d88d7e625931ce6007bf2bf09a8bfb01e + languageName: node + linkType: hard + +"deprecation@npm:^2.0.0": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: 10/f56a05e182c2c195071385455956b0c4106fe14e36245b00c689ceef8e8ab639235176a96977ba7c74afb173317fac2e0ec6ec7a1c6d1e6eaa401c586c714132 + languageName: node + linkType: hard + +"des.js@npm:^1.0.0": + version: 1.1.0 + resolution: "des.js@npm:1.1.0" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10/d35fc82b5a0b2127b12699212e90b54ddd8134e0cf8d27a8c30507ed3572aa574ab71800cbb473769128a52dcf21acc3271c5c359508a5aa772e990df3b1a698 + languageName: node + linkType: hard + +"destroy@npm:1.2.0, destroy@npm:~1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10/0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 + languageName: node + linkType: hard + +"detect-indent@npm:^6.0.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: 10/ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10/b736c8d97d5d46164c0d1bed53eb4e6a3b1d8530d460211e2d52f1c552875e706c58a5376854e4e54f8b828c9cada58c855288c968522eb93ac7696d65970766 + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10/832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e + languageName: node + linkType: hard + +"detect-port-alt@npm:^1.1.6": + version: 1.1.6 + resolution: "detect-port-alt@npm:1.1.6" + dependencies: + address: "npm:^1.0.1" + debug: "npm:^2.6.0" + bin: + detect: ./bin/detect-port + detect-port: ./bin/detect-port + checksum: 10/35c9f9c69d12d2ca43d093f4f02d7763b47673910749bd12e6fedeb0ab5c546d27ab8e6425a9cbc65edd408490241390a8e680e8ec7e13940e84754ad81d632e + languageName: node + linkType: hard + +"diff@npm:^9.0.0": + version: 9.0.0 + resolution: "diff@npm:9.0.0" + checksum: 10/f8b5e38a6a7ec73d1850ccb7ff19cda1d02502dc0f2c562ada0f40d7211bfb3075c2f3742104619a1f8f47ae333d48a6c77bffb080a2df900db36935080ea4fb + languageName: node + linkType: hard + +"diff@npm:~8.0.2": + version: 8.0.4 + resolution: "diff@npm:8.0.4" + checksum: 10/b4036ceda0d1e10683a2313079ed52c5e6b09553ae29da87bce81d98714d9725dbf3c0f6f7c3b1f16eec049fe17087e38ee329e732580fa62f6ec1c2487b2435 + languageName: node + linkType: hard + +"diffie-hellman@npm:^5.0.3": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: 10/2ff28231f93b27a4903461432d2de831df02e3568ea7633d5d7b6167eb73077f823b2bca26de6ba4f5c7ecd10a3df5aa94d376d136ab6209948c03cc4e4ac1fe + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10/fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"dns-packet@npm:^5.2.2": + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" + dependencies: + "@leichtgewicht/ip-codec": "npm:^2.0.1" + checksum: 10/ef5496dd5a906e22ed262cbe1a6f5d532c0893c4f1884a7aa37d4d0d8b8376a2b43f749aab087c8bb1354d67b40444f7fca8de4017b161a4cea468543061aed3 + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10/555684f77e791b17173ea86e2eea45ef26c22219cb64670669c4f4bebd26dbc95cd90ec1f4159e9349a6bb9eb892ce4dde8cd0139e77bedd8bf4518238618474 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10/b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 + languageName: node + linkType: hard + +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10/71b22f56bce6255a963694a72860a99f08763cf500f02ff38ce4c7489f95b07e7a0069f10b04c7d200e21375474abe01232833ca1600f104bdee7173e493a5b9 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10/53b217bcfed4a0f90dd47f34f239b1c81fff53ffa39d164d722325817fdb554903b145c2d12c8421ce0df7d31c1b180caf7eacd3c86391dd925f803df8027dcc + languageName: node + linkType: hard + +"domain-browser@npm:4.22.0": + version: 4.22.0 + resolution: "domain-browser@npm:4.22.0" + checksum: 10/3ffbaf0cae8da717698d472ca85ab52f96c538fe1fe85e5eb3351d4e7af52423ce096b8a0c51bb318e1c9ccf9c2e94b3b0f68e5923ad0aa0c623a32b641ed11c + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10/ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10/e0d2af7403997a3ca040a9ace4a233b75ebe321e0ef628b417e46d619d65d47781b2f2038b6c2ef6e56e73e66aec99caf6a12c7e687ecff18ef74af6dfbde5de + languageName: node + linkType: hard + +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10/1f316a03f00b09a8893d4a25d297d5cbffd02c564509dede28ef72d5ce38d93f6d61f1de88d439f31b14a1d9b42f587ed711b9e8b1b4d3bf6001399832bfc4e0 + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10/5add88a3d68d42d6e6130a0cac450b7c2edbe73364bbd2fc334564418569bea97c6943a8fcd70e27130bf32afc236f30982fc4905039b703f23e9e0433c29934 + languageName: node + linkType: hard + +"duplexer@npm:^0.1.2": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10/62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10/9b1d3e1baefeaf7d70799db8774149cef33b97183a6addceeba0cf6b85ba23ee2686f302f14482006df32df75d32b17c509c143a3689627929e4a8efaf483952 + languageName: node + linkType: hard + +"easy-table@npm:1.1.0": + version: 1.1.0 + resolution: "easy-table@npm:1.1.0" + dependencies: + wcwidth: "npm:>=1.0.1" + dependenciesMeta: + wcwidth: + optional: true + checksum: 10/f01fde1162c41ad770e0067c6a732d9bad9edf542d79306ed08509e4f829dd9b18e98b7e25b065ea7e5e5de67f4ff3a4331e3f8c384b17b82c4869b58bb81307 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10/1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.459": + version: 1.5.464 + resolution: "electron-to-chromium@npm:1.5.464" + checksum: 10/d9d3eb5332511229222885de8bf5efa2851fb35e464a849d29fbc9b913f172443c9448b2e006035f36e89a67a7e73d50c6866f7592afeacdced86263a4a7b2cd + languageName: node + linkType: hard + +"elliptic@npm:^6.5.3, elliptic@npm:^6.6.1": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10/dc678c9febd89a219c4008ba3a9abb82237be853d9fd171cd602c8fb5ec39927e65c6b5e7a1b2a4ea82ee8e0ded72275e7932bb2da04a5790c2638b818e4e1c5 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.6.0 + resolution: "emoji-regex@npm:10.6.0" + checksum: 10/98cc0b0e1daed1ed25afbf69dcb921fee00f712f51aab93aa1547e4e4e8171725cc4f0098aaa645b4f611a19da11ec9f4623eb6ff2b72314b39a8f2ae7c12bf2 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10/c72d67a6821be15ec11997877c437491c313d924306b8da5d87d2a2bcc2cec9903cb5b04ee1a088460501d8e5b44f10df82fdc93c444101a7610b80c8b6938e1 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10/915acf859cea7131dac1b2b5c9c8e35c4849e325a1d114c30adb8cd615970f6dca0e27f64f3a4949d7d6ed86ecd79a1c5c63f02e697513cddd7b5835c90948b8 + languageName: node + linkType: hard + +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 10/bef767eca49acaa881388d91bee6936ea57ae367d603d5227ff0a9da3e2d1e774a61c447e5f2f4901797d023c4b5239bc208285b6172a880d3655024a0f44980 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10/114f47d6d45612621497d2b1556c8f142c35332a591780a54e863e42d281e72d6c7d7c419f2e419319d4eb7f6ebf1db82d9744905d90f275db20d06a763b5e19 + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.14 + resolution: "encoding@npm:0.1.14" + dependencies: + iconv-lite: "npm:0.7.3" + checksum: 10/6421d6cd6b40ccdad83622e6d42a2e6c037c8df8751671d0d22af14ba2c60366ce681e440081ec9c9add4de13e5b0bfe96841c6b2666ac795484be1bf22fae4a + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10/1e0cfa6e7f49887544e03314f9dfc56a8cb6dde910cbb445983ecc2ff426fc05946df9d75d8a21a3a64f2cecfe1bf88f773952029f46756b2ed64a24e95b1fb8 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.25.0": + version: 5.26.0 + resolution: "enhanced-resolve@npm:5.26.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.3.3" + checksum: 10/bd998505f0afd714a3c06ec24155fdc23101f5ace7887f36197857e388e7b2fb9616915c5c5eab6c240f12d9ff2fb09b53ab386593ef5d8664dcb07ff8447513 + languageName: node + linkType: hard + +"enquirer@npm:^2.4.1": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 10/b3726486cd98f0d458a851a03326a2a5dd4d84f37ff94ff2a2960c915e0fc865865da3b78f0877dc36ac5c1189069eca603e82ec63d5bc6b0dd9985bf6426d7a + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10/2c765221ee324dbe25e1b8ca5d1bf2a4d39e750548f2e85cbf7ca1d167d709689ddf1796623e66666ae747364c11ed512c03b48c5bbe70968d30f2a4009509b7 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: 10/dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10/1d20d825cdcce8d811bfbe86340f4755c02655a7feb2f13f8c880566d9d72a3f6c92c192a6867632e490d6da67b678271f46e01044996a6443e870331100dfdd + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10/ae3939fd4a55b1404e877df2080c6b59acc516d5b7f08a181040f78f38b4e2399633bfed2d9a21b91c803713fff7295ac70bebd8f3657ef352a95c2cd9aa2e4b + languageName: node + linkType: hard + +"error-stack-parser@npm:^2.0.6, error-stack-parser@npm:^2.1.4": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10/23db33135bfc6ba701e5eee45e1bb9bd2fe33c5d4f9927440d9a499c7ac538f91f455fcd878611361269893c56734419252c40d8105eb3b023cf8b0fc2ebb64e + languageName: node + linkType: hard + +"es-abstract-get@npm:^1.0.0": + version: 1.0.0 + resolution: "es-abstract-get@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.2" + is-callable: "npm:^1.2.7" + object-inspect: "npm:^1.13.4" + checksum: 10/a2bfa7536529a21c8590670a69c0c4583e531f92dbc420c13f680bf906215f510d9d14b18e2e4a26e8b07100ab28719811dbce822e43fe87305a5a9069cda24e + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.2": + version: 1.24.2 + resolution: "es-abstract@npm:1.24.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10/e2c97263d87b7faf65102d887074af421db7e48cd92b8b3cd308216cdd2547b647e8f61bf51429bdb13adc463bb7f421989544cbfd2e7f7469ef7a69ae8a4205 + languageName: node + linkType: hard + +"es-aggregate-error@npm:^1.0.7": + version: 1.0.14 + resolution: "es-aggregate-error@npm:1.0.14" + dependencies: + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + globalthis: "npm:^1.0.4" + has-property-descriptors: "npm:^1.0.2" + set-function-name: "npm:^2.0.2" + checksum: 10/bb22cf0197a984a2f61997603204b7b274ba5d0c757a5c41adf20f9666f8c6aa4db27a56ebb08f70f52b1866996c722f8b639a621b504cef9b71a2eb53024508 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10/f8dc9e660d90919f11084db0a893128f3592b781ce967e4fccfb8f3106cb83e400a4032c559184ec52ee1dbd4b01e7776c7cd0b3327b1961b1a4a7008920fe78 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.4.0 + resolution: "es-iterator-helpers@npm:1.4.0" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.2" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.1.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.3.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.5" + math-intrinsics: "npm:^1.1.0" + checksum: 10/03b5c121e1672ba0022be49204fb36f042069864b14db85555cf8de6bc7cea6aaf283278f66d8c66d0d408b8590a3113af3426e2d750c5c962b5e5719b5dff2d + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.6.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10/b6f3e576a3fed4d82b0d0ad4bbf6b3a5ad694d2e7ce8c4a069560da3db6399381eaba703616a182b16dde50ce998af64e07dcf49f2ae48153b9e07be3f107087 + languageName: node + linkType: hard + +"es-module-lexer@npm:^2.1.0": + version: 2.3.2 + resolution: "es-module-lexer@npm:2.3.2" + checksum: 10/065246d6e2b2dfea3287650b5800a30326771e0d9d238570e81371d7ae8d53db239bccb2166e272926bba44917da7c66dd7407a5214d17b0af5269005b1fec52 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1, es-object-atoms@npm:^1.1.2": + version: 1.1.2 + resolution: "es-object-atoms@npm:1.1.2" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/70041de72ab8996df74c17775cdedb8a0c36eb09a4111921d974f7d018af963023bb035a328b5772c2851daa40fb49f52313be0418763a975cb42cb6fe723255 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/86814bf8afbcd8966653f731415888019d4bc4aca6b6c354132a7a75bb87566751e320369654a101d23a91c87a85c79b178bcf40332839bd347aff437c4fb65f + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/c351f586c30bbabc62355be49564b2435468b52c3532b8a1663672e3d10dc300197e69c247869dd173e56d86423ab95fc0c10b0939cdae597094e0fdca078cba + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.4 + resolution: "es-to-primitive@npm:1.3.4" + dependencies: + es-abstract-get: "npm:^1.0.0" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.1.0" + is-symbol: "npm:^1.1.1" + checksum: 10/7a68d778c06de7de960682c57f4103259ca3cb6dc720b8908a027b04bf1216ae4c1688a8999443f871f03efaf8ec7c24b28f33892e2a553c2a4e3bc6bd0e276a + languageName: node + linkType: hard + +"esbuild-loader@npm:^4.0.0": + version: 4.5.0 + resolution: "esbuild-loader@npm:4.5.0" + dependencies: + esbuild: "npm:^0.28.1" + get-tsconfig: "npm:^4.10.1" + loader-utils: "npm:^2.0.4" + webpack-sources: "npm:^3.3.4" + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + checksum: 10/375a1f6db239b3e4a580db8a2c366acbfc8d577c782a9a7a561341fc2e45d9d7af3c380970a3ccc7aaebca3dc83f0e192fc8789aa2e7faf60f08599bb979c28b + languageName: node + linkType: hard + +"esbuild@npm:^0.28.1": + version: 0.28.2 + resolution: "esbuild@npm:0.28.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.28.2" + "@esbuild/android-arm": "npm:0.28.2" + "@esbuild/android-arm64": "npm:0.28.2" + "@esbuild/android-x64": "npm:0.28.2" + "@esbuild/darwin-arm64": "npm:0.28.2" + "@esbuild/darwin-x64": "npm:0.28.2" + "@esbuild/freebsd-arm64": "npm:0.28.2" + "@esbuild/freebsd-x64": "npm:0.28.2" + "@esbuild/linux-arm": "npm:0.28.2" + "@esbuild/linux-arm64": "npm:0.28.2" + "@esbuild/linux-ia32": "npm:0.28.2" + "@esbuild/linux-loong64": "npm:0.28.2" + "@esbuild/linux-mips64el": "npm:0.28.2" + "@esbuild/linux-ppc64": "npm:0.28.2" + "@esbuild/linux-riscv64": "npm:0.28.2" + "@esbuild/linux-s390x": "npm:0.28.2" + "@esbuild/linux-x64": "npm:0.28.2" + "@esbuild/netbsd-arm64": "npm:0.28.2" + "@esbuild/netbsd-x64": "npm:0.28.2" + "@esbuild/openbsd-arm64": "npm:0.28.2" + "@esbuild/openbsd-x64": "npm:0.28.2" + "@esbuild/openharmony-arm64": "npm:0.28.2" + "@esbuild/sunos-x64": "npm:0.28.2" + "@esbuild/win32-arm64": "npm:0.28.2" + "@esbuild/win32-ia32": "npm:0.28.2" + "@esbuild/win32-x64": "npm:0.28.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/c21a050b308c6f4b99e1a6ed458661d49b83b424b05c5e0851072f7b01fc2999910754454f6833599175d6c94102d99e400849dd67cfcbeef4f0aec7dfa504a6 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10/6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10/98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10/47719a65b2888b4586e3fa93769068b275961c13089e90d5d01a96a6e8e95871b1c3893576814c8fbf08a4a31a496f37e7b2c937cf231270f4d81de012832c7c + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.0.0": + version: 9.1.2 + resolution: "eslint-config-prettier@npm:9.1.2" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10/e4bba2d76df9dc6e2adca2866e544bfd1ff32232fc483743c04cedd93918a90a327b56d4a7e3f9d3fa32d90bd50b034d09df987860260064b18c026b8bbd15aa + languageName: node + linkType: hard + +"eslint-formatter-friendly@npm:^7.0.0": + version: 7.0.0 + resolution: "eslint-formatter-friendly@npm:7.0.0" + dependencies: + "@babel/code-frame": "npm:7.0.0" + chalk: "npm:2.4.2" + extend: "npm:3.0.2" + strip-ansi: "npm:5.2.0" + text-table: "npm:0.2.0" + checksum: 10/37a383ed9ebf5027c49010a4da391d5b1d0d4b3995d5c284642cd6aabd8b2c3ffe38a8a3b963a910dcf963b56bde498614f3300d01ba9d7c609b34a6239578bf + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.10 + resolution: "eslint-import-resolver-node@npm:0.3.10" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.16.1" + resolve: "npm:^2.0.0-next.6" + checksum: 10/f0ad564d345fc53076b46f726b6f9ba96a40d1b7cb33d515ea89d41d1dba37db4ff9b864550608756c2ba061c9e243bf10b920d975848616d0c6c4474f4ea415 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.1": + version: 2.14.0 + resolution: "eslint-module-utils@npm:2.14.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/78e508bc522717e756bcd1d84956ce43a5326cbb454c69b8fc1b4006c70b3d8bf93de61b389c32d76cf1e2fe1dcf035261445ed5b3f22b14338c73685de11c80 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.31.0": + version: 2.32.0 + resolution: "eslint-plugin-import@npm:2.32.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.9" + array.prototype.findlastindex: "npm:^1.2.6" + array.prototype.flat: "npm:^1.3.3" + array.prototype.flatmap: "npm:^1.3.3" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.1" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.16.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.1" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.9" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10/1bacf4967e9ebf99e12176a795f0d6d3a87d1c9a030c2207f27b267e10d96a1220be2647504c7fc13ab543cdf13ffef4b8f5620e0447032dba4ff0d3922f7c9e + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:^28.9.0": + version: 28.14.0 + resolution: "eslint-plugin-jest@npm:28.14.0" + dependencies: + "@typescript-eslint/utils": "npm:^6.0.0 || ^7.0.0 || ^8.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: 10/6032497bd97d6dd010450d5fdf535b8613a2789f4f83764ae04361c48d06d92f3d9b2e4350914b8fd857b6e611ba2b5282a1133ab8ec51b3e7053f9d336058e6 + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.10.2": + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" + dependencies: + aria-query: "npm:^5.3.2" + array-includes: "npm:^3.1.8" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:^4.10.0" + axobject-query: "npm:^4.1.0" + damerau-levenshtein: "npm:^1.0.8" + emoji-regex: "npm:^9.2.2" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.1" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10/388550798548d911e2286d530a29153ca00434a06fcfc0e31e0dda46a5e7960005e532fb29ce1ccbf1e394a3af3e5cf70c47ca43778861eacc5e3ed799adb79c + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^5.0.0": + version: 5.2.0 + resolution: "eslint-plugin-react-hooks@npm:5.2.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 10/ebb79e9cf69ae06e3a7876536653c5e556b5fd8cd9dc49577f10a6e728360e7b6f5ce91f4339b33e93b26e3bb23805418f8b5e75db80baddd617b1dffe73bed1 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.37.2": + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.2.1" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.9" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10/ee1bd4e0ec64f29109d5a625bb703d179c82e0159c86c3f1b52fc1209d2994625a137dae303c333fb308a2e38315e44066d5204998177e31974382f9fda25d5c + languageName: node + linkType: hard + +"eslint-plugin-unused-imports@npm:^4.1.4": + version: 4.4.1 + resolution: "eslint-plugin-unused-imports@npm:4.4.1" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + checksum: 10/b420fd55c393a6fdacfdbd0d1adf4cd44bed9a6584f05245091a6716272c57f38154d04b76f253619d8bf22823c0b9d630ef6b5b09edad6e51b8a1f7aec56c22 + languageName: node + linkType: hard + +"eslint-rspack-plugin@npm:^4.2.1": + version: 4.4.1 + resolution: "eslint-rspack-plugin@npm:4.4.1" + dependencies: + "@types/eslint": "npm:^8.56.10" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.8" + normalize-path: "npm:^3.0.0" + tinyglobby: "npm:^0.2.15" + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 + checksum: 10/310bddfd2818d885d382e481b510e68648fff735ba1bbf93cb03f191d92c109baca4a0072c4fa00c28347fbba03aabfe890075d2e2cade557ab9e3d5feb7a149 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^5.0.0": + version: 5.0.1 + resolution: "eslint-visitor-keys@npm:5.0.1" + checksum: 10/f9cc1a57b75e0ef949545cac33d01e8367e302de4c1483266ed4d8646ee5c306376660196bbb38b004e767b7043d1e661cb4336b49eff634a1bbe75c1db709ec + languageName: node + linkType: hard + +"eslint-webpack-plugin@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-webpack-plugin@npm:4.2.0" + dependencies: + "@types/eslint": "npm:^8.56.10" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.5" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.2.0" + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 + webpack: ^5.0.0 + checksum: 10/061d11a93832b82bd0362d6c546f51fe5e3a0eb811374b86536a2929ff46fea7e5ef30e32f0d3194b9da146a7c0ae43f13b2ec5ce0f65a9ca9c4d961d9e446b3 + languageName: node + linkType: hard + +"eslint@npm:^8.6.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c + languageName: node + linkType: hard + +"esm@npm:^3.2.25": + version: 3.2.25 + resolution: "esm@npm:3.2.25" + checksum: 10/ee96b8202b76dd1841c55e8a066608d6f0ae0333012be5c77829ccadcd21114283b4d7bf9ac1b8c09853258829c7843e9c6d7e0594acbc5e813cb37d82728d4b + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10/f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.7.0 + resolution: "esquery@npm:1.7.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10/4afaf3089367e1f5885caa116ef386dffd8bfd64da21fd3d0e56e938d2667cfb2e5400ab4a825aa70e799bb3741e5b5d63c0b94d86e2d4cf3095c9e64b2f5a15 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10/44ffcd89e714ea6b30143e7f119b104fc4d75e77ee913f34d59076b40ef2d21967f84e019f84e1fd0465b42cdbf725db449f232b5e47f29df29ed76194db8e16 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e + languageName: node + linkType: hard + +"estree-walker@npm:^0.6.1": + version: 0.6.1 + resolution: "estree-walker@npm:0.6.1" + checksum: 10/b8da7815030c4e0b735f5f8af370af09525e052ee14e539cecabc24ad6da1782448778361417e7c438091a59e7ca9f4a0c11642f7da4f2ebf1ba7a150a590bcc + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10/b02109c5d46bc2ed47de4990eef770f7457b1159a229f0999a09224d2b85ffeed2d7679cffcff90aeb4448e94b0168feb5265b209cdec29aad50a3d6e93d21e2 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10/b23acd24791db11d8f65be5ea58fd9a6ce2df5120ae2da65c16cfc5331ff59d5ac4ef50af66cd4bde238881503ec839928a0135b99a036a9cdfa22d17fd56cdb + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10/571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 + languageName: node + linkType: hard + +"events@npm:^3.0.0, events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: "npm:^1.3.4" + node-gyp: "npm:latest" + safe-buffer: "npm:^5.1.1" + checksum: 10/ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10/588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10/ca25962b4bbab943b7c4ed0b5228e263833a5063c65e1cdeac4be9afad350aae5466e8e619b5051f4f8d37b2144a2d6e8fcc771b6cc82934f7dade2f964f652c + languageName: node + linkType: hard + +"expr-eval-fork@npm:^3.0.1": + version: 3.0.3 + resolution: "expr-eval-fork@npm:3.0.3" + checksum: 10/372eb17485f9e37fb3ae01a3cd597532edaa3529c9606c2d2927ce032e36ba8d31352efaa947ce1d26a9a7e8285e6258a4f18fb007619d46ebd4d0587d7c9323 + languageName: node + linkType: hard + +"express-promise-router@npm:^4.1.0": + version: 4.1.1 + resolution: "express-promise-router@npm:4.1.1" + dependencies: + is-promise: "npm:^4.0.0" + lodash.flattendeep: "npm:^4.0.0" + methods: "npm:^1.0.0" + peerDependencies: + "@types/express": ^4.0.0 + express: ^4.0.0 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 10/7e6da926733756700b788f8eea81be96fe9668299b29b87815071f89408ae8368d5054cd68ec9d2b141000b8213b87d1f495a00b887f9e021a90f9e0cbb23146 + languageName: node + linkType: hard + +"express@npm:^4.22.0, express@npm:^4.22.1": + version: 4.22.3 + resolution: "express@npm:4.22.3" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:~1.20.5" + content-disposition: "npm:~0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:~0.1.13" + proxy-addr: "npm:~2.0.7" + qs: "npm:~6.16.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:~2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10/375bf466abbaa07b59001b532dba409723aacc621006e8c37c7e998e029a704a2129601bfdf26cb9d83c8b477177ea49324d79debdd8b209f77129a4cb2c2cf8 + languageName: node + linkType: hard + +"extend@npm:3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e + languageName: node + linkType: hard + +"extendable-error@npm:^0.1.5": + version: 0.1.7 + resolution: "extendable-error@npm:0.1.7" + checksum: 10/80478be7429a1675d2085f701239796bab3230ed6f2fb1b138fbabec24bea6516b7c5ceb6e9c209efcc9c089948d93715703845653535f8e8a49655066a9255e + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad + languageName: node + linkType: hard + +"fast-json-patch@npm:^3.1.0": + version: 3.1.1 + resolution: "fast-json-patch@npm:3.1.1" + checksum: 10/3e56304e1c95ad1862a50e5b3f557a74c65c0ff2ba5b15caab983b43e70e86ddbc5bc887e9f7064f0aacfd0f0435a29ab2f000fe463379e72b906486345e6671 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10/eb7e220ecf2bab5159d157350b81d01f75726a4382f5a9266f42b9150c4523b9795f7f5d9fbbbeaeac09a441b2369f05ee02db48ea938584205530fe5693cfe1 + languageName: node + linkType: hard + +"fast-memoize@npm:^2.5.2": + version: 2.5.2 + resolution: "fast-memoize@npm:2.5.2" + checksum: 10/b7e2839d70607c791ffda617bb3cf7d9944bd5483be05cedbc060be1381c79093efc470215f1bc5aa666b8ecc2c9ae49e6f56ab6f45f0c1474f6628651c9959b + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10/dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.1.9 + resolution: "fast-uri@npm:3.1.9" + checksum: 10/4276cf58661e68b4fefcbc3308a2c8429e5664d2a77b393a79c1cdbe9e5ba80617d27c7ce6685194ae40e4816df73dbd72a0324e5012d94a7e9cf85ee711f658 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.20.3 + resolution: "fastq@npm:1.20.3" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10/952dfa14c62d6a6825baad9c836de6550ece1de4d5d6836203b0851f2c6432ce0aa8cf5fc53dda4560b3b62ce12ef53eeef3d7b9d66efc9a8ea78e5dfc78baf4 + languageName: node + linkType: hard + +"faye-websocket@npm:^0.11.3": + version: 0.11.4 + resolution: "faye-websocket@npm:0.11.4" + dependencies: + websocket-driver: "npm:>=0.5.1" + checksum: 10/22433c14c60925e424332d2794463a8da1c04848539b5f8db5fced62a7a7c71a25335a4a8b37334e3a32318835e2b87b1733d008561964121c4a0bd55f0878c3 + languageName: node + linkType: hard + +"fd-package-json@npm:^2.0.0": + version: 2.0.0 + resolution: "fd-package-json@npm:2.0.0" + dependencies: + walk-up-path: "npm:^4.0.0" + checksum: 10/e595a1a23f8e208815cdcf26c92218240da00acce80468324408dc4a5cb6c26b6efb5076f0458a02f044562a1e60253731187a627d5416b4961468ddfc0ae426 + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/14ca1c9f0a0e8f4f2e9bf4e8551065a164a09545dae548c12a18d238b72e51e5a7b39bd8e5494b56463a0877672d0a6c1ef62c6fa0677db1b0c847773be939b1 + languageName: node + linkType: hard + +"figures@npm:^3.0.0, figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + languageName: node + linkType: hard + +"file-type@npm:21.3.4": + version: 21.3.4 + resolution: "file-type@npm:21.3.4" + dependencies: + "@tokenizer/inflate": "npm:^0.4.1" + strtok3: "npm:^10.3.4" + token-types: "npm:^6.1.1" + uint8array-extras: "npm:^1.4.0" + checksum: 10/42d5cf6aafb998fb2f0357e96ea7c48bcce5249f899523a3a5a4c297f4fe2346cc0aff9cf04243ada5c54b6457183550b2a04902b6533cd5e64aaa344d78e0eb + languageName: node + linkType: hard + +"filesize@npm:^8.0.6": + version: 8.0.7 + resolution: "filesize@npm:8.0.7" + checksum: 10/e35f1799c314cef49a585af82fe2d15b362f743a74c95f06e3dd99cf0334ca45516ed144f6a58649ca0e2e5e63844c0ef476d9374d5d43736d26f7c13aa49dad + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea + languageName: node + linkType: hard + +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:~2.0.2" + unpipe: "npm:~1.0.0" + checksum: 10/6cb4f9f80eaeb5a0fac4fdbd27a65d39271f040a0034df16556d896bfd855fd42f09da886781b3102117ea8fceba97b903c1f8b08df1fb5740576d5e0f481eed + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: "npm:^3.0.0" + checksum: 10/38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 + languageName: node + linkType: hard + +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10/4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10/07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10/02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.4.4 + resolution: "flatted@npm:3.4.4" + checksum: 10/5a6682ab87ed15e125419c61352c4bef26f310adceece03eae5f22c119d64ed47bfc0ee1948a77d0122559eaa86395ea06ef45b59bfe3db4fb13fb4cdff876de + languageName: node + linkType: hard + +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.16.0": + version: 1.16.1 + resolution: "follow-redirects@npm:1.16.1" + peerDependenciesMeta: + debug: + optional: true + checksum: 10/269c9f38e4bb413d7ab224fb5aa733118288a18e84d4d0a22821a850574624a55d45f2c6735fc09fc1cceedb6343a5539daf6d2dd70bce8980c8336d230a2f50 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10/427b33f997a98073c0424e5c07169264a62cda806d8d2ded159b5b903fdfc8f0a1457e06b5fc35506497acb3f1e353f025edee796300209ac6231e80edece835 + languageName: node + linkType: hard + +"fork-ts-checker-webpack-plugin@npm:^6.5.0": + version: 6.5.3 + resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" + dependencies: + "@babel/code-frame": "npm:^7.8.3" + "@types/json-schema": "npm:^7.0.5" + chalk: "npm:^4.1.0" + chokidar: "npm:^3.4.2" + cosmiconfig: "npm:^6.0.0" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^9.0.0" + glob: "npm:^7.1.6" + memfs: "npm:^3.1.2" + minimatch: "npm:^3.0.4" + schema-utils: "npm:2.7.0" + semver: "npm:^7.3.2" + tapable: "npm:^1.0.0" + peerDependencies: + eslint: ">= 6" + typescript: ">= 2.7" + vue-template-compiler: "*" + webpack: ">= 4" + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + checksum: 10/415263839afe11c291be60e3335ece3ccdc80c5e0d91eeecf0d3060cfb72c7b0cb33be326dd24b325939357d53215e10c41e8187edb5db8a08fe9aaa8aa6c510 + languageName: node + linkType: hard + +"fork-ts-checker-webpack-plugin@npm:^9.0.0": + version: 9.1.0 + resolution: "fork-ts-checker-webpack-plugin@npm:9.1.0" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + chalk: "npm:^4.1.2" + chokidar: "npm:^4.0.1" + cosmiconfig: "npm:^8.2.0" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^10.0.0" + memfs: "npm:^3.4.1" + minimatch: "npm:^3.0.4" + node-abort-controller: "npm:^3.0.1" + schema-utils: "npm:^3.1.1" + semver: "npm:^7.3.5" + tapable: "npm:^2.2.1" + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 10/1d24387224f7d49a17f7e44c9150971172f34ae30c4b1f581b8af967e73e8f36a434ed56f78aa45fd8cf0833c73a1b020102cc61070d7dc630b70c21c9770a1b + languageName: node + linkType: hard + +"form-data@npm:^4.0.6": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10/de6614c8537c92fa5fa3ee7e827758f98f5a9c033f348b7de81855ef36e5cb867e75d9f405d9483ab8d724a4a20d4e79926a299fa8dbba38f530eb659f0884e4 + languageName: node + linkType: hard + +"formatly@npm:^0.3.0": + version: 0.3.0 + resolution: "formatly@npm:0.3.0" + dependencies: + fd-package-json: "npm:^2.0.0" + bin: + formatly: bin/index.mjs + checksum: 10/0e5a9cbb826d93171b00c283e20e6a564a16e7bc3839e695790347a1f23e3536a88d613f5cabd07403d60b7bdffe179987c88b1fc2900a9be49eea01ffbe4244 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10/29ba9fd347117144e97cbb8852baae5e8b2acb7d1b591ef85695ed96f5b933b1804a7fac4a15dd09ca7ac7d0cdc104410e8102aae2dd3faa570a797ba07adb81 + languageName: node + linkType: hard + +"fresh@npm:~0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10/64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10/18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + languageName: node + linkType: hard + +"fs-extra@npm:11.4.0": + version: 11.4.0 + resolution: "fs-extra@npm:11.4.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/a1bd91076fe9de9114bd037a433f1f498857eb3f0cf778e647fd00dc5984374dee5e088854de3d6ca77cd9f11554a85f6f016a6004d0838bbc7cd722e33601ce + languageName: node + linkType: hard + +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/05ce2c3b59049bcb7b52001acd000e44b3c4af4ec1f8839f383ef41ec0048e3cfa7fd8a637b1bddfefad319145db89be91f4b7c1db2908205d38bf91e7d1d3b7 + languageName: node + linkType: hard + +"fs-extra@npm:^11.0.0, fs-extra@npm:^11.2.0": + version: 11.4.1 + resolution: "fs-extra@npm:11.4.1" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/8805c7413442ed9e94fb25eeafd28d705e2a732deba3eeb7b43cf687ce60c94e8a298b882de38249034ca84db7d21a0e4a237a041e8141f8f24f0d5ac2c6056a + languageName: node + linkType: hard + +"fs-extra@npm:^7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10/3fc6e56ba2f07c00d452163f27f21a7076b72ef7da8a50fef004336d59ef4c34deda11d10ecd73fd8fbcf20e4f575f52857293090b3c9f8741d4e0598be30fea + languageName: node + linkType: hard + +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10/6fb12449f5349be724a138b4a7b45fe6a317d2972054517f5971959c26fbd17c0e145731a11c7324460262baa33e0a799b183ceace98f7a372c95fbb6f20f5de + languageName: node + linkType: hard + +"fs-extra@npm:^9.0.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca + languageName: node + linkType: hard + +"fs-extra@npm:~11.3.0": + version: 11.3.6 + resolution: "fs-extra@npm:11.3.6" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/34a981697b199002ea3b85c3483bcf353637d33ec4c922b136a8d8a597faa0495638d69b20c181448be041c31778c2bb7f7799d589819edf33da50f75b1abde9 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f + languageName: node + linkType: hard + +"fs-monkey@npm:^1.0.4": + version: 1.1.0 + resolution: "fs-monkey@npm:1.1.0" + checksum: 10/1c6da5d07f6c91e31fd9bcd68909666e18fa243c7af6697e9d2ded16d4ee87cc9c2b67889b19f98211006c228d1915e1beb0678b4080778fb52539ef3e4eab6c + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10/e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10/4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10/185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.2.0 + resolution: "function.prototype.name@npm:1.2.0" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + hasown: "npm:^2.0.4" + is-callable: "npm:^1.2.7" + is-document.all: "npm:^1.0.0" + checksum: 10/ad662230bc2b9e971625222b462142b34aa23c70ca58fb4fa72e226bb9106a5752be5c7d8986de7ce5cfb959e5317200d70d88d96359605a165ed1c8cb515223 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10/0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 + languageName: node + linkType: hard + +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10/eb7e7eb896c5433f3d40982b2ccacdb3dd990dd3499f14040e002b5d54572476513be8a2e6f9609f6e41ab29f2c4469307611ddbfc37ff4e46b765c326663805 + languageName: node + linkType: hard + +"generic-names@npm:^4.0.0": + version: 4.0.0 + resolution: "generic-names@npm:4.0.0" + dependencies: + loader-utils: "npm:^3.2.0" + checksum: 10/ef05166395a17fbdcc7ceaa59635318b6ae89125391780c4d4abbc1e7ae7a6e07a31602fbc785860cf701cee08f790f71e286676c80db634f56d3d1af2703319 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10/b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-east-asian-width@npm:^1.0.0": + version: 1.7.0 + resolution: "get-east-asian-width@npm:1.7.0" + checksum: 10/8d8d96b54d1cfb6510f1b6dce51c4a6000b4d122757780d519d0147d968a6f5401421dbeff2e6bd3dc742e9b502fbcdbb98a50bf7f62730a6a8d6749a632279c + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10/bb579dda84caa4a3a41611bdd483dade7f00f246f2a7992eb143c5861155290df3fdb48a8406efa3dfb0b434e2c8fafa4eebd469e409d0439247f85fc3fa2cc1 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10/a353e3a9595a74720b40fb5bae3ba4a4f826e186e83814d93375182384265676f59e49998b9cdfac4a2225ce95a3d32a68f502a2c5619303987f1c183ab80494 + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1": + version: 4.14.3 + resolution: "get-tsconfig@npm:4.14.3" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10/ac18243ffd5c2e7c0cbecc11d053599c73a4c534a626988fe545b686695bf2fa789ba47bc2af87e30d85c657dbcadc26b4e3e328096894fde6a9229615c67253 + languageName: node + linkType: hard + +"get-uri@npm:8.0.1": + version: 8.0.1 + resolution: "get-uri@npm:8.0.1" + dependencies: + basic-ftp: "npm:^5.3.1" + data-uri-to-buffer: "npm:8.0.0" + debug: "npm:^4.3.4" + checksum: 10/d2bc9e9b48d5d3fdbd5eab5cec90a9e30d4b903ed255ccc035969aa1ce6d23498931b410d7e87a2f736a312b0c6e0a8057de09f3ff5218f4f78482c6c827f1b6 + languageName: node + linkType: hard + +"getopts@npm:2.3.0": + version: 2.3.0 + resolution: "getopts@npm:2.3.0" + checksum: 10/64c7494d05d6b6205f3351336d9c000265e3f84975ab1bb2b500ff9488eb506bad1d04fa8d2687fd7d81379846e9a500409f8e4b9e20dc604c785abd9b5cf7fd + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10/2a091ba07fbce22205642543b4ea8aaf068397e1433c00ae0f9de36a3607baf5bcc14da97fbb798cfca6393b3c402031fca06d8b491a44206d6efef391c58537 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10/32cd106ce8c0d83731966d31517adb766d02c3812de49c30cfe0675c7c0ae6630c11214c54a5ae67aca882cf738d27fd7768f21aa19118b9245950554be07247 + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10/c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob-to-regex.js@npm:^1.3.1": + version: 1.3.1 + resolution: "glob-to-regex.js@npm:1.3.1" + peerDependencies: + tslib: 2 + checksum: 10/a05b4be10f7336c1a3470f5a7f3b1cc9c9b08f6353c716a8f9bc281518d99d3b41f84776a0de67541c98f93025ac1b21944c49e5394ae701e52d5e34093c2818 + languageName: node + linkType: hard + +"glob@npm:13.0.6, glob@npm:^13.0.0, glob@npm:^13.0.6": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10/201ad69e5f0aa74e1d8c00a481581f8b8c804b6a4fbfabeeb8541f5d756932800331daeba99b58fb9e4cd67e12ba5a7eba5b82fb476691588418060b84353214 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": + version: 10.5.0 + resolution: "glob@npm:10.5.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10/ab3bccfefcc0afaedbd1f480cd0c4a2c0e322eb3f0aa7ceaa31b3f00b825069f17cf0f1fc8b6f256795074b903f37c0ade37ddda6a176aa57f1c2bbfe7240653 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10/59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b + languageName: node + linkType: hard + +"glob@npm:^8.0.1, glob@npm:^8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: 10/9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: "npm:^3.0.0" + checksum: 10/4aee73adf533fe82ead2ad15c8bfb6ea4fb29e16d2d067521ab39d3b45b8f834d71c47a807e4f8f696e79497c3946d4ccdcd708da6f3a4522d65b087b8852f64 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: "npm:^1.3.5" + kind-of: "npm:^6.0.2" + which: "npm:^1.3.1" + checksum: 10/a405b9f83c7d88a49dc1c1e458d6585e258356810d3d0f41094265152a06a0f393b14d911f45616e35a4ce3894176a73be2984883575e778f55e90bf812d7337 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10/1f1fd078fb2f7296306ef9dd51019491044ccf17a59ed49d375b576ca108ff37e47f3d29aead7add40763574a992f16a5367dd1e2173b8634ef18556ab719ac4 + languageName: node + linkType: hard + +"globby@npm:^11.0.0, globby@npm:^11.0.4, globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10/288e95e310227bbe037076ea81b7c2598ccbc3122d87abc6dab39e1eec309aa14f0e366a98cdc45237ffcfcbad3db597778c0068217dcb1950fef6249104e1b1 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10/94e296d69f92dc1c0768fcfeecfb3855582ab59a7c75e969d5f96ce50c3d201fd86d5a2857c22565764d5bb8a816c7b1e58f133ec318cd56274da36c5e3fb1a1 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10/6dd60dba97007b21e3a829fab3f771803cc1292977fe610e240ea72afd67e5690ac9eeaafc4a99710e78962e5936ab5a460787c2a1180f1cb0ccfac37d29f897 + languageName: node + linkType: hard + +"gzip-size@npm:^6.0.0": + version: 6.0.0 + resolution: "gzip-size@npm:6.0.0" + dependencies: + duplexer: "npm:^0.1.2" + checksum: 10/2df97f359696ad154fc171dcb55bc883fe6e833bca7a65e457b9358f3cb6312405ed70a8da24a77c1baac0639906cd52358dc0ce2ec1a937eaa631b934c94194 + languageName: node + linkType: hard + +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10/441ec98b07f26819c70c702f6c874088eebeb551b242fe8fae4eab325746b82bf84ae7a1f6419547698accb3941fa26806c5f5f93c50e19f90e499065a711d61 + languageName: node + linkType: hard + +"handlebars@npm:^4.7.3": + version: 4.7.10 + resolution: "handlebars@npm:4.7.10" + dependencies: + minimist: "npm:^1.2.8" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 10/e7df9b9986594384de11ea27d2f9c694f90dca9ff768ac28851b4cf89f6268a3177ec50c9bb1601c8841f67bee25598b37bdcd53d1f7acd3744619f938ad1f53 + languageName: node + linkType: hard + +"harmony-reflect@npm:^1.4.6": + version: 1.6.2 + resolution: "harmony-reflect@npm:1.6.2" + checksum: 10/69d30ebfb5dbd6ff0553725c7922404cf1dfe5390db1618298eed27fe6c9bd2f3f677727e9da969d21648f4a6a39041e2f46e99976be4385f9e34bac23058cd4 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10/90fb1b24d40d2472bcd1c8bd9dd479037ec240215869bdbff97b2be83acef57d28f7e96bdd003a21bed218d058b49097f4acc8821c05b1629cc5d48dd7bfcccd + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10/261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10/2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10/7eaed07728eaa28b77fadccabce53f30de467ff186a766872669a833ac2e87d8922b76a22cc58339d7e0277aefe98d6d00762113b27a97cdf65adcf958970935 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10/959385c98696ebbca51e7534e0dc723ada325efa3475350951363cce216d27373e0259b63edb599f72eb94d6cde8577b4b2375f080b303947e560f85692834fa + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10/c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0, hash-base@npm:^3.1.2": + version: 3.1.2 + resolution: "hash-base@npm:3.1.2" + dependencies: + inherits: "npm:^2.0.4" + readable-stream: "npm:^2.3.8" + safe-buffer: "npm:^5.2.1" + to-buffer: "npm:^1.2.1" + checksum: 10/f2100420521ec77736ebd9279f2c0b3ab2820136a2fa408ea36f3201d3f6984cda166806e6a0287f92adf179430bedfbdd74348ac351e24a3eff9f01a8c406b0 + languageName: node + linkType: hard + +"hash-base@npm:~3.0.4": + version: 3.0.5 + resolution: "hash-base@npm:3.0.5" + dependencies: + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: 10/6a82675a5de2ea9347501bbe655a2334950c7ec972fd9810ae9529e06aeab8f7e8ef68fc2112e5e6f0745561a7e05326efca42ad59bb5fd116537f5f8b0a216d + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10/0c89ee4006606a40f92df5cc3c263342e7fea68110f3e9ef032bd2083650430505db01b6b7926953489517d4027535e4fdc7f970412893d3031c361d3ec8f4b3 + languageName: node + linkType: hard + +"hasown@npm:^2.0.2, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/13823863ae48161068b4c51606a3128451c66f14545a5169d667fe9fca168dcd38c27570c7a299e32ef844b8da3d55def7fe88602f8970d4311fb543ee88001a + languageName: node + linkType: hard + +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10/d09b2243da4e23f53336e8de3093e5c43d2c39f8d0d18817abfa32ce3e9355391b2edb4bb5edc376aea5d4b0b59d6a0482aab4c52bc02ef95751e4b818e847f1 + languageName: node + linkType: hard + +"highlight.js@npm:^10.7.1": + version: 10.7.3 + resolution: "highlight.js@npm:10.7.3" + checksum: 10/db8d10a541936b058e221dbde77869664b2b45bca75d660aa98065be2cd29f3924755fbc7348213f17fd931aefb6e6597448ba6fe82afba6d8313747a91983ee + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10/0298a1445b8029a69b713d918ecaa84a1d9f614f5857e0c6e1ca517abfa1357216987b2ee08cc6cc73ba82a6c6ddf2ff11b9717a653530ef03be599d4699b836 + languageName: node + linkType: hard + +"hoopy@npm:^0.1.4": + version: 0.1.4 + resolution: "hoopy@npm:0.1.4" + checksum: 10/7a73f1839a7fd6b953356770dff2c3cff813d97d899cddd75b348926c4df36059d987c06bedb57b1b7711504dba83d3b7b986f979a08b1e415da73a51fefa767 + languageName: node + linkType: hard + +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10/6910e4b9d943a78fd8e84ac42729fdab9bd406789d6204ad160af9dc5aa4750fc01f208249bf7116c11dc0678207a387b4ade24e4b628b95385b251ceeeb719c + languageName: node + linkType: hard + +"html-entities@npm:^2.1.0": + version: 2.6.0 + resolution: "html-entities@npm:2.6.0" + checksum: 10/06d4e7a3ba6243bba558af176e56f85e09894b26d911bc1ef7b2b9b3f18b46604360805b32636f080e954778e9a34313d1982479a05a5aa49791afd6a4229346 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10/a244fa944e002b57c66cc829a3f2dfdb9514b1833c2d838ada624964bf8c0afaf61d36c371758c7e44dedae95cea740a84d8d1067b916ed204f35175184d0e27 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.6.3": + version: 5.6.8 + resolution: "html-webpack-plugin@npm:5.6.8" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x || 2.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/c5b484f7594c155ee2b47b28b291f69ab7948e25f989c8d7e2130bb58b6b5e6724ef4b309e8adcdcb50e4e072bf82bfbbaaa08a35161f2aaa81c01fc58280b68 + languageName: node + linkType: hard + +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10/c9c34b0b722f5923c4ae05e59268aeb768582152969e3338a1cd3342b87f8dd2c0420f4745e46d2fd87f1b677ea2f314c3a93436ed8831905997e6347e081a5d + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.3.0 + resolution: "http-cache-semantics@npm:4.3.0" + checksum: 10/3f7b17565d3a046f069ecfc220d790ccfbef4a94a486502c5d1a23c50d71880393175416845579487a91bfefca393614d16a99bd566d474807a4ebb1139da9cd + languageName: node + linkType: hard + +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10/9ae293b0acbfad6ed45d52c1f85f58ab062465872fd9079c80d78c6527634002d73c2a9d8c0296cc12d178a0b689bb5291d9979aad3ce71ab17a7517588adbf7 + languageName: node + linkType: hard + +"http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.1" + checksum: 10/76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 + languageName: node + linkType: hard + +"http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10/9fe31bc0edf36566c87048aed1d3d0cbe03552564adc3541626a0613f542d753fbcb13bdfcec0a3a530dbe1714bb566c89d46244616b66bddd26ac413b06a207 + languageName: node + linkType: hard + +"http-parser-js@npm:>=0.5.1": + version: 0.5.10 + resolution: "http-parser-js@npm:0.5.10" + checksum: 10/33c53b458cfdf7e43f1517f9bcb6bed1c614b1c7c5d65581a84304110eb9eb02a48f998c7504b8bee432ef4a8ec9318e7009406b506b28b5610fed516242b20a + languageName: node + linkType: hard + +"http-proxy-agent@npm:9.1.0": + version: 9.1.0 + resolution: "http-proxy-agent@npm:9.1.0" + dependencies: + agent-base: "npm:9.0.0" + debug: "npm:^4.3.4" + proxy-agent-negotiate: "npm:1.1.0" + checksum: 10/d76441afe6849c3ea6f8143371062908fe4cb1037c5f6ad709f068e8086afd544e1980cc33b06513770878f423529db6f33ac0b5db4877214ec5a157e1e950c9 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10/d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 + languageName: node + linkType: hard + +"http-proxy-middleware@npm:^2.0.9": + version: 2.0.10 + resolution: "http-proxy-middleware@npm:2.0.10" + dependencies: + "@types/http-proxy": "npm:^1.17.8" + http-proxy: "npm:^1.18.1" + is-glob: "npm:^4.0.1" + is-plain-obj: "npm:^3.0.0" + micromatch: "npm:^4.0.2" + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 10/efa8b5d4dec112fba5f6741df33a926818f87156f44dee425e653284c20844f3a9f2af88042a7d4ef297161479e1549302dea693bce23123fa2da07420fa2214 + languageName: node + linkType: hard + +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: "npm:^4.0.0" + follow-redirects: "npm:^1.0.0" + requires-port: "npm:^1.0.0" + checksum: 10/2489e98aba70adbfd8b9d41ed1ff43528be4598c88616c558b109a09eaffe4bb35e551b6c75ac42ed7d948bb7530a22a2be6ef4f0cecacb5927be139f4274594 + languageName: node + linkType: hard + +"https-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "https-browserify@npm:1.0.0" + checksum: 10/2d707c457319e1320adf0e7556174c190865fb345b6a183f033cee440f73221dbe7fa3f0adcffb1e6b0664726256bd44771a82e50fe6c66976c10b237100536a + languageName: node + linkType: hard + +"https-proxy-agent@npm:9.1.0": + version: 9.1.0 + resolution: "https-proxy-agent@npm:9.1.0" + dependencies: + agent-base: "npm:9.0.0" + debug: "npm:^4.3.4" + proxy-agent-negotiate: "npm:1.1.0" + checksum: 10/45021d326c032bf8cd480acee488d5f701842cbef4756a33b81244a872304c918498ef6cf667d8348c11e9b065dd520ec1fd9138196147f608c5837500e7395b + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10/f0dce7bdcac5e8eaa0be3c7368bb8836ed010fb5b6349ffb412b172a203efe8f807d9a6681319105ea1b6901e1972c7b5ea899672a7b9aad58309f766dcbe0df + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 + languageName: node + linkType: hard + +"human-id@npm:^4.1.1": + version: 4.2.2 + resolution: "human-id@npm:4.2.2" + bin: + human-id: dist/cli.js + checksum: 10/2d8d596d1e2d3fb83d8a0b28d8a09604ad2803afe37d7b984716461411ad26fabbf00a60ca8b8144844d70fb2d3937ecfe530f8772c9064680bb6c236aa97128 + languageName: node + linkType: hard + +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10/64abb5568ff17aa08ac0175ae55e46e22831c5552be98acdd1692081db0209f36fff58b31432017b4e1772c178962676a2cc3c54e4d5d7f020d7710cec7ad7a6 + languageName: node + linkType: hard + +"iconv-lite@npm:0.7.3, iconv-lite@npm:^0.7.0": + version: 0.7.3 + resolution: "iconv-lite@npm:0.7.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10/b88a3f4527795c96854743bcdcdd03e0083ff5f1c072cb13d3e27c67cd276efd9a2a364922cb836538e976456f82323d645f7ea91d5bc8da1f000dc16742a0aa + languageName: node + linkType: hard + +"iconv-lite@npm:~0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 + languageName: node + linkType: hard + +"icss-replace-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "icss-replace-symbols@npm:1.1.0" + checksum: 10/24575b2c2f7e762bfc6f4beee31be9ba98a01cad521b5aa9954090a5de2b5e1bf67814c17e22f9e51b7d798238db8215a173d6c2b4726ce634ce06b68ece8045 + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 + languageName: node + linkType: hard + +"identity-obj-proxy@npm:3.0.0": + version: 3.0.0 + resolution: "identity-obj-proxy@npm:3.0.0" + dependencies: + harmony-reflect: "npm:^1.4.6" + checksum: 10/66fe4d2ffc67655174f6abe100ab3b36d2f5e4de5b28a7c3121e5f51bd4e7c8c1bee4f9a41ce0586ace57fb63bfedbfc39508b7cb43b9e3ed6dc42f762158b4e + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 + languageName: node + linkType: hard + +"ignore-walk@npm:^5.0.1": + version: 5.0.1 + resolution: "ignore-walk@npm:5.0.1" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10/a88b3fbda155496363fb3db66c7c7b85cf04d614fb51146f0aa5fc6b35c65370c57f9e6c550cd6048651fc378985b7a2bb9015c9fcb3e0dc798fc0728746703c + languageName: node + linkType: hard + +"ignore@npm:^5.1.4, ignore@npm:^5.2.0": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 + languageName: node + linkType: hard + +"ignore@npm:^7.0.5": + version: 7.0.13 + resolution: "ignore@npm:7.0.13" + checksum: 10/8206edd6fcb92934ec127ac55f8ffe2069903a2852df6b6744824db723637d74e59b5a7fa7c472d2bfbc29e572a2930c2378995051a5ab22c8954acff5db334c + languageName: node + linkType: hard + +"immer@npm:^9.0.6, immer@npm:^9.0.7": + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 10/8455d6b4dc8abfe40f06eeec9bcc944d147c81279424c0f927a4d4905ae34e5af19ab6da60bcc700c14f51c452867d7089b3b9236f5a9a2248e39b4a09ee89de + languageName: node + linkType: hard + +"import-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "import-cwd@npm:3.0.0" + dependencies: + import-from: "npm:^3.0.0" + checksum: 10/f2c4230e8389605154a390124381f9136811306ae4ba1c8017398c3c6926bc5cf75cf89350372b4938f79792ea373776b4efabd27506440ec301ce34c4e867eb + languageName: node + linkType: hard + +"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 + languageName: node + linkType: hard + +"import-from@npm:^3.0.0": + version: 3.0.0 + resolution: "import-from@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10/5040a7400e77e41e2c3bb6b1b123b52a15a284de1ffc03d605879942c00e3a87428499d8d031d554646108a0f77652549411167f6a7788e4fc7027eefccf3356 + languageName: node + linkType: hard + +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 10/943309cc8eb01ada12700448c288b0384f77a1bc33c7e00fa4cb223c665f467a13ce9aaceb8d2e4cf586b07c1d2828040263dcc069873ce63cfc2ac6fd087971 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10/2d30b157a91fe1c1d7c6f653cbf263f039be6c5bfa959245a16d4ee191fc0f2af86c08545b6e6beeb041c56b574d2d5b9f95343d378ab49c0f37394d541e7fc8 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10/cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10/d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 + languageName: node + linkType: hard + +"ini@npm:^1.3.5, ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 + languageName: node + linkType: hard + +"inquirer@npm:^8.2.0": + version: 8.2.7 + resolution: "inquirer@npm:8.2.7" + dependencies: + "@inquirer/external-editor": "npm:^1.0.0" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^6.0.1" + checksum: 10/526fb5ca55a29decda9b67c7b2bd437730152104c6e7c5f0d7ade90af6dc999371e1602ce86eb4a39ee3d91993501cddec32e4fe3f599723f2b653b02b685e3b + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10/1d5219273a3dab61b165eddf358815eefc463207db33c20fcfca54717da02e3f492003757721f972fd0bf21e4b426cab389c5427b99ceea4b8b670dc88ee6d4a + languageName: node + linkType: hard + +"interpret@npm:^2.2.0": + version: 2.2.0 + resolution: "interpret@npm:2.2.0" + checksum: 10/a62d4de5c1f8ab1fd0ccc8a1a8cca8dc31e14928b70364f0787576fe4639c0c463bd79cfe58c9bd9f54db9b7e53d3e646e68fb7627c6b65e3b0e3893156c5126 + languageName: node + linkType: hard + +"ip-address@npm:^10.1.1": + version: 10.7.4 + resolution: "ip-address@npm:10.7.4" + checksum: 10/89375f1fa00e5bb4e724498886e06d870c1cc0abbfa9df8cb5ce80f3f179ee49feb0ca96ec54a1512c2303302719975a2ad96e3a8fcc13b4fd836d7f461d3d95 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10/864d0cced0c0832700e9621913a6429ccdc67f37c1bd78fb8c6789fff35c9d167cb329134acad2290497a53336813ab4798d2794fd675d5eb33b5fdf0982b9ca + languageName: node + linkType: hard + +"ipaddr.js@npm:^2.1.0": + version: 2.5.0 + resolution: "ipaddr.js@npm:2.5.0" + checksum: 10/fa742655845845e38c3b6883c9bd9ff1d1619c73fe1d2ae97d96687daf3b8775394059135d9a91492c3f84019054ad876a9f73c43d2ecbe892aeb4b7ffb414f0 + languageName: node + linkType: hard + +"is-arguments@npm:^1.0.4": + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10/471a8ef631b8ee8829c43a8ab05c081700c0e25180c73d19f3bf819c1a8448c426a9e8e601f278973eca68966384b16ceb78b8c63af795b099cd199ea5afc457 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/ef1095c55b963cd0dcf6f88a113e44a0aeca91e30d767c475e7d746d28d1195b10c5076b94491a7a0cd85020ca6a4923070021d74651d093dc909e9932cf689b + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10/73ced84fa35e59e2c57da2d01e12cd01479f381d7f122ce41dcbb713f09dbfc651315832cd2bf8accba7681a69e4d6f1e03941d94dd10040d415086360e7005e + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/7c2ac7efdf671e03265e74a043bcb1c0a32e226bc2a42dfc5ec8644667df668bbe14b91c08e6c1414f392f8cf86cd1d489b3af97756e2c7a49dd1ba63fd40ca6 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10/10cf327310d712fe227cfaa32d8b11814c214392b6ac18c827f157e1e85363cf9c8e2a22df526689bd5d25e53b58cc110894787afb54e138e7c504174dba15fd + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10/078e51b4f956c2c5fd2b26bb2672c3ccf7e1faff38e0ebdba45612265f4e3d9fc3127a1fa8370bbf09eab61339203c3d3b7af5662cbf8be4030f8fac37745b0e + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/051fa95fdb99d7fbf653165a7e6b2cba5d2eb62f7ffa81e793a790f3fb5366c91c1b7b6af6820aa2937dd86c73aa3ca9d9ca98f500988457b1c59692c52ba911 + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 + languageName: node + linkType: hard + +"is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2, is-core-module@npm:^2.17.0": + version: 2.17.0 + resolution: "is-core-module@npm:2.17.0" + dependencies: + hasown: "npm:^2.0.4" + checksum: 10/0020f71b7eb525ccd684012cd1cfba235e7596e0addbc993732f7d8faff7ccd3a399e16dac7eb317b63459ea23f97efd661d6bf32584f6bf1d0a607fd8e21a6b + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10/357e9a48fa38f369fd6c4c3b632a3ab2b8adca14997db2e4b3fe94c4cd0a709af48e0fb61b02c64a90c0dd542fd489d49c2d03157b05ae6c07f5e4dec9e730a8 + languageName: node + linkType: hard + +"is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10/3a811b2c3176fb31abee1d23d3dc78b6c65fd9c07d591fcb67553cab9e7f272728c3dd077d2d738b53f9a2103255b0a6e8dfc9568a7805c56a78b2563e8d1dec + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 10/3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + +"is-document.all@npm:^1.0.0": + version: 1.0.0 + resolution: "is-document.all@npm:1.0.0" + dependencies: + call-bound: "npm:^1.0.4" + checksum: 10/c76fa391105f180e9d34bf219ab1db325b4f883d2d82c789dbf9a628e4213c97411f038f36b7d096d85f5ddc1fda6e22e9d8d7c65b89ad1ee5d4d1e5a2a4c077 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10/df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0bfb145e9a1ba852ddde423b0926d2169ae5fe9e37882cde9e8f69031281a986308df4d982283e152396e88b86562ed2256cbaa5e6390fb840a4c25ab54b8a80 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10/44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: "npm:^1.0.4" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/cc50fa01034356bdfda26983c5457103240f201f4663c0de1257802714e40d36bcff7aee21091d37bbba4be962fa5c6475ce7ddbc0abfa86d6bef466e41e50a5 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10/3ed74f2b0cdf4f401f38edb0442ddfde3092d79d7d35c9919c86641efdbcbb32e45aa3c0f70ce5eecc946896cd5a0f26e4188b9f2b881876f7cb6c505b82da11 + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10/824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10/93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10/8de7b41715b08bcb0e5edb0fb9384b80d2d5bcd10e142188f33247d19ff078abaf8e9b6f858e2302d8d05376a26a55cd23a3c9f8ab93292b02fcd2cc9e4e92bb + languageName: node + linkType: hard + +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10/8cd5390730c7976fb4e8546dd0b38865ee6f7bacfa08dfbb2cc07219606755f0b01709d9361e01f13009bbbd8099fa2927a8ed665118a6105d66e40f1b838c3f + languageName: node + linkType: hard + +"is-nan@npm:^1.3.2": + version: 1.3.2 + resolution: "is-nan@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.0" + define-properties: "npm:^1.1.3" + checksum: 10/1f784d3472c09bc2e47acba7ffd4f6c93b0394479aa613311dc1d70f1bfa72eb0846c81350967722c959ba65811bae222204d6c65856fdce68f31986140c7b0e + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10/8fe5cffd8d4fb2ec7b49d657e1691889778d037494c6f40f4d1a524cadd658b4b53ad7b6b73a59bcb4b143ae9a3d15829af864b2c0f9d65ac1e678c4c80f17e5 + languageName: node + linkType: hard + +"is-network-error@npm:^1.0.0": + version: 1.3.2 + resolution: "is-network-error@npm:1.3.2" + checksum: 10/6d5c0663f476acf7fd5894b5bdce14284aec6b595ad34484d430249b736372e46c345249fd1688bddb2c1380d72c28741838926d1d078264e37e779e970f9d93 + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/a5922fb8779ab1ea3b8a9c144522b3d0bea5d9f8f23f7a72470e61e1e4df47714e28e0154ac011998b709cce260c3c9447ad3cd24a96c2f2a0abfdb2cbdc76c8 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10/6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: 10/a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10/0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + languageName: node + linkType: hard + +"is-reference@npm:1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10/e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/c42b7efc5868a5c9a4d8e6d3e9816e8815c611b09535c00fead18a1138455c5cb5e1887f0023a467ad3f9c419d62ba4dc3d9ba8bafe55053914d6d6454a945d2 + languageName: node + linkType: hard + +"is-root@npm:^2.1.0": + version: 2.1.0 + resolution: "is-root@npm:2.1.0" + checksum: 10/37eea0822a2a9123feb58a9d101558ba276771a6d830f87005683349a9acff15958a9ca590a44e778c6b335660b83e85c744789080d734f6081a935a4880aee2 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10/5685df33f0a4a6098a98c72d94d67cad81b2bc72f1fb2091f3d9283c4a1c582123cd709145b02a9745f0ce6b41e3e43f1c944496d1d74d4ea43358be61308669 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0380d7c60cc692856871526ffcd38a8133818a2ee42d47bb8008248a0cd2121d8c8b5f66b6da3cac24bc5784553cacb6faaf678f66bc88c6615b42af2825230e + languageName: node + linkType: hard + +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/5277cb9e225a7cc8a368a72623b44a99f2cfa139659c6b203553540681ad4276bfc078420767aad0e73eef5f0bd07d4abf39a35d37ec216917879d11cebc1f8b + languageName: node + linkType: hard + +"is-subdir@npm:^1.1.1": + version: 1.2.0 + resolution: "is-subdir@npm:1.2.0" + dependencies: + better-path-resolve: "npm:1.0.0" + checksum: 10/31029a383972bff4cc4f1bd1463fd04dde017e0a04ae3a6f6e08124a90c6c4656312d593101b0f38805fa3f3c8f6bc4583524bbf72c50784fa5ca0d3e5a76279 + languageName: node + linkType: hard + +"is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10/db495c0d8cd0a7a66b4f4ef7fccee3ab5bd954cb63396e8ac4d32efe0e9b12fdfceb851d6c501216a71f4f21e5ff20fc2ee845a3d52d455e021c466ac5eb2db2 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10/e8cf60b9ea85667097a6ad68c209c9722cfe8c8edf04d6218366469e51944c5cc25bae45ffb845c23f811d262e4314d3b0168748eb16711aa34d12724cdf0735 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10/a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10/a7b7e23206c542dcf2fa0abc483142731788771527e90e7e24f658c0833a0d91948a4f7b30d78f7a65255a48512e41a0288b778ba7fc396137515c12e201fd11 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/543506fd8259038b371bb083aac25b16cb4fd8b12fc58053aa3d45ac28dfd001cd5c6dffbba7aeea4213c74732d46b6cb2cfb5b412eed11f2db524f3f97d09a0 + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/1d5e1d0179beeed3661125a6faa2e59bfb48afda06fc70db807f178aa0ebebc3758fb6358d76b3d528090d5ef85148c345dcfbf90839592fe293e3e5e82f2134 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.0": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 10/438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 10/20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + languageName: node + linkType: hard + +"is-wsl@npm:^3.1.0": + version: 3.1.1 + resolution: "is-wsl@npm:3.1.1" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10/513d95b89af0e60b43d7b17ecb7eb78edea0a439136a3da37b1b56e215379cc46a9221474ad5b2de044824ca72d7869dee6e015273dc3f71f2bb87c715f9f1dc + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10/1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10/f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10/7c9f715c03aff08f35e98b1fadae1b9267b38f0615d501824f9743f3aab99ef10e303ce7db3f186763a0b70a19de5791ebfc854ff884d5a8c4d92211f642ec92 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.5 + resolution: "isexe@npm:3.1.5" + checksum: 10/ae479f6b0505507f1a73c1d57be6d0546e59fc9202bb0d5b31ba8ff5f3e79dd385bce57a2e60c5645aba567018cbbfc663519cd28367e9962242d97dd151d2ab + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10/2ead327ef596042ef9c9ec5f236b316acfaedb87f4bb61b3c3d574fb2e9c8a04b67305e04733bde52c24d9622fdebd3270aadb632adfbf9cadef88fe30f479e5 + languageName: node + linkType: hard + +"isomorphic-timers-promises@npm:^1.0.1": + version: 1.0.1 + resolution: "isomorphic-timers-promises@npm:1.0.1" + checksum: 10/2dabe397039081dbf30039f295333a7f9888b072dd0afa3aa7d8ba8f812a6db5efcbda0861a4be43ecfec207d56314ecf27150187b8d0f924a93103fa93eac73 + languageName: node + linkType: hard + +"isomorphic-ws@npm:5.0.0": + version: 5.0.0 + resolution: "isomorphic-ws@npm:5.0.0" + peerDependencies: + ws: "*" + checksum: 10/e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 + languageName: node + linkType: hard + +"iterare@npm:1.2.1": + version: 1.2.1 + resolution: "iterare@npm:1.2.1" + checksum: 10/ee8322dd9d92e86d8653c899df501c58c5b8e90d6767cf2af0b6d6dc5a4b9b7ed8bce936976f4f4c3a55be110a300c8a7d71967d03f72e104e8db66befcfd874 + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.5": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10/352bcf333f42189e65cc8cb2dcb94a5c47cf0a9110ce12aba788d405a980b5f5f3a06c79bf915377e1d480647169babd842ded0d898bed181bf6686e8e6823f6 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10/96f8786eaab98e4bf5b2a5d6d9588ea46c4d06bbc4f2eb861fdd7b6b182b16f71d8a70e79820f335d52653b16d4843b29dd9cdcf38ae80406756db9199497cf3 + languageName: node + linkType: hard + +"jest-css-modules@npm:^2.1.0": + version: 2.1.0 + resolution: "jest-css-modules@npm:2.1.0" + dependencies: + identity-obj-proxy: "npm:3.0.0" + checksum: 10/c7065e35e44aca2272eaa3c271e5f6af00c42768fd92dfe10344392dfc94ffc599f76d166412f55d917ef28405e32b28e80ece426c803eea2507f8bdea05ccb5 + languageName: node + linkType: hard + +"jest-regex-util@npm:30.5.0": + version: 30.5.0 + resolution: "jest-regex-util@npm:30.5.0" + checksum: 10/2236cb0f3bc7f61690500d779afab57fbcb2a35925f416ab32e68e5c1efae6d916efa9c3ee49c94d4d0990e1316e6581a1545209b08715c848b919364e89e66f + languageName: node + linkType: hard + +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10/30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10/06c6e2a84591d9ede704d5022fc13791e8876e83397c89d481b0063332abbb64c0f01ef4ca7de520b35c7a1058556078d6bdc3631376f4e9ffb42316c1a8488e + languageName: node + linkType: hard + +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10/364cbaef00d8a2729fc760227ad34b5e60829e0869bd84976bdfbd8c0d0f9c2f22677b3e6dd8afa76ed174765351cd12bae3d4530c62eefb3791055127ca9745 + languageName: node + linkType: hard + +"jiti@npm:2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/e2b07eb2e3fbb245e29ad288dddecab31804967fc84d5e01d39858997d2743b5e248946defcecf99272275a00284ecaf7ec88b8c841331324f0c946d8274414b + languageName: node + linkType: hard + +"jiti@npm:^2.6.0": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/6d75a8dbd61dbee031aa0937fabb748ff8ddf370b971958cc704f5cf26b4c5bdc9dcd0563059b2627a2bd41d946fa0bc64f912fdc8981ca7945a9d63c74ad0f9 + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 10/1067ff8ce02221faac5a842116ed0ec79a53312a111d0bf8342a80bd02c0a3fdf0b8449694a65947db0a3e8420e8b326dffb489c7dd5866efc380c0d1708a707 + languageName: node + linkType: hard + +"jose@npm:^5.0.0": + version: 5.10.0 + resolution: "jose@npm:5.10.0" + checksum: 10/03881d1dfb390dcf50926402edcfe233bf557b5a77321fcb1bdb53453bc1cdd26d2d0a9ab28c7445cbb826881f84fdf5074179700f10c2711ccb9880f51065d7 + languageName: node + linkType: hard + +"js-tokens@npm:^10.0.0": + version: 10.0.0 + resolution: "js-tokens@npm:10.0.0" + checksum: 10/88f536ec89f076fc230d29df255b3c55531237669d746d1868fca716b1e3f5f2e4abf8e5b8701903216e3f00d2dc3918d078b35da87772d433ab6a513c3bf76d + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10/af37d0d913fb56aec6dc0074c163cc71cd23c0b8aad5c2350747b6721d37ba118af35abdd8b33c47ec2800de07dedb16a527ca9c530ee004093e04958bd0cbf2 + languageName: node + linkType: hard + +"js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.3": + version: 3.15.2 + resolution: "js-yaml@npm:3.15.2" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/320b5471c1b7309a15d9c0068ba273e2da7382a369038a9746c92ef649087c3d6d2a5c676810154efb4eb2ca9584179c8ae14e2fc2e4bd558d964e6bf4fafd3d + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1, js-yaml@npm:^4.3.0, js-yaml@npm:~4.3.2": + version: 4.3.2 + resolution: "js-yaml@npm:4.3.2" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/05c44b9c73e4901d92703b155e76518df64bf01ac62e4c036b47de4b391e19b72e32656e8954d51b436307f08cc9d0c0d4ec617d061cf2f65fffee9f3114bee7 + languageName: node + linkType: hard + +"js-yaml@npm:^5.0.0": + version: 5.5.0 + resolution: "js-yaml@npm:5.5.0" + dependencies: + argparse: "npm:^3.0.3" + bin: + js-yaml: bin/js-yaml.mjs + checksum: 10/c01359a4fe69a1c032e9e57d7387a1cbdfbbd45bc69924885a3c9a9a020e066627dc125f7b46f7b929186b5a65471ae5fa478d3f773e35f7ccdf57d32fcf369f + languageName: node + linkType: hard + +"jsep@npm:^1.2.0, jsep@npm:^1.4.0": + version: 1.6.0 + resolution: "jsep@npm:1.6.0" + checksum: 10/1bf776dc802cb388fc418350048659f33f667207858e5b602f3704d178f739c397f478921c0efd78df1d525e636fd745bfca92696869b8a68b12bd1fd4fc37b9 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10/82876154521b7b68ba71c4f969b91572d1beabadd87bd3a6b236f85fbc7dc4695089191ed60bb59f9340993c51b33d479f45b6ba9f3548beb519705281c32c3c + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10/5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf + languageName: node + linkType: hard + +"json-schema-compare@npm:^0.2.2": + version: 0.2.2 + resolution: "json-schema-compare@npm:0.2.2" + dependencies: + lodash: "npm:^4.17.4" + checksum: 10/90af65174517b281ffe93fc398946f215a9c1a0a4fe15a50723755e347c4305a2c208ea07d6cee3108c2db22d82b8d5410c006b8dc9cd1a9b4a7d4eb9a727fc1 + languageName: node + linkType: hard + +"json-schema-merge-allof@npm:^0.8.1": + version: 0.8.1 + resolution: "json-schema-merge-allof@npm:0.8.1" + dependencies: + compute-lcm: "npm:^1.1.2" + json-schema-compare: "npm:^0.2.2" + lodash: "npm:^4.17.20" + checksum: 10/a12d8690038cedd7391ac1f7d5897b2d7b8fb867174839ec7583f53b025ad0a90ccefab572bafdf0a5421b3434305c5797ffd6209edc835527b325e6a1a5d562 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10/7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10/02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10/12786c2e2f22c27439e6db0532ba321f1d0617c27ad8cb1c352a0e9249a50182fd1ba8b52a18899291604b0c32eafa8afd09e51203f19109a0537f68db2b652d + languageName: node + linkType: hard + +"json5@npm:^1.0.1, json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10/a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10/1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10/9b0dc391f20b47378f843ef1e877e73ec652a5bdc3c5fa1f36af0f119a55091d147a86c1ee86a232296f55c929bba174538c2bf0312610e0817a22de131cc3f4 + languageName: node + linkType: hard + +"jsonc-parser@npm:~2.2.1": + version: 2.2.1 + resolution: "jsonc-parser@npm:2.2.1" + checksum: 10/326cc4ea2ae4649e3b45fd7802d2523e7746f77a08ef6aba44a106f368362ead3c0b214cc7268a9d534946c01b0b20a8259fa1f3a62b3c8ee7708b417b6d8113 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10/17796f0ab1be8479827d3683433f97ebe0a1c6932c3360fa40348eac36904d69269aab26f8b16da311882d94b42e9208e8b28e490bf926364f3ac9bff134c226 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.2.1 + resolution: "jsonfile@npm:6.2.1" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10/6022bcca984bb5ac57855f80d1c7013765c2db13624292d4652b83f9f4ae93486b82ba516ad5ea91d07cd2f6e2e579b42e422ec1d680e78605f4af25644b9797 + languageName: node + linkType: hard + +"jsonpath-plus@npm:^10.3.0, jsonpath-plus@npm:^6.0.1 || ^10.1.0": + version: 10.4.0 + resolution: "jsonpath-plus@npm:10.4.0" + dependencies: + "@jsep-plugin/assignment": "npm:^1.3.0" + "@jsep-plugin/regex": "npm:^1.0.4" + jsep: "npm:^1.4.0" + bin: + jsonpath: bin/jsonpath-cli.js + jsonpath-plus: bin/jsonpath-cli.js + checksum: 10/0ff33c7eb6500d7c8d789ce15a63ac2c46cb01b855f1c53729ca9e3833e0253af70277fc1799ebfe0b3130ddc03c127562669b999729dd11f2621b81472248d4 + languageName: node + linkType: hard + +"jsonpointer@npm:^5.0.0": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 10/0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10/b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc + languageName: node + linkType: hard + +"just-diff@npm:^6.0.2": + version: 6.0.2 + resolution: "just-diff@npm:6.0.2" + checksum: 10/4c6b14d6be2a3391b020ea2b3d1a0acf2f4c60fcb16681c7f6f76d4c0f1841fae5b00c1a2e719980992e46320e4b6c55a4713683cb1873dd41a2621f08c9f8e8 + languageName: node + linkType: hard + +"keytar@npm:^7.9.0": + version: 7.9.0 + resolution: "keytar@npm:7.9.0" + dependencies: + node-addon-api: "npm:^4.3.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.0.1" + checksum: 10/904795bc304f8ad89b80f915c869a941a383312b58584212a199473d18647035cfda92a9c53e6c53bf13ea0fed23037c9597eb418a5c71ee9454f140f026fac9 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10/0c0ecaf00a5c6173d25059c7db2113850b5457016dfa1d0e3ef26da4704fbb186b4938d7611246d86f0ddf1bccf26828daa5877b1f232a65e7373d0122a83e7f + languageName: node + linkType: hard + +"knex-pglite@npm:^0.14.0": + version: 0.14.0 + resolution: "knex-pglite@npm:0.14.0" + peerDependencies: + "@electric-sql/pglite": 0.x + knex: 3.x + checksum: 10/7b8a291437f13c7a649b5f98e594f8c51ff3158cf3b4a05692c2db6eefab25809d272a4096c2fd03ecf970e50e555274d91ea696db272aff8855b9aeb3791b5e + languageName: node + linkType: hard + +"knex@npm:^3.0.0": + version: 3.3.0 + resolution: "knex@npm:3.3.0" + dependencies: + colorette: "npm:2.0.19" + commander: "npm:^10.0.0" + debug: "npm:4.3.4" + escalade: "npm:^3.1.1" + esm: "npm:^3.2.25" + get-package-type: "npm:^0.1.0" + getopts: "npm:2.3.0" + interpret: "npm:^2.2.0" + lodash: "npm:^4.18.1" + pg-connection-string: "npm:2.6.2" + rechoir: "npm:^0.8.0" + resolve-from: "npm:^5.0.0" + tarn: "npm:^3.1.0" + tildify: "npm:2.0.0" + peerDependencies: + pg-query-stream: ^4.14.0 + peerDependenciesMeta: + better-sqlite3: + optional: true + mariadb: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + sqlite3: + optional: true + tedious: + optional: true + bin: + knex: bin/cli.js + checksum: 10/40924546fb223d186dd76b5eea415b5eaee517b9ba1d8ddad689e5c68a0e4e08fffe8e69f9e9d31ca533c8b8c0244f7bb47bc75b308efb58bceccc16322ec11d + languageName: node + linkType: hard + +"knip@npm:^5.27.4, knip@npm:^5.42.0": + version: 5.88.1 + resolution: "knip@npm:5.88.1" + dependencies: + "@nodelib/fs.walk": "npm:^1.2.3" + fast-glob: "npm:^3.3.3" + formatly: "npm:^0.3.0" + jiti: "npm:^2.6.0" + minimist: "npm:^1.2.8" + oxc-resolver: "npm:^11.19.1" + picocolors: "npm:^1.1.1" + picomatch: "npm:^4.0.1" + smol-toml: "npm:^1.5.2" + strip-json-comments: "npm:5.0.3" + unbash: "npm:^2.2.0" + yaml: "npm:^2.8.2" + zod: "npm:^4.1.11" + peerDependencies: + "@types/node": ">=18" + typescript: ">=5.0.4 <7" + bin: + knip: bin/knip.js + knip-bun: bin/knip-bun.js + checksum: 10/2356c5725bdf2cc90b51cc39563812db0f23aa45857c64992bbe9b13705a6b4a8a50eb28713795ffc212713d2e9ccc7ef6d5c80fd387a118b717b13e036b8de3 + languageName: node + linkType: hard + +"language-subtag-registry@npm:^0.3.20": + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10/fe13ed74ab9f862db8e5747b98cc9aa08d52a19f85b5cdb4975cd364c8539bd2da3380e4560d2dbbd728ec33dff8a4b4421fcb2e5b1b1bdaa21d16f91a54d0d4 + languageName: node + linkType: hard + +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" + dependencies: + language-subtag-registry: "npm:^0.3.20" + checksum: 10/d3a7c14b694e67f519153d6df6cb200681648d38d623c3bfa9d6a66a5ec5493628acb88e9df5aceef3cf1902ab263a205e7d59ee4cf1d6bb67e707b83538bd6d + languageName: node + linkType: hard + +"launch-editor@npm:^2.14.1, launch-editor@npm:^2.6.1": + version: 2.14.2 + resolution: "launch-editor@npm:2.14.2" + dependencies: + picocolors: "npm:^1.1.1" + shell-quote: "npm:^1.10.0" + checksum: 10/8a3a82314ed6705d8f6795c409ea31ed2a106d0f0bc0528a60f8b53ec972cce1db9088bb4647987b2ef4bb16b804fcc85e54529acaa26aae22f39eaba704401b + languageName: node + linkType: hard + +"leven@npm:3.1.0, leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10/638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10/2e4720ff79f21ae08d42374b0a5c2f664c5be8b6c8f565bb4e1315c96ed3a8acaa9de788ffed82d7f2378cf36958573de07ef92336cb5255ed74d08b8318c9ee + languageName: node + linkType: hard + +"lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 10/b1314a2e55319013d5e7d7d08be39015829d2764a1eaee130129545d40388499d81b1c31b0f9b3417d4db12775a88008b72ec33dd06e0184cf7503b32ca7cc0b + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10/0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"load-esm@npm:1.0.3": + version: 1.0.3 + resolution: "load-esm@npm:1.0.3" + checksum: 10/6949e8c253dddccca2a0ded1e9e0bbbc81924439d99e3a7d0f946ba6cdcd16de22c3cef28d997fd950befda0826ca65c3f913d9ba893d50e9cfc0bbd9a2a1e90 + languageName: node + linkType: hard + +"loader-utils@npm:^1.1.0": + version: 1.4.2 + resolution: "loader-utils@npm:1.4.2" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^1.0.1" + checksum: 10/2ae94cc88ad9cf2991e322b9ddf547cff80cf6fc0f9c77546b258c5ed9f77b0827f64c2625cb0baa06432f1f441bb4744c9ab1e1412ee6f8e97d31f8e9c730d6 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10/28bd9af2025b0cb2fc6c9c2d8140a75a3ab61016e5a86edf18f63732216e985a50bf2479a662555beb472a54d12292e380423705741bfd2b54cab883aa067f18 + languageName: node + linkType: hard + +"loader-utils@npm:^3.2.0": + version: 3.3.1 + resolution: "loader-utils@npm:3.3.1" + checksum: 10/3f994a948ded4248569773f065b1f6d7c95da059888c8429153e203f9bdadfb1691ca517f9eac6548a8af2fe5c724a8e09cbb79f665db4209426606a57ec7650 + languageName: node + linkType: hard + +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" + checksum: 10/53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10/83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10/72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10/c301cc379310441dc73cd6cebeb91fb254bea74e6ad3027f9346fc43b4174385153df420ffa521654e502fd34c40ef69ca4e7d40ee7129a99e06f306032bfc65 + languageName: node + linkType: hard + +"lodash.flattendeep@npm:^4.0.0": + version: 4.4.0 + resolution: "lodash.flattendeep@npm:4.4.0" + checksum: 10/0d0b41d8d86999e8bea94905ac65347404d427aacddbc6654dc2f85905e27cd2b708139671ecea135fa6f0a17ed94b9d4cab8ce12b08eddcbb1ddd83952ee4c2 + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10/192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10/d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 + languageName: node + linkType: hard + +"lodash.startcase@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.startcase@npm:4.4.0" + checksum: 10/3091048a54a2f92bcf2c6441d2bd9a706fb133d5f461ae7c310d6dca1530338a06c91e9e42a5b14b12e875ddae1814d448050dc02afe2cec09b3995d8e836837 + languageName: node + linkType: hard + +"lodash.topath@npm:^4.5.2": + version: 4.5.2 + resolution: "lodash.topath@npm:4.5.2" + checksum: 10/1d26fc23c2e3170f461b255f6089a05c9f474d5989899adb9ab31e1c377f96f08f517ea62d2532c4d7cf854c8ebc820fef8206493858c5cb1420af19e2c0da4a + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10/86246ca64ac0755c612e5df6d93cfe92f9ecac2e5ff054b965efbbb1d9a647b6310969e78545006f70f52760554b03233ad0103324121ae31474c20d5f7a2812 + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.18.1": + version: 4.18.1 + resolution: "lodash@npm:4.18.1" + checksum: 10/306fea53dfd39dad1f03d45ba654a2405aebd35797b673077f401edb7df2543623dc44b9effbb98f69b32152295fff725a4cec99c684098947430600c6af0c3f + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10/fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + languageName: node + linkType: hard + +"loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10/6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10/83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0": + version: 11.5.3 + resolution: "lru-cache@npm:11.5.3" + checksum: 10/824394f43827de37e961e9e344d4f0d2afb0347106ddafae620d0035c36337bc64e64cddbc17f6c630a73c9db34cf3f81211e3d43699a32e9f3641f391415b82 + languageName: node + linkType: hard + +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 + languageName: node + linkType: hard + +"luxon@npm:^3.0.0": + version: 3.7.2 + resolution: "luxon@npm:3.7.2" + checksum: 10/b24cd205ed306ce7415991687897dcc4027921ae413c9116590bc33a95f93b86ce52cf74ba72b4f5c5ab1c10090517f54ac8edfb127c049e0bf55b90dc2260be + languageName: node + linkType: hard + +"magic-string@npm:^0.30.21, magic-string@npm:^0.30.3": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10/57d5691f41ed40d962d8bd300148114f53db67fadbff336207db10a99f2bdf4a1be9cac3a68ee85dba575912ee1d4402e4396408196ec2d3afd043b076156221 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10/11bae5ad6ac59b654dbd854f30782f9de052186c429dfce308eda42374528185a100ee40ac9ffdc36a2b6c821ecaba43913e4730a12f06f15e895ea9cb23fa59 + languageName: node + linkType: hard + +"make-synchronized@npm:^0.8.0": + version: 0.8.0 + resolution: "make-synchronized@npm:0.8.0" + checksum: 10/e744bafcd61ee1ecabe6fb2c295ecb4b06a7bfe4e844222b80b7a5ae80a4d27ba657abc4892d1c702fa2f6ae568d8505e801c1498fe1379dd824ded5483d978c + languageName: node + linkType: hard + +"markdown-escape@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-escape@npm:2.0.0" + checksum: 10/74c66d817636ac5f6a275fdc79ecb1e208d907ca85289d660b515256fbc3e380eb18d29b6bbbd6a77968ee4fb5872d40ecf31e52bc9f17855bb01bb723569fa0 + languageName: node + linkType: hard + +"marked-terminal@npm:^7.3.0": + version: 7.3.0 + resolution: "marked-terminal@npm:7.3.0" + dependencies: + ansi-escapes: "npm:^7.0.0" + ansi-regex: "npm:^6.1.0" + chalk: "npm:^5.4.1" + cli-highlight: "npm:^2.1.11" + cli-table3: "npm:^0.6.5" + node-emoji: "npm:^2.2.0" + supports-hyperlinks: "npm:^3.1.0" + peerDependencies: + marked: ">=1 <16" + checksum: 10/1dfdfe752a4ebe6aec8de4a51180612a5f29982026b104a86215efb46b82b2a1942531a6bb840163c8d827e3eadc5cf93272e6eb29ec549f72b73b8b2eb97cfe + languageName: node + linkType: hard + +"marked@npm:^15.0.12": + version: 15.0.12 + resolution: "marked@npm:15.0.12" + bin: + marked: bin/marked.js + checksum: 10/deeb619405c0c46af00c99b18b3365450abeb309104b24e3658f46142344f6b7c4117608c3b5834084d8738e92f81240c19f596e6ee369260f96e52b3457eaee + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10/11df2eda46d092a6035479632e1ec865b8134bdfc4bd9e571a656f4191525404f13a283a515938c3a8de934dbfd9c09674d9da9fa831e6eb7e22b50b197d2edd + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10/098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c + languageName: node + linkType: hard + +"mdn-data@npm:2.0.14": + version: 2.0.14 + resolution: "mdn-data@npm:2.0.14" + checksum: 10/64c629fcf14807e30d6dc79f97cbcafa16db066f53a294299f3932b3beb0eb0d1386d3a7fe408fc67348c449a4e0999360c894ba4c81eb209d7be4e36503de0e + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10/38e0984db39139604756903a01397e29e17dcb04207bb3e081412ce725ab17338ecc47220c1b186b6bbe79a658aad1b0d41142884f5a481f36290cdefbe6aa46 + languageName: node + linkType: hard + +"memfs@npm:^3.1.2, memfs@npm:^3.4.1": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: "npm:^1.0.4" + checksum: 10/7c9cdb453a6b06e87f11e2dbe6c518fd3c1c1581b370ffa24f42f3fd5b1db8c2203f596e43321a0032963f3e9b66400f2c3cf043904ac496d6ae33eafd0878fe + languageName: node + linkType: hard + +"memfs@npm:^4.43.1, memfs@npm:^4.79.0": + version: 4.80.0 + resolution: "memfs@npm:4.80.0" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.80.0" + "@jsonjoy.com/fs-fsa": "npm:4.80.0" + "@jsonjoy.com/fs-node": "npm:4.80.0" + "@jsonjoy.com/fs-node-builtins": "npm:4.80.0" + "@jsonjoy.com/fs-node-to-fsa": "npm:4.80.0" + "@jsonjoy.com/fs-node-utils": "npm:4.80.0" + "@jsonjoy.com/fs-print": "npm:4.80.0" + "@jsonjoy.com/fs-snapshot": "npm:4.80.0" + "@jsonjoy.com/json-pack": "npm:^1.11.0" + "@jsonjoy.com/util": "npm:^1.9.0" + glob-to-regex.js: "npm:^1.3.1" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.0.3" + tslib: "npm:^2.0.0" + checksum: 10/b0be70a0b91ba7faa85312c2844a73775eaf2219378a7e10854877d61b569c08c299ca0a3d123373b05a5f8ecc20cdbf12d161cbbfdeec2cdbc2edd95b5f2e6c + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10/52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10/6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10/7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"methods@npm:^1.0.0, methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10/a385dd974faa34b5dd021b2bbf78c722881bf6f003bfe6d391d7da3ea1ed625d1ff10ddd13c57531f628b3e785be38d3eed10ad03cebd90b76932413df9a1820 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 + languageName: node + linkType: hard + +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 10/2a38ba9d1e878d94ee8a8ab3505b40e8d44fb9700a7716570fe4c8ca7e20d49b69aea579106580618c877cc6ff969eff71705042fafb47573736bf89404417bc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 + languageName: node + linkType: hard + +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.35, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34, mime-types@npm:~2.1.35": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10/89aa9651b67644035de2784a6e665fc685d79aba61857e02b9c8758da874a754aed4a9aced9265f5ed1171fd934331e5516b84a7f0218031b6fa0270eca1e51a + languageName: node + linkType: hard + +"mime-types@npm:^3.0.1": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10/9db0ad31f5eff10ee8f848130779b7f2d056ddfdb6bda696cb69be68d486d33a3457b4f3f9bdeb60d0736edb471bd5a7c0a384375c011c51c889fd0d5c3b893e + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10/b7d98bb1e006c0e63e2c91b590fe1163b872abf8f7ef224d53dd31499c2197278a6d3d0864c45239b1a93d22feaf6f9477e9fc847eef945838150b8c02d03170 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10/d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10/7e719047612411fe071332a7498cf0448bbe43c485c0d780046c76633a771b223ff49bd00267be122cedebb897037fdb527df72335d0d0f74724604ca70b37ad + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:^2.4.2": + version: 2.10.2 + resolution: "mini-css-extract-plugin@npm:2.10.2" + dependencies: + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10/d2b01f25e229d04263274fceccfcb3ec0937a448859e4cb65e32652e26dde46ae6ecf7d15a52a4bb700bea6e47675db88691d3abc418901ec8542e1cfdc62b85 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10/cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10/6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed + languageName: node + linkType: hard + +"minimatch@npm:10.2.3": + version: 10.2.3 + resolution: "minimatch@npm:10.2.3" + dependencies: + brace-expansion: "npm:^5.0.2" + checksum: 10/186c6a6ce9f7a79ae7776efc799c32d1a6670ebbcc2a8756e6cb6ec4aab7439a6ca6e592e1a6aac5f21674eefae5b19821b8fa95072a4f4567da1ae40eb6075d + languageName: node + linkType: hard + +"minimatch@npm:^10.2.1, minimatch@npm:^10.2.2": + version: 10.2.6 + resolution: "minimatch@npm:10.2.6" + dependencies: + brace-expansion: "npm:^5.0.8" + checksum: 10/a5e43f7c57d6061a77da320b42aa35ffff826030cf67c83c0eee47a26ede4d66486935881492b968c609bf27a7d48cc4b9f54b2806643cd8fb792fcf9240cc1b + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2, minimatch@npm:^3.1.4": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10/b11a7ee5773cd34c1a0c8436cdbe910901018fb4b6cb47aa508a18d567f6efd2148507959e35fba798389b161b8604a2d704ccef751ea36bd4582f9852b7d63f + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.9 + resolution: "minimatch@npm:5.1.9" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/23b4feb64dcb77ba93b70a72be551eb2e2677ac02178cf1ed3d38836cc4cd84802d90b77f60ef87f2bac64d270d2d8eba242e428f0554ea4e36bfdb7e9d25d0c + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.9 + resolution: "minimatch@npm:9.0.9" + dependencies: + brace-expansion: "npm:^2.0.2" + checksum: 10/b91fad937deaffb68a45a2cb731ff3cff1c3baf9b6469c879477ed16f15c8f4ce39d63a3f75c2455107c2fdff0f3ab597d97dc09e2e93b883aafcf926ef0c8f9 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f + languageName: node + linkType: hard + +"minimizer-webpack-plugin@npm:^5.7.0": + version: 5.13.1 + resolution: "minimizer-webpack-plugin@npm:5.13.1" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.31" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^4.6.0" + terser: "npm:^5.51.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@minify-html/node": + optional: true + "@napi-rs/image": + optional: true + "@swc/core": + optional: true + "@swc/css": + optional: true + "@swc/html": + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + imagemin: + optional: true + lightningcss: + optional: true + postcss: + optional: true + sharp: + optional: true + svgo: + optional: true + uglify-js: + optional: true + checksum: 10/f03f4264d2dedebb9c3554fde055b7d018054bddb0ad1f9b99e4746dec349a4733769b06b134e4d808c12fb16dfd70199fcaf991f1726479a1f0224b52472a33 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10/c669948bec1373313aaa8f104b962a3ced9f45c49b26366a4b0ae27ccdfa9c5740d72c8a84d3f8623d7a61c5fc7afdfda44789008c078f61a62441142efc4a97 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.7 + resolution: "minipass-flush@npm:1.0.7" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/dc43fd1644aaea31b6ba88281d928a136b9fcd5425c718791e1007db15cf2cd41c75d073548d2f46088f90971833b3bd86752d2a2612bf8256122dedf5b7f3db + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10/a5c6ef069f70d9a524d3428af39f2b117ff8cd84172e19b754e7264a33df460873e6eb3d6e55758531580970de50ae950c496256bb4ad3691a2974cddff189f0 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10/61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10/175e4d5e20980c3cd316ae82d2c031c42f6c746467d8b1905b51060a0ba4461441a0c25bb67c025fd9617f9a3873e152c7b543c6b5ac83a1846be8ade80dffd6 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10/ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 + languageName: node + linkType: hard + +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10/f47365cc2cb7f078cbe7e046eb52655e2e7e97f8c0a9a674f4da60d94fb0624edfcec9b5db32e8ba5a99a5f036f595680ae6fe02a262beaa73026e505cc52f99 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10/3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10/d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 + languageName: node + linkType: hard + +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10/0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" + dependencies: + dns-packet: "npm:^5.2.2" + thunky: "npm:^1.0.2" + bin: + multicast-dns: cli.js + checksum: 10/e9add8035fb7049ccbc87b1b069f05bb3b31e04fe057bf7d0116739d81295165afc2568291a4a962bee01a5074e475996816eed0f50c8110d652af5abb74f95a + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 10/a2d2e79dde87e3424ffc8c334472c7f3d17b072137734ca46e6f221131f1b014201cc593b69a38062e974fb2394d3d1cb4349f80f012bbf8b8ac1b28033e515f + languageName: node + linkType: hard + +"mute-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10/36fc968b0e9c9c63029d4f9dc63911950a3bdf55c9a87f58d3a266289b67180201cade911e7699f8b2fa596b34c9db43dad37649e3f7fdd13c3bb9edb0017ee7 + languageName: node + linkType: hard + +"mz@npm:^2.4.0, mz@npm:^2.7.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: "npm:^1.0.0" + object-assign: "npm:^4.0.1" + thenify-all: "npm:^1.0.0" + checksum: 10/8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.20": + version: 3.3.20 + resolution: "nanoid@npm:3.3.20" + bin: + nanoid: bin/nanoid.cjs + checksum: 10/b19641487fc25325189175226a4b9fcc8da39989c6a39fd35921802158d6b1725d59d8454a4e30643d2bb4837382cac11ee129417282678a67f8394b31c228d9 + languageName: node + linkType: hard + +"napi-build-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "napi-build-utils@npm:2.0.0" + checksum: 10/69adcdb828481737f1ec64440286013f6479d5b264e24d5439ba795f65293d0bb6d962035de07c65fae525ed7d2fcd0baab6891d8e3734ea792fec43918acf83 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10/23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10/d98c04a136583afd055746168f1067d58ce4bfe6e4c73ca1d339567f81ea1f7e665b5bd1e81f4771c67b6c2ea89b21cb2adaea2b16058c7dc31317778f931dab + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10/1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 + languageName: node + linkType: hard + +"netmask@npm:^2.0.2": + version: 2.1.1 + resolution: "netmask@npm:2.1.1" + checksum: 10/473430b03b09787ad80041d5df4f43d93e7d9484c2646156eee0b31b95d627983aa5ccaf2bb9fc3fb3926bcf2dab82aa41005ad90d0095eb802f9a2354b2de27 + languageName: node + linkType: hard + +"nimma@npm:0.2.3": + version: 0.2.3 + resolution: "nimma@npm:0.2.3" + dependencies: + "@jsep-plugin/regex": "npm:^1.0.1" + "@jsep-plugin/ternary": "npm:^1.0.2" + astring: "npm:^1.8.1" + jsep: "npm:^1.2.0" + jsonpath-plus: "npm:^6.0.1 || ^10.1.0" + lodash.topath: "npm:^4.5.2" + dependenciesMeta: + jsonpath-plus: + optional: true + lodash.topath: + optional: true + checksum: 10/4403a6583278673d792dae16a01d8a134bb23851b133416d1a54b496edc53a163305fb72c70720d4d719a9faacf3f97dc4adcee22ffe0f3434e9e5058a2a5688 + languageName: node + linkType: hard + +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10/0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.101.0 + resolution: "node-abi@npm:3.101.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/dc322415bf65ee905cd789014aa854fb55075842e1da4f3cb4944668e162fd68b140b4e725db3709ae63c7a614c05f2e1ae4b50974fdecb9bfe05da9c8850df6 + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.0.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10/0a2cdb7ec0aeaf3cb31e1ca0e192f5add48f1c5c9c9ed822129f9dddbd9432f69b7425982f94ce803c56a2104884530aa67cd57696e5774b2e5b8ec2f58de042 + languageName: node + linkType: hard + +"node-addon-api@npm:^4.3.0": + version: 4.3.0 + resolution: "node-addon-api@npm:4.3.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10/d3b38d16cb9ad0714d965331d0e38cef1c27750c2c3343cd3464a9ed8158501a2910ccbf2fd9fdc476e806a19dbc9e0524ff9d66a7c779d42a9752a63ba30b80 + languageName: node + linkType: hard + +"node-emoji@npm:^2.2.0": + version: 2.2.0 + resolution: "node-emoji@npm:2.2.0" + dependencies: + "@sindresorhus/is": "npm:^4.6.0" + char-regex: "npm:^1.0.2" + emojilib: "npm:^2.4.0" + skin-tone: "npm:^2.0.0" + checksum: 10/2548668f5cc9f781c94dc39971a630b2887111e0970c29fc523e924819d1b39b53a2694a4d1046861adf538c4462d06ee0269c48717ccad30336a918d9a911d5 + languageName: node + linkType: hard + +"node-exports-info@npm:^1.6.0": + version: 1.6.2 + resolution: "node-exports-info@npm:1.6.2" + dependencies: + array.prototype.flatmap: "npm:^1.3.3" + es-errors: "npm:^1.3.0" + object.entries: "npm:^1.1.9" + semver: "npm:^6.3.1" + checksum: 10/6c9593094b3dd9b8a338f31490c0bad6da886a964b1bc6d95416dfe83810d4ab3493e53290b951d131a3148bf529f33bd908302aa4fd57c45c7b3d55e2cff848 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10/b24f8a3dc937f388192e59bcf9d0857d7b6940a2496f328381641cb616efccc9866e89ec43f2ec956bbd6c3d3ee05524ce77fe7b29ccd34692b3a16f237d6676 + languageName: node + linkType: hard + +"node-forge@npm:^1": + version: 1.4.0 + resolution: "node-forge@npm:1.4.0" + checksum: 10/d70fd769768e646eda73343d4d4105ccb6869315d975905a22117431c04ae5b6df6c488e34ed275b1a66b50195a09b84b5c8aeca3b8605c20605fcb8e9f109d9 + languageName: node + linkType: hard + +"node-gyp@npm:^10.0.0": + version: 10.3.1 + resolution: "node-gyp@npm:10.3.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^4.1.0" + semver: "npm:^7.3.5" + tar: "npm:^6.2.1" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10/d3004f648559e42d7ec8791ea75747fe8a163a6061c202e311e5d7a5f6266baa9a5f5c6fde7be563974c88b030c5d0855fd945364f52fcd230d2a2ceee7be80d + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 13.1.0 + resolution: "node-gyp@npm:13.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + nopt: "npm:^10.0.0" + proc-log: "npm:^7.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.7" + tinyglobby: "npm:^0.2.12" + undici: "npm:^8.4.1" + which: "npm:^7.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10/808fa8e3ccf2528eb5ade4f9b7e9b98cae26e02846d8ec08e4d6b23a2069a3211255e9100648cb5054a98a1343183601b5eb312d61091beeadea35035ecb15ab + languageName: node + linkType: hard + +"node-releases@npm:^2.0.59": + version: 2.0.60 + resolution: "node-releases@npm:2.0.60" + checksum: 10/2354967ce9722674f4b2fb8e0af3a8e6f575620a049d041a13035f10f7c87ec2ad606214c4dd86692c6f9574786fc3b6992c23a79d61747ad5f4dfab7d6cb52e + languageName: node + linkType: hard + +"node-sarif-builder@npm:^2.0.3": + version: 2.0.3 + resolution: "node-sarif-builder@npm:2.0.3" + dependencies: + "@types/sarif": "npm:^2.1.4" + fs-extra: "npm:^10.0.0" + checksum: 10/d06d01c4be51074c79d64b270b6022a19fbced203484f3078d779c4859c1b44e7eb276c5be0c3f29006e8211ed7dad77f8729fe379b3b576752545b8188389f6 + languageName: node + linkType: hard + +"node-stdlib-browser@npm:^1.3.1": + version: 1.3.1 + resolution: "node-stdlib-browser@npm:1.3.1" + dependencies: + assert: "npm:^2.0.0" + browser-resolve: "npm:^2.0.0" + browserify-zlib: "npm:^0.2.0" + buffer: "npm:^5.7.1" + console-browserify: "npm:^1.1.0" + constants-browserify: "npm:^1.0.0" + create-require: "npm:^1.1.1" + crypto-browserify: "npm:^3.12.1" + domain-browser: "npm:4.22.0" + events: "npm:^3.0.0" + https-browserify: "npm:^1.0.0" + isomorphic-timers-promises: "npm:^1.0.1" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:^1.0.1" + pkg-dir: "npm:^5.0.0" + process: "npm:^0.11.10" + punycode: "npm:^1.4.1" + querystring-es3: "npm:^0.2.1" + readable-stream: "npm:^3.6.0" + stream-browserify: "npm:^3.0.0" + stream-http: "npm:^3.2.0" + string_decoder: "npm:^1.0.0" + timers-browserify: "npm:^2.0.4" + tty-browserify: "npm:0.0.1" + url: "npm:^0.11.4" + util: "npm:^0.12.4" + vm-browserify: "npm:^1.0.1" + checksum: 10/5d5ace50868ef1a8ce9718a5fc64e4b6712f8be75bf6ab71f2eb7b5815f55f20507e427eac2fdb384e372f58891eb34089af3b55d3f9b5b60b547c8581a1c30e + languageName: node + linkType: hard + +"nopt@npm:^10.0.0": + version: 10.0.1 + resolution: "nopt@npm:10.0.1" + dependencies: + abbrev: "npm:^5.0.0" + bin: + nopt: bin/nopt.js + checksum: 10/8021371365e78a2cbab015cac50d8449aa2cc411f0b8f2edb466c1336c3dfee4e61c5bf5bde22ee7dcea80d5f4510a7a8705ed3646c8d782f28b550c62bc4fdf + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10/95a1f6dec8a81cd18cdc2fed93e6f0b4e02cf6bdb4501c848752c6e34f9883d9942f036a5e3b21a699047d8a448562d891e67492df68ec9c373e6198133337ae + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10/5ae699402c9d5ffa330adc348fcd6fc6e6a155ab7c811b96e30b7ecab60ceef821d8f86443869671dda71bbc47f4b9625739c82ad247e883e9aefe875bfb8659 + languageName: node + linkType: hard + +"npm-bundled@npm:^2.0.0": + version: 2.0.1 + resolution: "npm-bundled@npm:2.0.1" + dependencies: + npm-normalize-package-bin: "npm:^2.0.0" + checksum: 10/adf5d727915cbd61603e2171ba67e39319efa343ceb72868348232a36ad774a8365d5af5e1aad29acc41c3caeda4ebd80e5b7a3da319985509aeedf79e352c0d + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^2.0.0": + version: 2.0.0 + resolution: "npm-normalize-package-bin@npm:2.0.0" + checksum: 10/7c5379f9b188b564c4332c97bdd9a5d6b7b15f02b5823b00989d6a0e6fb31eb0280f02b0a924f930e1fcaf00e60fae333aec8923d2a4c7747613c7d629d8aa25 + languageName: node + linkType: hard + +"npm-packlist@npm:^5.0.0": + version: 5.1.3 + resolution: "npm-packlist@npm:5.1.3" + dependencies: + glob: "npm:^8.0.1" + ignore-walk: "npm:^5.0.1" + npm-bundled: "npm:^2.0.0" + npm-normalize-package-bin: "npm:^2.0.0" + bin: + npm-packlist: bin/index.js + checksum: 10/78aa1c69a349c40cf7ba556581bff2dd5cbc1455614a44bd673e076f7f402096ac7c01660c45ec17cbd51bf0db3a4df7e9bc3a0a8e8e497ebf6d53848f33dfad + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10/5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb + languageName: node + linkType: hard + +"object-is@npm:^1.1.5": + version: 1.1.6 + resolution: "object-is@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + checksum: 10/4f6f544773a595da21c69a7531e0e1d6250670f4e09c55f47eb02c516035cfcb1b46ceb744edfd3ecb362309dbccb6d7f88e43bf42e4d4595ac10a329061053a + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10/3d81d02674115973df0b7117628ea4110d56042e5326413e4b4313f0bcdf7dd78d4a3acef2c831463fa3796a66762c49daef306f4a0ea1af44877d7086d73bde + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10/3fe28cdd779f2a728a9a66bd688679ba231a2b16646cd1e46b528fe7c947494387dda4bc189eff3417f3717ef4f0a8f2439347cf9a9aa3cef722fbfd9f615587 + languageName: node + linkType: hard + +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10/24163ab1e1e013796693fc5f5d349e8b3ac0b6a34a7edb6c17d3dd45c6a8854145780c57d302a82512c1582f63720f4b4779d6c1cfba12cbb1420b978802d8a3 + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/5b2e80f7af1778b885e3d06aeb335dcc86965e39464671adb7167ab06ac3b0f5dd2e637a90d8ebd7426d69c6f135a4753ba3dd7d0fe2a7030cf718dcb910fd92 + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10/44cb86dd2c660434be65f7585c54b62f0425b0c96b5c948d2756be253ef06737da7e68d7106e35506ce4a44d16aa85a413d11c5034eb7ce5579ec28752eb42d0 + languageName: node + linkType: hard + +"object.values@npm:^1.1.6, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/f5ec9eccdefeaaa834b089c525663436812a65ff13de7964a1c3a9110f32054f2d58aa476a645bb14f75a79f3fe1154fb3e7bfdae7ac1e80affe171b2ef74bce + languageName: node + linkType: hard + +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10/53ff4ab3a13cc33ba6c856cf281f2965c0aec9720967af450e8fd06cfd50aceeefc791986a16bcefa14e7898b3ca9acdfcf15b9d9a1b9c7e1366581a8ad6e65e + languageName: node + linkType: hard + +"on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": + version: 2.4.2 + resolution: "on-finished@npm:2.4.2" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10/7eef692405d7ca1af74f5c02eb1f7b261ffef3f659e9f8628eff6fcbf3eb709d685704d1deed9e756db1d31bd016c8983066d80220a606c12a9d0bd4b7642399 + languageName: node + linkType: hard + +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10/98aa64629f986fb8cc4517dd8bede73c980e31208cba97f4442c330959f60ced3dc6214b83420491f5111fc7c4f4343abe2ea62c85f505cf041d67850f238776 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10/cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10/e9fd0695a01cf226652f0385bf16b7a24153dbbb2039f764c8ba6d2306a8506b0e4ce570de6ad99c7a6eb49520743afdb66edd95ee979c1a342554ed49a9aadd + languageName: node + linkType: hard + +"open@npm:^10.0.3": + version: 10.2.0 + resolution: "open@npm:10.2.0" + dependencies: + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + wsl-utils: "npm:^0.1.0" + checksum: 10/e6ad9474734eac3549dcc7d85e952394856ccaee48107c453bd6a725b82e3b8ed5f427658935df27efa76b411aeef62888edea8a9e347e8e7c82632ec966b30e + languageName: node + linkType: hard + +"open@npm:^8.4.0": + version: 8.4.2 + resolution: "open@npm:8.4.2" + dependencies: + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10/acd81a1d19879c818acb3af2d2e8e9d81d17b5367561e623248133deb7dd3aefaed527531df2677d3e6aaf0199f84df57b6b2262babff8bf46ea0029aac536c9 + languageName: node + linkType: hard + +"openapi-types@npm:^12.0.0": + version: 12.1.3 + resolution: "openapi-types@npm:12.1.3" + checksum: 10/9d1d7ed848622b63d0a4c3f881689161b99427133054e46b8e3241e137f1c78bb0031c5d80b420ee79ac2e91d2e727ffd6fc13c553d1b0488ddc8ad389dcbef8 + languageName: node + linkType: hard + +"oppa@npm:^0.4.0": + version: 0.4.0 + resolution: "oppa@npm:0.4.0" + dependencies: + chalk: "npm:^4.1.1" + checksum: 10/218adfa750631bd28aabbcd3fb49f9ff8801c3f9386def7cb353f63e476f3ed295c82d02ccc49e36afae99e9151b3ec9764bc800c1550e33c3e65015c5c0034d + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10/a8398559c60aef88d7f353a4f98dcdff6090a4e70f874c827302bf1213d9106a1c4d5fcb68dacb1feb3c30a04c4102f41047aa55d4c576b863d6fc876e001af6 + languageName: node + linkType: hard + +"ora@npm:^5.3.0, ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10/8d071828f40090a8e1c6e8f350c6eb065808e9ab2b3e57fa37e0d5ae78cb46dac00117c8f12c3c8b8da2923454afbd8265e08c10b69881170c5b269f451e7fef + languageName: node + linkType: hard + +"os-browserify@npm:^0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 10/16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf + languageName: node + linkType: hard + +"outdent@npm:^0.5.0": + version: 0.5.0 + resolution: "outdent@npm:0.5.0" + checksum: 10/7d94a7d93883afa32c99d84f33248b221f4eeeedbb571921fe0e5cf0bee32e64746c587e9606d98ec22762870c782d21dd4bc3a0edf442d347cb54aa107b198d + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.2 + resolution: "own-keys@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.4" + get-intrinsic: "npm:^1.3.0" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10/95add82ab823dfa5178c82d725b939eb1436b6a56ed2729dba31c7e2e03792d8e9ef504293959e9fda6f417d7133cb0ccdb96990c12f6d1e35b02dcbca408ac3 + languageName: node + linkType: hard + +"oxc-resolver@npm:^11.19.1": + version: 11.24.2 + resolution: "oxc-resolver@npm:11.24.2" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.24.2" + "@oxc-resolver/binding-android-arm64": "npm:11.24.2" + "@oxc-resolver/binding-darwin-arm64": "npm:11.24.2" + "@oxc-resolver/binding-darwin-x64": "npm:11.24.2" + "@oxc-resolver/binding-freebsd-x64": "npm:11.24.2" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.24.2" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.24.2" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.24.2" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.24.2" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.24.2" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.24.2" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.24.2" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.24.2" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.24.2" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.24.2" + "@oxc-resolver/binding-openharmony-arm64": "npm:11.24.2" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.24.2" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.24.2" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.24.2" + dependenciesMeta: + "@oxc-resolver/binding-android-arm-eabi": + optional: true + "@oxc-resolver/binding-android-arm64": + optional: true + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm-musleabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-ppc64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-musl": + optional: true + "@oxc-resolver/binding-linux-s390x-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-openharmony-arm64": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10/42e10840125f4b942a7cbcad757f1d882eb737cd6c96c13128eade6613c56a24727075e069b3dff145b3cd36e21fe5e4a1de19b5da09466864fa63d35aae71f3 + languageName: node + linkType: hard + +"p-filter@npm:^2.1.0": + version: 2.1.0 + resolution: "p-filter@npm:2.1.0" + dependencies: + p-map: "npm:^2.0.0" + checksum: 10/76e552ca624ce2233448d68b19eec9de42b695208121998f7e011edce71d1079a83096ee6a2078fb2a59cfa8a5c999f046edf00ebf16a8e780022010b4693234 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10/93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 + languageName: node + linkType: hard + +"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10/84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10/7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: "npm:^2.0.0" + checksum: 10/83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10/513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10/1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^2.0.0": + version: 2.1.0 + resolution: "p-map@npm:2.1.0" + checksum: 10/9e3ad3c9f6d75a5b5661bcad78c91f3a63849189737cd75e4f1225bf9ac205194e5c44aac2ef6f09562b1facdb9bd1425584d7ac375bfaa17b3f1a142dab936d + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10/7ba4a2b1e24c05e1fc14bbaea0fc6d85cf005ae7e9c9425d4575550f37e2e584b1af97bcde78eacd7559208f20995988d52881334db16cf77bc1bcf68e48ed7c + languageName: node + linkType: hard + +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10/60fe227ffce59fbc5b1b081305b61a2f283ff145005853702b7d4d3f99a0176bd21bb126c99a962e51fe1e01cb8aa10f0488b7bbe73b5dc2e84b5cc650b8ffd2 + languageName: node + linkType: hard + +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" + dependencies: + "@types/retry": "npm:0.12.2" + is-network-error: "npm:^1.0.0" + retry: "npm:^0.13.1" + checksum: 10/7104ef13703b155d70883b0d3654ecc03148407d2711a4516739cf93139e8bec383451e14925e25e3c1ae04dbace3ed53c26dc3853c1e9b9867fcbdde25f4cdc + languageName: node + linkType: hard + +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10/f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"pac-proxy-agent@npm:9.1.0": + version: 9.1.0 + resolution: "pac-proxy-agent@npm:9.1.0" + dependencies: + agent-base: "npm:9.0.0" + debug: "npm:^4.3.4" + get-uri: "npm:8.0.1" + http-proxy-agent: "npm:9.1.0" + https-proxy-agent: "npm:9.1.0" + pac-resolver: "npm:9.0.1" + quickjs-wasi: "npm:^2.2.0" + socks-proxy-agent: "npm:10.1.0" + checksum: 10/02a06c697796eb35a01a1e9949651a5151b1e6a0d06146e0ab54adf0aec3fd446e58c539cd391d50f205c3db58a16ef3c1d3818d3a17940259a21cd0b9d82003 + languageName: node + linkType: hard + +"pac-resolver@npm:9.0.1": + version: 9.0.1 + resolution: "pac-resolver@npm:9.0.1" + dependencies: + degenerator: "npm:7.0.1" + netmask: "npm:^2.0.2" + peerDependencies: + quickjs-wasi: ^2.2.0 + checksum: 10/d3f3cea34df195adf02c7155f8f1501d5830c10360d5a26371af237b122dc1cae32dad34dcf8d5c2a473293ef7b37f3e551f45edc651db148de013fc421ff8b4 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 + languageName: node + linkType: hard + +"package-manager-detector@npm:^0.2.0": + version: 0.2.11 + resolution: "package-manager-detector@npm:0.2.11" + dependencies: + quansync: "npm:^0.2.7" + checksum: 10/2c1a8da0e5895f0be06a8e1f4b4336fb78a19167ca3932dbaeca7260f948e67cf53b32585a13f8108341e7a468b38b4f2a8afc7b11691cb2d856ecd759d570fb + languageName: node + linkType: hard + +"pako@npm:~1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10/1ad07210e894472685564c4d39a08717e84c2a68a70d3c1d9e657d32394ef1670e22972a433cbfe48976cb98b154ba06855dcd3fcfba77f60f1777634bec48c0 + languageName: node + linkType: hard + +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10/6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.9": + version: 5.1.10 + resolution: "parse-asn1@npm:5.1.10" + dependencies: + asn1.js: "npm:^4.10.1" + browserify-aes: "npm:^1.2.0" + evp_bytestokey: "npm:^1.0.3" + pbkdf2: "npm:^3.1.7" + safe-buffer: "npm:^5.2.1" + checksum: 10/e8f6ae3e7010cf076b5e5f6278ff6de4b0e975eea2fa4a3ebbc759b9d1a9a7eabdc8cc64b856045b3c650159773f3c77328c632ad0d1a90e7c685eb1de107939 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10/62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^6.0.0": + version: 6.0.1 + resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" + dependencies: + parse5: "npm:^6.0.1" + checksum: 10/3400a2cd1ad450b2fe148544154f86ea53d3ed6b6eab56c78bb43b9629d3dfe9f580dffd75bbf32be134ffef645b68081fc764bf75c210f236ab9c5c8c38c252 + languageName: node + linkType: hard + +"parse5@npm:^5.1.1": + version: 5.1.1 + resolution: "parse5@npm:5.1.1" + checksum: 10/5b509744cfe81488a33be05578df490c460690e64519fa67f0a0acb9c1bca05914e8acad17a977e2cf5964a000e43959b40024f0c243dd6595dd0cca8a32f71b + languageName: node + linkType: hard + +"parse5@npm:^6.0.1": + version: 6.0.1 + resolution: "parse5@npm:6.0.1" + checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10/407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + +"passport-strategy@npm:1.x.x": + version: 1.0.0 + resolution: "passport-strategy@npm:1.0.0" + checksum: 10/5086693f2508e538dffa55a338c89fe8192fb5f4478c71f80cd5890b8573419a098f4fec88b505374f60bbe9049f6f24b9f3992678612528a3370b4dc73354a2 + languageName: node + linkType: hard + +"passport@npm:^0.7.0": + version: 0.7.0 + resolution: "passport@npm:0.7.0" + dependencies: + passport-strategy: "npm:1.x.x" + pause: "npm:0.0.1" + utils-merge: "npm:^1.0.1" + checksum: 10/0ebd4de8e3cba6731b1fddd09b95b8332526f316afded9c9589ff68751e10001c9f1c007170a516e8c1909f9fafdc378c12feb82820241856775005924735b29 + languageName: node + linkType: hard + +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 10/7e7368a5207e7c6b9051ef045711d0dc3c2b6203e96057e408e6e74d09f383061010d2be95cb8593fe6258a767c3e9fc6b2bfc7ce8d48ae8c3d9f6994cca9ad8 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10/96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10/505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10/060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10/55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10/49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/2b4257422bcb870a4c2d205b3acdbb213a72f5e2250f61c80f79c9d014d010f82bdf8584441612c8e1fa4eb098678f5704a66fa8377d72646bad4be38e57a2c3 + languageName: node + linkType: hard + +"path-to-regexp@npm:8.4.2": + version: 8.4.2 + resolution: "path-to-regexp@npm:8.4.2" + checksum: 10/70fd2cbce0b962cbcf4d312af07818bfce2bae11c09cf3bd86be99c0e30168238a1a7b02b18b452e73f075897df04597d30d63e56da7be41eecfc37998693389 + languageName: node + linkType: hard + +"path-to-regexp@npm:~0.1.13": + version: 0.1.13 + resolution: "path-to-regexp@npm:0.1.13" + checksum: 10/f1e4bdedc4fd41a3b8dd76e8b2e1183105348c6b205badc072581ca63dc6aa7976a8a67feaffcf0e505f51ac12cb1a2de7f3fef3e9085b6849e76232d73ddcba + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10/5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d + languageName: node + linkType: hard + +"pause@npm:0.0.1": + version: 0.0.1 + resolution: "pause@npm:0.0.1" + checksum: 10/e96ee581b68085e6f2ba5adbcb4d4a41fe88e5b514061e76df2fe1905f0f65f4fe5a843b538e9551122c6b9184ff4be266c2ee0ea4614702f9a3d04466d9f462 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.1.2, pbkdf2@npm:^3.1.7": + version: 3.1.7 + resolution: "pbkdf2@npm:3.1.7" + dependencies: + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + ripemd160: "npm:^2.0.3" + safe-buffer: "npm:^5.2.1" + sha.js: "npm:^2.4.12" + to-buffer: "npm:^1.2.2" + checksum: 10/3b8cf9d991d823d426f71aecbb75f9ec261887683448f1f41e16cd3745512b3d96c3f455f6417ca5c562a9ef557a82f7888e703e8f03695de989603ae5d1f555 + languageName: node + linkType: hard + +"pct-encode@npm:~1.0.0": + version: 1.0.3 + resolution: "pct-encode@npm:1.0.3" + checksum: 10/04344233107a40590dd2d6fff3463040288d68ec66b6026cbb90a6ab1b29afdb5f196ff35b6ab5f86d4799a0dfea6117ab19fe836e0d5ffb49695c6ba60d05d8 + languageName: node + linkType: hard + +"pg-connection-string@npm:2.6.2": + version: 2.6.2 + resolution: "pg-connection-string@npm:2.6.2" + checksum: 10/22265882c3b6f2320785378d0760b051294a684989163d5a1cde4009e64e84448d7bf67d9a7b9e7f69440c3ee9e2212f9aa10dd17ad6773f6143c6020cebbcb5 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.2 + resolution: "picomatch@npm:2.3.2" + checksum: 10/b788ef8148a2415b9dec12f0bb350ae6a5830f8f1950e472abc2f5225494debf7d1b75eb031df0ceaea9e8ec3e7bad599e8dbf3c60d61b42be429ba41bff4426 + languageName: node + linkType: hard + +"picomatch@npm:^4.0.1, picomatch@npm:^4.0.2, picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.7 + resolution: "picomatch@npm:4.0.7" + checksum: 10/66e1df34bc39c72fa3756be4069f7887ea3e35e94bba1c3f6167763007698cb04b8a0a365161d186fda6e9571a2d3efb606b2966eb6a7dea6252911224dc2f48 + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10/8b97cbf9dc6d4c1320cc238a2db0fc67547f9dc77011729ff353faf34f1936ea1a4d7f3c63b2f4980b253be77bcc72ea1e9e76ee3fd53cce2aafb6a8854d07ec + languageName: node + linkType: hard + +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 10/443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + +"pirates@npm:^4.0.1, pirates@npm:^4.0.6": + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 10/2427f371366081ae42feb58214f04805d6b41d6b84d74480ebcc9e0ddbd7105a139f7c653daeaf83ad8a1a77214cf07f64178e76de048128fec501eab3305a96 + languageName: node + linkType: hard + +"pkg-dir@npm:^5.0.0": + version: 5.0.0 + resolution: "pkg-dir@npm:5.0.0" + dependencies: + find-up: "npm:^5.0.0" + checksum: 10/b167bb8dac7bbf22b1d5e30ec223e6b064b84b63010c9d49384619a36734caf95ed23ad23d4f9bd975e8e8082b60a83395f43a89bb192df53a7c25a38ecb57d9 + languageName: node + linkType: hard + +"pkg-up@npm:^3.1.0": + version: 3.1.0 + resolution: "pkg-up@npm:3.1.0" + dependencies: + find-up: "npm:^3.0.0" + checksum: 10/5bac346b7c7c903613c057ae3ab722f320716199d753f4a7d053d38f2b5955460f3e6ab73b4762c62fd3e947f58e04f1343e92089e7bb6091c90877406fcd8c8 + languageName: node + linkType: hard + +"pkijs@npm:^3.3.3": + version: 3.4.3 + resolution: "pkijs@npm:3.4.3" + dependencies: + "@noble/hashes": "npm:1.8.0" + asn1js: "npm:^3.0.6" + bytestreamjs: "npm:^2.0.1" + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10/1d3c6d74326572e8ecd9b0d57d51fa86ff48b9977d1a51ae4bb0a63ed77eb97c5807286be17d9b0eae0c4ccfa82488f32a328eb66af47c7888c2c8d0a07c6236 + languageName: node + linkType: hard + +"pony-cause@npm:^1.1.1": + version: 1.1.1 + resolution: "pony-cause@npm:1.1.1" + checksum: 10/8464dfdc1d102def7368810c0ef6d1b011004b0f372f2f57cce9bb293d5fd4a1f0bc37ac3464869c51c88d996815dabbcab7c618ec400730e6f61493755591d6 + languageName: node + linkType: hard + +"portfinder@npm:^1.0.32": + version: 1.0.38 + resolution: "portfinder@npm:1.0.38" + dependencies: + async: "npm:^3.2.6" + debug: "npm:^4.3.6" + checksum: 10/369155c3e7efa10ad348cd6686eb9efe57f334a4638f9107fd6ad6705dc532841f9bd8346182591280b2c7837600d8fb0cf0d1ced69a78caa8544fc3bb43653a + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0, possible-typed-array-names@npm:^1.1.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10/2f44137b8d3dd35f4a7ba7469eec1cd9cfbb46ec164b93a5bc1f4c3d68599c9910ee3b91da1d28b4560e9cc8414c3cd56fedc07259c67e52cc774476270d3302 + languageName: node + linkType: hard + +"postcss-calc@npm:^8.2.3": + version: 8.2.4 + resolution: "postcss-calc@npm:8.2.4" + dependencies: + postcss-selector-parser: "npm:^6.0.9" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.2 + checksum: 10/f34d0cbc5d2b02071cf4de9bacbb93681c22b29048726b500b5f5327e37b590d2552ba4d8ed179e2378037fd09cc6bf5ee3e25cbd8a803c57205795fa79479a8 + languageName: node + linkType: hard + +"postcss-colormin@npm:^5.3.1": + version: 5.3.1 + resolution: "postcss-colormin@npm:5.3.1" + dependencies: + browserslist: "npm:^4.21.4" + caniuse-api: "npm:^3.0.0" + colord: "npm:^2.9.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/e5778baab30877cd1f51e7dc9d2242a162aeca6360a52956acd7f668c5bc235c2ccb7e4df0370a804d65ebe00c5642366f061db53aa823f9ed99972cebd16024 + languageName: node + linkType: hard + +"postcss-convert-values@npm:^5.1.3": + version: 5.1.3 + resolution: "postcss-convert-values@npm:5.1.3" + dependencies: + browserslist: "npm:^4.21.4" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/dacb41296a4d730c9e84c1b6ba8a13f6515b65811689b8b62ad6c7174bb462b5c0bfa21803cc06d1d3af16dbc8f4be1e225970844297fab0bedfe2fef8dc603e + languageName: node + linkType: hard + +"postcss-discard-comments@npm:^5.1.2": + version: 5.1.2 + resolution: "postcss-discard-comments@npm:5.1.2" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/abfd064ebc27aeaf5037643dd51ffaff74d1fa4db56b0523d073ace4248cbb64ffd9787bd6924b0983a9d0bd0e9bf9f10d73b120e50391dc236e0d26c812fa2a + languageName: node + linkType: hard + +"postcss-discard-duplicates@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-discard-duplicates@npm:5.1.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/88d6964201b1f4ed6bf7a32cefe68e86258bb6e42316ca01d9b32bdb18e7887d02594f89f4a2711d01b51ea6e3fcca8c54be18a59770fe5f4521c61d3eb6ca35 + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-discard-empty@npm:5.1.1" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/970adb12fae5c214c0768236ad9a821552626e77dedbf24a8213d19cc2c4a531a757cd3b8cdd3fc22fb1742471b8692a1db5efe436a71236dec12b1318ee8ff4 + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-discard-overridden@npm:5.1.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/d64d4a545aa2c81b22542895cfcddc787d24119f294d35d29b0599a1c818b3cc51f4ee80b80f5a0a09db282453dd5ac49f104c2117cc09112d0ac9b40b499a41 + languageName: node + linkType: hard + +"postcss-import@npm:^16.1.0": + version: 16.2.0 + resolution: "postcss-import@npm:16.2.0" + dependencies: + postcss-value-parser: "npm:^4.0.0" + read-cache: "npm:^1.0.0" + resolve: "npm:^1.1.7" + peerDependencies: + postcss: ^8.0.0 + checksum: 10/264ada79acbc9819c35465d94ad3bb024912564cc9459f8652c5d3011af2bd383f81e2b078e771be5535a81b1143e071b132aeee321cb04911fb09996b2bbf22 + languageName: node + linkType: hard + +"postcss-load-config@npm:^3.0.0": + version: 3.1.4 + resolution: "postcss-load-config@npm:3.1.4" + dependencies: + lilconfig: "npm:^2.0.5" + yaml: "npm:^1.10.2" + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + checksum: 10/75fa409d77b96e6f53e99f680c550f25ca8922c1150d3d368ded1f6bd8e0d4d67a615fe1f1c5d409aefb6e66fb4b5e48e86856d581329913de84578def078b19 + languageName: node + linkType: hard + +"postcss-merge-longhand@npm:^5.1.7": + version: 5.1.7 + resolution: "postcss-merge-longhand@npm:5.1.7" + dependencies: + postcss-value-parser: "npm:^4.2.0" + stylehacks: "npm:^5.1.1" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/9002696bb245634c0542af9356b44082a4c1453261a1daac6ea2f85055a5d6e14ac3ae2ba603f5eae767ebfe0e1ef50c40447b099520b8f5fa14b557da8074ad + languageName: node + linkType: hard + +"postcss-merge-rules@npm:^5.1.4": + version: 5.1.4 + resolution: "postcss-merge-rules@npm:5.1.4" + dependencies: + browserslist: "npm:^4.21.4" + caniuse-api: "npm:^3.0.0" + cssnano-utils: "npm:^3.1.0" + postcss-selector-parser: "npm:^6.0.5" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/659c3eaff9d573f07c227a7e4811159898f49a89b02bbd3a65a0ed7aaa434264443ab539bcbc273bf08986e6a185bd62af0847c9836f9e2901c5f07937c14f3f + languageName: node + linkType: hard + +"postcss-minify-font-values@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-minify-font-values@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/27e7023f06149e14db6cd30b75d233c92d34609233775d8542fe1dc70fe53170a13188ba80847d6d4f6e272beb98b9888e0f73097757a95a968a0d526e3dd495 + languageName: node + linkType: hard + +"postcss-minify-gradients@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-minify-gradients@npm:5.1.1" + dependencies: + colord: "npm:^2.9.1" + cssnano-utils: "npm:^3.1.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/8afc4c2240c0ddeb37b18f34e6d47d374c500376342c509b0fe577c56f9e94315a42db99a9573159efaf8853c7a1b9fee83b2f6f890a49273f3556b1ba9dbdde + languageName: node + linkType: hard + +"postcss-minify-params@npm:^5.1.4": + version: 5.1.4 + resolution: "postcss-minify-params@npm:5.1.4" + dependencies: + browserslist: "npm:^4.21.4" + cssnano-utils: "npm:^3.1.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/bd63e2cc89edcf357bb5c2a16035f6d02ef676b8cede4213b2bddd42626b3d428403849188f95576fc9f03e43ebd73a29bf61d33a581be9a510b13b7f7f100d5 + languageName: node + linkType: hard + +"postcss-minify-selectors@npm:^5.2.1": + version: 5.2.1 + resolution: "postcss-minify-selectors@npm:5.2.1" + dependencies: + postcss-selector-parser: "npm:^6.0.5" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/59eca33eb9ce45b688cca33cf7bb96b07c874f6d2b90f4a3363bc95067c514825c61dd8775c9aa73a161c922333474e6f249cc58677cd77b2be8cc04019e0810 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.0.0, postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/00bfd3aff045fc13ded8e3bbfd8dfc73eff9a9708db1b2a132266aef6544c8d2aee7a5d7e021885f6f9bbd5565a9a9ab52990316e21ad9468a2534f87df8e849 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.0, postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/552329aa39fbf229b8ac5a04f8aed0b1553e7a3c10b165ee700d1deb020c071875b3df7ab5e3591f6af33d461df66d330ec9c1256229e45fc618a47c60f41536 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.0.0, postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/51c747fa15cedf1b2856da472985ea7a7bb510a63daf30f95f250f34fce9e28ef69b802e6cc03f9c01f69043d171bc33279109a9235847c2d3a75c44eac67334 + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/18021961a494e69e65da9e42b4436144c9ecee65845c9bfeff2b7a26ea73d60762f69e288be8bb645447965b8fd6b26a264771136810dc0172bd31b940aee4f2 + languageName: node + linkType: hard + +"postcss-modules@npm:^4.0.0": + version: 4.3.1 + resolution: "postcss-modules@npm:4.3.1" + dependencies: + generic-names: "npm:^4.0.0" + icss-replace-symbols: "npm:^1.1.0" + lodash.camelcase: "npm:^4.3.0" + postcss-modules-extract-imports: "npm:^3.0.0" + postcss-modules-local-by-default: "npm:^4.0.0" + postcss-modules-scope: "npm:^3.0.0" + postcss-modules-values: "npm:^4.0.0" + string-hash: "npm:^1.1.1" + peerDependencies: + postcss: ^8.0.0 + checksum: 10/014329db47cc6a283bd1e1ac3490170b28461e8772019fe3d53445c549efec8763cb9315fe60db25f046142947dace736dca92ad2dd5c98b9b6699d701d907fe + languageName: node + linkType: hard + +"postcss-normalize-charset@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-normalize-charset@npm:5.1.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/e79d92971fc05b8b3c9b72f3535a574e077d13c69bef68156a0965f397fdf157de670da72b797f57b0e3bac8f38155b5dd1735ecab143b9cc4032d72138193b4 + languageName: node + linkType: hard + +"postcss-normalize-display-values@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-normalize-display-values@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/b6eb7b9b02c3bdd62bbc54e01e2b59733d73a1c156905d238e178762962efe0c6f5104544da39f32cade8a4fb40f10ff54b63a8ebfbdff51e8780afb9fbdcf86 + languageName: node + linkType: hard + +"postcss-normalize-positions@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-normalize-positions@npm:5.1.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/d9afc233729c496463c7b1cdd06732469f401deb387484c3a2422125b46ec10b4af794c101f8c023af56f01970b72b535e88373b9058ecccbbf88db81662b3c4 + languageName: node + linkType: hard + +"postcss-normalize-repeat-style@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-normalize-repeat-style@npm:5.1.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/2c6ad2b0ae10a1fda156b948c34f78c8f1e185513593de4d7e2480973586675520edfec427645fa168c337b0a6b3ceca26f92b96149741ca98a9806dad30d534 + languageName: node + linkType: hard + +"postcss-normalize-string@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-normalize-string@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/227ddf520266d2f9847e799b9977aaa444636ba94e473137739539ef02e7cb6302826585ffda9897cfe2a9953e65632a08279cb1f572ca95e53d8b3dd6ba737f + languageName: node + linkType: hard + +"postcss-normalize-timing-functions@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-normalize-timing-functions@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/da550f50e90b0b23e17b67449a7d1efd1aa68288e66d4aa7614ca6f5cc012896be1972b7168eee673d27da36504faccf7b9f835c0f7e81243f966a42c8c030aa + languageName: node + linkType: hard + +"postcss-normalize-unicode@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-normalize-unicode@npm:5.1.1" + dependencies: + browserslist: "npm:^4.21.4" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/4c24d26cc9f4b19a9397db4e71dd600dab690f1de8e14a3809e2aa1452dbc3791c208c38a6316bbc142f29e934fdf02858e68c94038c06174d78a4937e0f273c + languageName: node + linkType: hard + +"postcss-normalize-url@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-normalize-url@npm:5.1.0" + dependencies: + normalize-url: "npm:^6.0.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/3bd4b3246d6600230bc827d1760b24cb3101827ec97570e3016cbe04dc0dd28f4dbe763245d1b9d476e182c843008fbea80823061f1d2219b96f0d5c724a24c0 + languageName: node + linkType: hard + +"postcss-normalize-whitespace@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-normalize-whitespace@npm:5.1.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/12d8fb6d1c1cba208cc08c1830959b7d7ad447c3f5581873f7e185f99a9a4230c43d3af21ca12c818e4690a5085a95b01635b762ad4a7bef69d642609b4c0e19 + languageName: node + linkType: hard + +"postcss-ordered-values@npm:^5.1.3": + version: 5.1.3 + resolution: "postcss-ordered-values@npm:5.1.3" + dependencies: + cssnano-utils: "npm:^3.1.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/53dd26f480a18ffb0c008ae956d8a7e11e43c37629d0fb17a7716ff3b0cd8585f97e80deac12e7f3fe129681a980d83d356217b0b8fffb70ff83859993d6d82a + languageName: node + linkType: hard + +"postcss-reduce-initial@npm:^5.1.2": + version: 5.1.2 + resolution: "postcss-reduce-initial@npm:5.1.2" + dependencies: + browserslist: "npm:^4.21.4" + caniuse-api: "npm:^3.0.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/6234a85dab32cc3ece384f62c761c5c0dd646e2c6a419d93ee7cdb78b657e43381df39bd4620dfbdc2157e44b51305e4ebe852259d12c8b435f1aa534548db3e + languageName: node + linkType: hard + +"postcss-reduce-transforms@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-reduce-transforms@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/49fffd474070a154764934b42d7d875ceadf54219f8346b4cadf931728ffba6a2dea7532ced3d267fd42d81c102211a5bf957af3b63b1ac428d454fa6ec2dbf4 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": + version: 6.1.5 + resolution: "postcss-selector-parser@npm:6.1.5" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/bd6c1eddafffa224274a8120e245fa611a92917973f2a6da64a092e60e1192802475a720caa731b71f384be5b39a16baedbd9bf6523136f95249da61884fe8ce + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.7 + resolution: "postcss-selector-parser@npm:7.1.7" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/9413749ad38d8e22e4a5e47287e5501493238ab73eea276381476933332604df49468451e99a3d6614463fd3ee96655a80821a93949cfe425ecd6acf210535b0 + languageName: node + linkType: hard + +"postcss-svgo@npm:^5.1.0": + version: 5.1.0 + resolution: "postcss-svgo@npm:5.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + svgo: "npm:^2.7.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/d86eb5213d9f700cf5efe3073799b485fb7cacae0c731db3d7749c9c2b1c9bc85e95e0baeca439d699ff32ea24815fc916c4071b08f67ed8219df229ce1129bd + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-unique-selectors@npm:5.1.1" + dependencies: + postcss-selector-parser: "npm:^6.0.5" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/637e7b786e8558265775c30400c54b6b3b24d4748923f4a39f16a65fd0e394f564ccc9f0a1d3c0e770618a7637a7502ea1d0d79f731d429cb202255253c23278 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10/e4e4486f33b3163a606a6ed94f9c196ab49a37a7a7163abfcd469e5f113210120d70b8dd5e33d64636f41ad52316a3725655421eb9a1094f1bcab1db2f555c62 + languageName: node + linkType: hard + +"postcss@npm:^8.1.0, postcss@npm:^8.4.33": + version: 8.5.31 + resolution: "postcss@npm:8.5.31" + dependencies: + nanoid: "npm:^3.3.20" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.2" + checksum: 10/d2a3415681570c4687cbb34d7a9cdb570619da73b764229260f7c7337d2359cffa1045f4081a4599bd0b9320bd23b05f9915057f7b13ad9534b0121c2e9de564 + languageName: node + linkType: hard + +"prebuild-install@npm:^7.0.1": + version: 7.1.3 + resolution: "prebuild-install@npm:7.1.3" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^2.0.0" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10/1b7e4c00d2750b532a4fc2a83ffb0c5fefa1b6f2ad071896ead15eeadc3255f5babd816949991af083cf7429e375ae8c7d1c51f73658559da36f948a020a3a11 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10/0b9d2c76801ca652a7f64892dd37b7e3fab149a37d2424920099bf894acccc62abb4424af2155ab36dea8744843060a2d8ddc983518d0b1e22265a22324b72ed + languageName: node + linkType: hard + +"prettier@npm:^2.3.2, prettier@npm:^2.7.1": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: 10/00cdb6ab0281f98306cd1847425c24cbaaa48a5ff03633945ab4c701901b8e96ad558eb0777364ffc312f437af9b5a07d0f45346266e8245beaf6247b9c62b24 + languageName: node + linkType: hard + +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10/0212ad8742f8bb6f412f95b07d7f6874c55514ac4384f4f7de0defe77e767cca99f667c2316529f62a041fa654194a99c1ee7e321e1b7f794b5cc700777634d6 + languageName: node + linkType: hard + +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a + languageName: node + linkType: hard + +"proc-log@npm:^7.0.0": + version: 7.0.0 + resolution: "proc-log@npm:7.0.0" + checksum: 10/97cd9f4a8a0d84e42ee91e106e5ba5edcb954521e8dbe26ee6ad31396e5c12cc2be5e5b6be7b53fa5a69959afbacd32719106e2d6f45802e34b31d9a3a01ec20 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10/1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10/dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10/96e1a82453c6c96eef53a37a1d6134c9f2482f94068f98a59145d0986ca4e497bf110a410adf73857e588165eab3899f0ebcf7b3890c1b3ce802abc0d65967d4 + languageName: node + linkType: hard + +"promise.series@npm:^0.2.0": + version: 0.2.0 + resolution: "promise.series@npm:0.2.0" + checksum: 10/26b5956b5463d032b43d39fd8d34fdacf453ed3352462eed9626494a11d44beb385f86d6544dd12e51482a6ca8f303e0dfdee8653db4703213ba27dd2234754a + languageName: node + linkType: hard + +"prompts@npm:^2.4.2": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10/c52536521a4d21eff4f2f2aa4572446cad227464066365a7167e52ccf8d9839c099f9afec1aba0eed3d5a2514b3e79e0b3e7a1dc326b9acde6b75d27ed74b1a9 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10/7d959caec002bc964c86cdc461ec93108b27337dabe6192fb97d69e16a0c799a03462713868b40749bfc1caf5f57ef80ac3e4ffad3effa636ee667582a75e2c0 + languageName: node + linkType: hard + +"proper-lockfile@npm:^4.1.2": + version: 4.1.2 + resolution: "proper-lockfile@npm:4.1.2" + dependencies: + graceful-fs: "npm:^4.2.4" + retry: "npm:^0.12.0" + signal-exit: "npm:^3.0.2" + checksum: 10/000a4875f543f591872b36ca94531af8a6463ddb0174f41c0b004d19e231d7445268b422ff1ea595e43d238655c702250cd3d27f408e7b9d97b56f1533ba26bf + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.7": + version: 2.0.8 + resolution: "proxy-addr@npm:2.0.8" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10/6922b732c5625a9ba174c053bf3a750a80c87f19b7c62919f88ff01834eb80e2467834cfa72fc48b3a7ed6b3d18daadf773f6efb21db1c5fcc76d784509fcf1f + languageName: node + linkType: hard + +"proxy-agent-negotiate@npm:1.1.0": + version: 1.1.0 + resolution: "proxy-agent-negotiate@npm:1.1.0" + peerDependencies: + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true + checksum: 10/4554c42b8b872f37cf76c9044b7a5827bccf41ad77a1992b09bb89b84c779f5536bdd0d3312f247565e09fba8700e48a25f233e339705978242e3ca1d0dab149 + languageName: node + linkType: hard + +"proxy-agent@npm:8.0.2": + version: 8.0.2 + resolution: "proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:9.0.0" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:9.1.0" + https-proxy-agent: "npm:9.1.0" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:9.1.0" + proxy-from-env: "npm:^2.0.0" + socks-proxy-agent: "npm:10.1.0" + checksum: 10/3d0368780b243fbe56c95d1ce491d053e689eb2722a42f211b62e6897e4cf16d20bee2408e0bb01ee85199e73ee717fc1e220ce3f77ad55e4673f0587f1f9786 + languageName: node + linkType: hard + +"proxy-from-env@npm:^2.0.0, proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10/fbbaf4dab2a6231dc9e394903a5f66f20475e36b734335790b46feb9da07c37d6b32e2c02e3e2ea4d4b23774c53d8562e5b7cc73282cb43f4a597b7eacaee2ee + languageName: node + linkType: hard + +"public-encrypt@npm:^4.0.3": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10/059d64da8ba9ea0733377d23b57b6cbe5be663c8eb187b9c051eec85f799ff95c4e194eb3a69db07cc1f73a2a63519e67716ae9b8630e13e7149840d0abe044d + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.4 + resolution: "pump@npm:3.0.4" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10/d043c3e710c56ffd280711e98a94e863ab334f79ea43cee0fb70e1349b2355ffd2ff287c7522e4c960a247699d5b7825f00fa090b85d6179c973be13f78a6c49 + languageName: node + linkType: hard + +"punycode@npm:^1.4.1": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 10/af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 + languageName: node + linkType: hard + +"pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10/d45b12f8526e13ecf15fe09b30cde65501f3300fd2a07c11b28a966d434d1f767c8a61597ecba2e19c7eb19ca0c740341a6babc67a4f741e08b1ef1095c71663 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3, pvutils@npm:^1.2.0": + version: 1.2.0 + resolution: "pvutils@npm:1.2.0" + checksum: 10/30e2c6a5410a445e0dcbf6fd68d3a7725324d59acc4dd2b8ac8fa85fecfc591648b602a1e703287b9d8b07a2bbb80e4286d167d064647f542d5d966a45b314d7 + languageName: node + linkType: hard + +"qs@npm:^6.12.3, qs@npm:~6.16.0": + version: 6.16.1 + resolution: "qs@npm:6.16.1" + dependencies: + es-define-property: "npm:^1.0.1" + side-channel: "npm:^1.1.1" + checksum: 10/e33e0a5ceecb7bef81ea1f855365482045f55ba55278f40b8dbf9ee18eae8ef82d44246fe4e4009d6b6f102cbf2885a34b88c4272536cd628cde40b4ac9912c2 + languageName: node + linkType: hard + +"quansync@npm:^0.2.7": + version: 0.2.11 + resolution: "quansync@npm:0.2.11" + checksum: 10/d4f0cc21a25052a8a6183f17752a6221829c4795b40641de67c06945b356841ff00296d3700d0332dfe8e86100fdcc02f4be7559f3f1774a753b05adb7800d01 + languageName: node + linkType: hard + +"querystring-es3@npm:^0.2.1": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 10/c99fccfe1a9c4c25ea6194fa7a559fdb83d2628f118f898af6f0ac02c4ffcd7e0576997bb80e7dfa892d193988b60e23d4968122426351819f87051862af991c + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10/72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b + languageName: node + linkType: hard + +"quickjs-wasi@npm:^2.2.0": + version: 2.2.0 + resolution: "quickjs-wasi@npm:2.2.0" + checksum: 10/3b54d97cb1182dbda44e3c5483bb867bd2261c3644ff658aa55f23fe8590b29a59360fd7425a534578c222b4398b69867978baf8265bf8489ed0d51b32fc66b3 + languageName: node + linkType: hard + +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10/4efd1ad3d88db77c2d16588dc54c2b52fd2461e70fe5724611f38d283857094fe09040fa2c9776366803c3152cf133171b452ef717592b65631ce5dc3a2bdafc + languageName: node + linkType: hard + +"randomfill@npm:^1.0.4": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 10/33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7 + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1": + version: 1.3.0 + resolution: "range-parser@npm:1.3.0" + checksum: 10/f0b7a34de67333b80da0a1098cc02579bd5f74da717fdc0807caf87f043af6641d98d94c64a60477a8f88ba7c214aede965fd0e0c3036ea35c9fe89e1149923d + languageName: node + linkType: hard + +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10/ce21ef2a2dd40506893157970dc76e835c78cf56437e26e19189c48d5291e7279314477b06ac38abd6a401b661a6840f7b03bd0b1249da9b691deeaa15872c26 + languageName: node + linkType: hard + +"raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" + dependencies: + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + unpipe: "npm:~1.0.0" + checksum: 10/f35759fe5a6548e7c529121ead1de4dd163f899749a5896c42e278479df2d9d7f98b5bb17312737c03617765e5a1433e586f717616e5cfbebc13b4738b820601 + languageName: node + linkType: hard + +"raw-loader@npm:^4.0.2": + version: 4.0.2 + resolution: "raw-loader@npm:4.0.2" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/51cc1b0d0e8c37c4336b5318f3b2c9c51d6998ad6f56ea09612afcfefc9c1f596341309e934a744ae907177f28efc9f1654eacd62151e82853fcc6d37450e795 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10/5c4d72ae7eec44357171585938c85ce066da8ca79146b5635baf3d55d74584c92575fa4e2c9eac03efbed3b46a0b2e7c30634c012b4b4fa40d654353d3c163eb + languageName: node + linkType: hard + +"react-dev-utils@npm:^12.0.0-next.60": + version: 12.0.1 + resolution: "react-dev-utils@npm:12.0.1" + dependencies: + "@babel/code-frame": "npm:^7.16.0" + address: "npm:^1.1.2" + browserslist: "npm:^4.18.1" + chalk: "npm:^4.1.2" + cross-spawn: "npm:^7.0.3" + detect-port-alt: "npm:^1.1.6" + escape-string-regexp: "npm:^4.0.0" + filesize: "npm:^8.0.6" + find-up: "npm:^5.0.0" + fork-ts-checker-webpack-plugin: "npm:^6.5.0" + global-modules: "npm:^2.0.0" + globby: "npm:^11.0.4" + gzip-size: "npm:^6.0.0" + immer: "npm:^9.0.7" + is-root: "npm:^2.1.0" + loader-utils: "npm:^3.2.0" + open: "npm:^8.4.0" + pkg-up: "npm:^3.1.0" + prompts: "npm:^2.4.2" + react-error-overlay: "npm:^6.0.11" + recursive-readdir: "npm:^2.2.2" + shell-quote: "npm:^1.7.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + checksum: 10/4f6e04a3c4c6bc041bb85586646cff5e611049dd91f505e73cec47e284a854f28a25a4f50ff24b46e7df051b2a82c387870c8e08da232edbbbb36c01d4e94a2b + languageName: node + linkType: hard + +"react-error-overlay@npm:^6.0.11": + version: 6.1.0 + resolution: "react-error-overlay@npm:6.1.0" + checksum: 10/bb2b982461220e0868b0d3e0cfc006f9209a0e48b23a810e5548e76bb6c41e534a00ae328419256d76c8a2c1eae5e6ca3aa665bac21cd8d0b3bcb4fea616b2d2 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf + languageName: node + linkType: hard + +"react-refresh@npm:^0.18.0": + version: 0.18.0 + resolution: "react-refresh@npm:0.18.0" + checksum: 10/504c331c19776bf8320c23bad7f80b3a28de03301ed7523b0dd21d3f02bf2b53bbdd5aa52469b187bc90f358614b2ba303c088a0765c95f4f0a68c43a7d67b1d + languageName: node + linkType: hard + +"read-cache@npm:^1.0.0": + version: 1.0.2 + resolution: "read-cache@npm:1.0.2" + checksum: 10/4110deb383a3a34de0e38846e7ed4df27e3acb87adf4eee0cca4dd83d0a043f177d06120a06d47fd73635033ad8bc5fa8d07e038d5655ed58eae2f904fa4bf8f + languageName: node + linkType: hard + +"read-yaml-file@npm:^1.1.0": + version: 1.1.0 + resolution: "read-yaml-file@npm:1.1.0" + dependencies: + graceful-fs: "npm:^4.1.5" + js-yaml: "npm:^3.6.1" + pify: "npm:^4.0.1" + strip-bom: "npm:^3.0.0" + checksum: 10/41ee5f075507ef0403328dd54e225a61c3149f915675ce7fd0fd791ddcce2e6c30a9fe0f76ffa7a465c1c157b9b4ad8ded1dcf47dc3b396103eeb013490bbc2e + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10/8500dd3a90e391d6c5d889256d50ec6026c059fadee98ae9aa9b86757d60ac46fff24fafb7a39fa41d54cb39d8be56cc77be202ebd4cd8ffcf4cb226cbaa40d4 + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10/d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 + languageName: node + linkType: hard + +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10/7b817c265940dba90bb9c94d82920d76c3a35ea2d67f9f9d8bd936adcfe02d50c802b14be3dd2e725e002dddbe2cc1c7a0edfb1bc3a365c9dfd5a61e612eea1e + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10/196b30ef6ccf9b6e18c4e1724b7334f72a093d011a99f3b5920470f0b3406a51770867b3e1ae9711f227ef7a7065982f6ee2ce316746b2cb42c88efe44297fe7 + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: "npm:^1.20.0" + checksum: 10/ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 + languageName: node + linkType: hard + +"recursive-readdir@npm:^2.2.2": + version: 2.2.3 + resolution: "recursive-readdir@npm:2.2.3" + dependencies: + minimatch: "npm:^3.0.5" + checksum: 10/19298852b0b87810aed5f2c81a73bfaaeb9ade7c9bf363f350fc1443f2cc3df66ecade5e102dfbb153fcd9df20342c301848e11e149e5f78759c1d55aa2c9c39 + languageName: node + linkType: hard + +"reflect-metadata@npm:0.2.2, reflect-metadata@npm:^0.2.2": + version: 0.2.2 + resolution: "reflect-metadata@npm:0.2.2" + checksum: 10/1c93f9ac790fea1c852fde80c91b2760420069f4862f28e6fae0c00c6937a56508716b0ed2419ab02869dd488d123c4ab92d062ae84e8739ea7417fae10c4745 + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.10": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10/80a4e2be716f4fe46a89a08ccad0863b47e8ce0f49616cab2d65dab0fbd53c6fdba0f52935fd41d37a2e4e22355c272004f920d63070de849f66eea7aeb4a081 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10/8ab897ca445968e0b96f6237641510f3243e59c180ee2ee8d83889c52ff735dd1bf3657fcd36db053e35e1d823dd53f2565d0b8021ea282c9fe62401c6c3bd6d + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10/f5d6ba58f2a5d5076389090600c243a0ba7072bcf347490a09e4241e2427ccdb260b4e22cea7be4f1fcd3c2bf05908b1e0d0bc9605e3199d4ecf37af1d5681fa + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10/434bd56d9930dd344bcba3ef7683f3dd893396b6bc7e8caa551a4cacbe75a9466dc6cf3d75bc324a5979278a73ef968d7854f8f660dbf1a52c38a73f1fb59b20 + languageName: node + linkType: hard + +"replace-in-file@npm:^7.1.0": + version: 7.2.0 + resolution: "replace-in-file@npm:7.2.0" + dependencies: + chalk: "npm:^4.1.2" + glob: "npm:^8.1.0" + yargs: "npm:^17.7.2" + bin: + replace-in-file: bin/cli.js + checksum: 10/9d08fc6c65dc3a06cb386ce00d03ca1acdfade394ca79e349777d2cc4dc346827b589ad6749e42aba602725e462b84d2386a77e22120cd3b8b8d764684f1e8d7 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10/a72468e2589270d91f06c7d36ec97a88db53ae5d6fe3787fadc943f0b0276b10347f89b363b2a82285f650bdcc135ad4a257c61bdd4d00d6df1fa24875b0ddaf + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10/839a3a890102a658f4cb3e7b2aa13a1f80a3a976b512020c3d1efc418491c48a886b6e481ea56afc6c4cb5eef678f23b2a4e70575e7534eccadf5e30ed2e56eb + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10/878880ee78ccdce372784f62f52a272048e2d0827c29ae31e7f99da18b62a2b9463ea03a75f277352f4697c100183debb0532371ad515a2d49d4bfe596dd4c20 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10/91eb76ce83621eea7bbdd9b55121a5c1c4a39e54a9ce04a9ad4517f102f8b5131c2cf07622c738a6683991bf54f2ce178f5a42803ecbd527ddc5105f362cc9e3 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10/be18a5e4d76dd711778664829841cde690971d02b6cbae277735a09c1c28f407b99ef6ef3cd585a1e6546d4097b28df40ed32c4a287b9699dcf6d7f208495e23 + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10/0763150adf303040c304009231314d1e84c6e5ebfa2d82b7d94e96a6e82bacd1dcc0b58ae257315f3c8adb89a91d8d0f12928241cba2df1680fbe6f60bf99b0e + languageName: node + linkType: hard + +"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:~1.22.1, resolve@npm:~1.22.2": + version: 1.22.13 + resolution: "resolve@npm:1.22.13" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.17.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/4fc4242f448c5a679921bbac6e74268ca76893d7379cb9cfaa49f40ce6b1cea884c2df901d0617c92d927375fe66a05ccbbf17bbb0262cdcd6cb196e33fa1baa + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.5, resolve@npm:^2.0.0-next.6": + version: 2.0.0-next.7 + resolution: "resolve@npm:2.0.0-next.7" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/0a6fbd452518c128355a72e3773e65d047128bbc5045d954eca7f911683abfb1b0177494ff8734ca74f2a7a4e3a6bfad9cd6d19a2bde0fe9851025a2734d4a0f + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": + version: 1.22.13 + resolution: "resolve@patch:resolve@npm%3A1.22.13#optional!builtin::version=1.22.13&hash=c3c19d" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.17.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/f0b8e2c897327b5edc4b277c90d19c7bd06975817183ef51f5c79367b8b8e6d637f6ca20ba6eb3ef964944157cc2eb6970fef1c2202edbe65e6e7be4f268fc7f + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin, resolve@patch:resolve@npm%3A^2.0.0-next.6#optional!builtin": + version: 2.0.0-next.7 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=c3c19d" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/2c6dd4194c8aa900db299020fcad253239c670ea82a65c8387f1d2885e8dcf6742b64c439e3c811e046a5252eba94f2092b7867e34b7f895e733be48d575192b + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10/f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10/1f914879f97e7ee931ad05fe3afa629bd55270fc6cf1c1e589b6a99fab96d15daad0fa1a52a00c729ec0078045fe3e399bd4fd0c93bcc906957bdc17f89cb8e6 + languageName: node + linkType: hard + +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10/af47851b547e8a8dc89af144fceee17b80d5beaf5e6f57ed086432d79943434ff67ca526e92275be6f54b6189f6920a24eace75c2657eed32d02c400312b21ec + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10/063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1, ripemd160@npm:^2.0.3": + version: 2.0.3 + resolution: "ripemd160@npm:2.0.3" + dependencies: + hash-base: "npm:^3.1.2" + inherits: "npm:^2.0.4" + checksum: 10/d15d42ea0460426675e5320f86d3468ab408af95b1761cf35f8d32c0c97b4d3bb72b7226e990e643b96e1637a8ad26b343a6c7666e1a297bcab4f305a1d9d3e3 + languageName: node + linkType: hard + +"rollup-plugin-dts@npm:^6.1.0": + version: 6.5.1 + resolution: "rollup-plugin-dts@npm:6.5.1" + dependencies: + "@babel/code-frame": "npm:^8.0.0" + "@jridgewell/remapping": "npm:^2.3.5" + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + convert-source-map: "npm:^2.0.0" + magic-string: "npm:^0.30.21" + peerDependencies: + "@typescript/typescript6": ^6 + rollup: ^3 || ^4 + typescript: ^4.5 || ^5 || ^6 || ^7 + dependenciesMeta: + "@babel/code-frame": + optional: true + peerDependenciesMeta: + "@typescript/typescript6": + optional: true + checksum: 10/70861ff10daaf91872725e1d922749dc66ae078d9498beff2e6046b3cfff3afc81206fe63c7a19f5105cb025737013aded896d52a663ef758103d9c9c748c559 + languageName: node + linkType: hard + +"rollup-plugin-esbuild@npm:^6.1.1": + version: 6.2.1 + resolution: "rollup-plugin-esbuild@npm:6.2.1" + dependencies: + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + get-tsconfig: "npm:^4.10.0" + unplugin-utils: "npm:^0.2.4" + peerDependencies: + esbuild: ">=0.18.0" + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + checksum: 10/e5731b86c4e01c6ccd3998a2f90794bd738fe83a3a809b9e82456e4b1d173c296ef302c2a6669b966b12c757c1787f0585ae88cd73b98f3c0ad6ad7f779940aa + languageName: node + linkType: hard + +"rollup-plugin-postcss@npm:^4.0.0": + version: 4.0.2 + resolution: "rollup-plugin-postcss@npm:4.0.2" + dependencies: + chalk: "npm:^4.1.0" + concat-with-sourcemaps: "npm:^1.1.0" + cssnano: "npm:^5.0.1" + import-cwd: "npm:^3.0.0" + p-queue: "npm:^6.6.2" + pify: "npm:^5.0.0" + postcss-load-config: "npm:^3.0.0" + postcss-modules: "npm:^4.0.0" + promise.series: "npm:^0.2.0" + resolve: "npm:^1.19.0" + rollup-pluginutils: "npm:^2.8.2" + safe-identifier: "npm:^0.4.2" + style-inject: "npm:^0.3.0" + peerDependencies: + postcss: 8.x + checksum: 10/ee9485265fe69fde54340d4a324c8de15185c730861176cfd947b34532dc63445da6788dc17f3c641708fa4a87fe832c534bfad678b413bb3b4e2b8bdd292850 + languageName: node + linkType: hard + +"rollup-pluginutils@npm:^2.8.2": + version: 2.8.2 + resolution: "rollup-pluginutils@npm:2.8.2" + dependencies: + estree-walker: "npm:^0.6.1" + checksum: 10/f3dc20a8731523aff43e07fa50ed84857e9dd3ab81e2cfb0351d517c46820e585bfbd1530a5dddec3ac14d61d41eb9bf50b38ded987e558292790331cc5b0628 + languageName: node + linkType: hard + +"rollup@npm:^4.59.0": + version: 4.65.0 + resolution: "rollup@npm:4.65.0" + dependencies: + "@napi-rs/lzma-linux-x64-gnu": "npm:1.5.1" + "@rollup/rollup-android-arm-eabi": "npm:4.65.0" + "@rollup/rollup-android-arm64": "npm:4.65.0" + "@rollup/rollup-darwin-arm64": "npm:4.65.0" + "@rollup/rollup-darwin-x64": "npm:4.65.0" + "@rollup/rollup-freebsd-arm64": "npm:4.65.0" + "@rollup/rollup-freebsd-x64": "npm:4.65.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.65.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.65.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.65.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.65.0" + "@rollup/rollup-linux-loong64-gnu": "npm:4.65.0" + "@rollup/rollup-linux-loong64-musl": "npm:4.65.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.65.0" + "@rollup/rollup-linux-ppc64-musl": "npm:4.65.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.65.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.65.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.65.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.65.0" + "@rollup/rollup-linux-x64-musl": "npm:4.65.0" + "@rollup/rollup-openbsd-x64": "npm:4.65.0" + "@rollup/rollup-openharmony-arm64": "npm:4.65.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.65.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.65.0" + "@rollup/rollup-win32-x64-gnu": "npm:4.65.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.65.0" + "@types/estree": "npm:1.0.9" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@napi-rs/lzma-linux-x64-gnu": + optional: true + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10/e0cc4c01576ef41f9a74fa7a4e8ab26b6f0442d8432ce63832c3dfbbda893ea95cd1b79624a289ee83b84e0c8205b7d5ce77df0f6769186e62e23c9986b63c4e + languageName: node + linkType: hard + +"run-applescript@npm:^7.0.0": + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 10/8659fb5f2717b2b37a68cbfe5f678254cf24b5a82a6df3372b180c80c7c137dcd757a4166c3887e459f59a090ca414e8ea7ca97cf3ee5123db54b3b4006d7b7a + languageName: node + linkType: hard + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 10/c79551224dafa26ecc281cb1efad3510c82c79116aaf681f8a931ce70fdf4ca880d58f97d3b930a38992c7aad7955a08e065b32ec194e1dd49d7790c874ece50 + languageName: node + linkType: hard + +"run-async@npm:^3.0.0": + version: 3.0.0 + resolution: "run-async@npm:3.0.0" + checksum: 10/97fb8747f7765b77ebcd311d3a33548099336f04c6434e0763039b98c1de0f1b4421000695aff8751f309c0b995d8dfd620c1f1e4c35572da38c101488165305 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10/cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"rxjs@npm:7.8.2, rxjs@npm:^7.5.5": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10/03dff09191356b2b87d94fbc1e97c4e9eb3c09d4452399dddd451b09c2f1ba8d56925a40af114282d7bc0c6fe7514a2236ca09f903cf70e4bbf156650dddb49d + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.4 + resolution: "safe-array-concat@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + get-intrinsic: "npm:^1.3.0" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10/89e6a4d2759225515e5ea6b9f21a62dfad74c3aef45c769c9bf000b1c681f15568183e62935711ec9d10c35712c4f21f0d6acb094bd35138608b4a57fa64667d + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a + languageName: node + linkType: hard + +"safe-identifier@npm:^0.4.2": + version: 0.4.2 + resolution: "safe-identifier@npm:0.4.2" + checksum: 10/c2697c0d2fe128aa5f5faa7bd3ccf02d06ba937cdff9b2f65afb247e222a1505fc414a3b6a04d2a6a71bb5a84b8bc345edc408fabc8afc498f04e367ddc02366 + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10/2bd4e53b6694f7134b9cf93631480e7fafc8637165f0ee91d5a4af5e7f33d37de9562d1af5021178dd4217d0230cde8d6530fa28cfa1ebff9a431bf8fff124b4 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10/ebdb61f305bf4756a5b023ad86067df5a11b26898573afe9e52a548a63c3bd594825d9b0e2dde2eb3c94e57e0e04ac9929d4107c394f7b8e56a4613bed46c69a + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^1.1": + version: 1.1.1 + resolution: "safe-stable-stringify@npm:1.1.1" + checksum: 10/bddfc2334dfa68a7f976c2b57c0ce83c087b032abdd150a24f3ca9fe19b43accfa9634d04587a7fb3d7636bc6c3d728dda1311ad43eb85bb95793a707fb127ac + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.5.0": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10/2697fa186c17c38c3ca5309637b4ac6de2f1c3d282da27cd5e1e3c88eca0fb1f9aea568a6aabdf284111592c8782b94ee07176f17126031be72ab1313ed46c5c + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 + languageName: node + linkType: hard + +"sax@npm:^1.5.0": + version: 1.6.1 + resolution: "sax@npm:1.6.1" + checksum: 10/bf7e7f8293903548bd663d71e9300b20ee04df178399b8f54029b6559225de422235c8fb0a63ba088fcb90c1dbaf9b475f57c7f32c901bfb78d0196dceb3cc7f + languageName: node + linkType: hard + +"schema-utils@npm:2.7.0": + version: 2.7.0 + resolution: "schema-utils@npm:2.7.0" + dependencies: + "@types/json-schema": "npm:^7.0.4" + ajv: "npm:^6.12.2" + ajv-keywords: "npm:^3.4.1" + checksum: 10/e5afb6ecf8e9c63ce5f964cd8f2a2e7bdc8c3a63f6bc7dd5cfdc475aa90c1b9ade1555a749519c1673a0bfa203a12e04499e7d6d956163f8e7a77aaa3f12935c + languageName: node + linkType: hard + +"schema-utils@npm:4.3.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10/86c5a7c72a275c56f140bc3cdd832d56efb11428c88ad588127db12cb9b2c83ccaa9540e115d7baa9c6175b5e360094457e29c44e6fb76787c9498c2eb6df5d6 + languageName: node + linkType: hard + +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10/2c7bbb1da967fdfd320e6cea538949006ec6e8c13ea560a4f94ff2c56809a8486fa5ec419e023452501a6befe1ca381e409c2798c24f4993c7c4094d97fdb258 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.5.0, schema-utils@npm:^4.6.0": + version: 4.8.1 + resolution: "schema-utils@npm:4.8.1" + dependencies: + "@types/json-schema": "npm:^7.0.15" + ajv: "npm:^8.20.0" + ajv-formats: "npm:^3.0.1" + ajv-keywords: "npm:^5.1.0" + peerDependencies: + webpack: ^5.112.0 + peerDependenciesMeta: + webpack: + optional: true + bin: + schema-utils: bin/schema-utils.js + checksum: 10/d8a08d619478326bf60cff577f4b9b36f494937f806ad5d27cce07a93413df6d8651f36969c8ccf3c25022916c12f6364c50697fd4c7c34a6cff61d246f532b9 + languageName: node + linkType: hard + +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10/08cdd629a394d20e9005e7956f0624307c702cf950cc0458953e9b87ea961d3b1b72ac02266bdb93ac1eec4fcf42b41db9cabe93aa2b7683d71513d133c44fb5 + languageName: node + linkType: hard + +"selfsigned@npm:^2.4.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" + dependencies: + "@types/node-forge": "npm:^1.3.0" + node-forge: "npm:^1" + checksum: 10/52536623f1cfdeb2f8b9198377f2ce7931c677ea69421238d1dc1ea2983bbe258e56c19e7d1af87035cad7270f19b7e996eaab1212e724d887722502f68e17f2 + languageName: node + linkType: hard + +"selfsigned@npm:^5.5.0": + version: 5.5.0 + resolution: "selfsigned@npm:5.5.0" + dependencies: + "@peculiar/x509": "npm:^1.14.2" + pkijs: "npm:^3.3.3" + checksum: 10/fe9be2647507c3ee21dcaf5cab20e1ae4b8b84eac83d2fe4d82f9a3b6c70636f9aaeeba0089e3343dcb13fbb31ef70c2e72c41f2e2dcf38368040b49830c670e + languageName: node + linkType: hard + +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10/1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.7.3": + version: 7.8.5 + resolution: "semver@npm:7.8.5" + bin: + semver: bin/semver.js + checksum: 10/9b01d2ff11e6e4a4539b7ca3c5f280c8704cb397a28504469f2ed4f00ad2194748d756647362a9712fff30984d15772ab7f083108c2fb508e2096ae9e708f22c + languageName: node + linkType: hard + +"semver@npm:~7.7.4": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 + languageName: node + linkType: hard + +"send@npm:~0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.1" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:~2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:~2.0.2" + checksum: 10/e932a592f62c58560b608a402d52333a8ae98a5ada076feb5db1d03adaa77c3ca32a7befa1c4fd6dedc186e88f342725b0cb4b3d86835eaf834688b259bef18d + languageName: node + linkType: hard + +"serialize-error@npm:^8.0.1": + version: 8.1.0 + resolution: "serialize-error@npm:8.1.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10/2eef236d50edd2d7926e602c14fb500dc3a125ee52e9f08f67033181b8e0be5d1122498bdf7c23c80683cddcad083a27974e9e7111ce23165f4d3bcdd6d65102 + languageName: node + linkType: hard + +"serve-index@npm:^1.9.1": + version: 1.9.2 + resolution: "serve-index@npm:1.9.2" + dependencies: + accepts: "npm:~1.3.8" + batch: "npm:0.6.1" + debug: "npm:2.6.9" + escape-html: "npm:~1.0.3" + http-errors: "npm:~1.8.0" + mime-types: "npm:~2.1.35" + parseurl: "npm:~1.3.3" + checksum: 10/fdfada071e795da265845acca05be9b498443cb5b84f8c9fd4632f01ea107ecca110725a7963a2b4b3146ec01f41c5f95df4405ff61eda13e6f229474a9ed5a6 + languageName: node + linkType: hard + +"serve-static@npm:~1.16.2": + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:~0.19.1" + checksum: 10/149d6718dd9e53166784d0a65535e21a7c01249d9c51f57224b786a7306354c6807e7811a9f6c143b45c863b1524721fca2f52b5c81a8b5194e3dde034a03b9c + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b87f8187bca595ddc3c0721ece4635015fd9d7cb294e6dd2e394ce5186a71bbfa4dc8a35010958c65e43ad83cde09642660e61a952883c24fd6b45ead15f045c + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10/76e3f5d7f4b581b6100ff819761f04a984fa3f3990e72a6554b57188ded53efce2d3d6c0932c10f810b7c59414f85e2ab3c11521877d1dea1ce0b56dc906f485 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10/fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.12, sha.js@npm:^2.4.8": + version: 2.4.12 + resolution: "sha.js@npm:2.4.12" + dependencies: + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + to-buffer: "npm:^1.2.0" + bin: + sha.js: bin.js + checksum: 10/39c0993592c2ab34eb2daae2199a2a1d502713765aecb611fd97c0c4ab7cd53e902d628e1962aaf384bafd28f55951fef46dcc78799069ce41d74b03aa13b5a7 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10/6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10/1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shell-quote@npm:1.12.0, shell-quote@npm:^1.10.0, shell-quote@npm:^1.7.3, shell-quote@npm:^1.9.0": + version: 1.12.0 + resolution: "shell-quote@npm:1.12.0" + checksum: 10/18b3e382272804e79fd3187c18877cfd4e736b5afb576bf1ab66a561b0a0e26eada4b7c8eb45473d1f17268ffcf12d0aaa90b9235132123eb673df5d0a5df943 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + checksum: 10/3499671cd52adaee739eac1e14d07530b8e3530192741aeb05e7fe4ad1b51d1368ceea2cd3c21b0f62b05410a5c70a7c4d997ba4b143303ef73d0c65dfd1c252 + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10/5771861f77feefe44f6195ed077a9e4f389acc188f895f570d56445e251b861754b547ea9ef73ecee4e01fdada6568bfe9020d2ec2dfc5571e9fa1bbc4a10615 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10/a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0, side-channel@npm:^1.1.1": + version: 1.1.1 + resolution: "side-channel@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + side-channel-list: "npm:^1.0.1" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10/5fa6393ff6ad25d8b4a38e9ba095481e498c8ebe5ab78481c1455146255a3d18ca37a6f936595cc671a6149134cdc295bbd2fa017620bdc73cbc7380634fa2fc + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10/4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10/93f1b32319782f78f2f2234e9ce34891b7ab6b990d19d8afefaa44423f5235ce2676aae42d6743fecac6c8dfff4b808d4c24fe5265be813d04769917a9a44f36 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10/aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"skin-tone@npm:^2.0.0": + version: 2.0.0 + resolution: "skin-tone@npm:2.0.0" + dependencies: + unicode-emoji-modifier-base: "npm:^1.0.0" + checksum: 10/19de157586b8019cacc55eb25d9d640f00fc02415761f3e41a4527142970fd4e7f6af0333bc90e879858766c20a976107bb386ffd4c812289c01d51f2c8d182c + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10/94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10/927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 + languageName: node + linkType: hard + +"smol-toml@npm:^1.5.2": + version: 1.9.1 + resolution: "smol-toml@npm:1.9.1" + checksum: 10/0bdcd39bbaa2bdca88f9418cbf0b0b9dd220d9e39b6d298916a4ce1e49a8c8dc84d30f0e49910355203bff3a64da7b06771037dc0d2f8007df406f14dc768c10 + languageName: node + linkType: hard + +"sockjs@npm:^0.3.24": + version: 0.3.24 + resolution: "sockjs@npm:0.3.24" + dependencies: + faye-websocket: "npm:^0.11.3" + uuid: "npm:^8.3.2" + websocket-driver: "npm:^0.7.4" + checksum: 10/36312ec9772a0e536b69b72e9d1c76bd3d6ecf885c5d8fd6e59811485c916b8ce75f46ec57532f436975815ee14aa9a0e22ae3d9e5c0b18ea37b56d0aaaf439c + languageName: node + linkType: hard + +"socks-proxy-agent@npm:10.1.0": + version: 10.1.0 + resolution: "socks-proxy-agent@npm:10.1.0" + dependencies: + agent-base: "npm:9.0.0" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10/b7ca31a62e1164bdf8ade52a4c0d9b2701a7095fa52e7be047d61abf9ddf3e0820c3080373a59268b67d43901f16c51c780bb7ac925f17eb77171ed00071724a + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10/ee99e1dacab0985b52cbe5a75640be6e604135e9489ebdc3048635d186012fbaecc20fbbe04b177dee434c319ba20f09b3e7dfefb7d932466c0d707744eac05c + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.10 + resolution: "socks@npm:2.8.10" + dependencies: + ip-address: "npm:^10.1.1" + smart-buffer: "npm:^4.2.0" + checksum: 10/05ea32c55a4428babaab97f5419e130d2aec4836bc36a1505cd2d5c36ecf447609f5bbe95243b5e0cba46b4b2fea9d8d2b5031cc13005b3146da53f86b5e1128 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.2": + version: 1.2.2 + resolution: "source-map-js@npm:1.2.2" + checksum: 10/4807c894bb6280c8b84886159b96080e3996f42c6e8015e647881edfd4f955f6024ceebb8bb40d33ce8b106e24b2e29c133575e1c60c01c8aae57a05fdf17761 + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10/8317e12d84019b31e34b86d483dd41d6f832f389f7417faf8fc5c75a66a12d9686e47f589a0554a868b8482f037e23df9d040d29387eb16fa14cb85f091ba207 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff + languageName: node + linkType: hard + +"source-map@npm:^0.7.3": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10/c8d2da7c57c14f3fd7568f764b39ad49bbf9dd7632b86df3542b31fed117d4af2fb74a4f886fc06baf7a510fee68e37998efc3080aacdac951c36211dc29a7a3 + languageName: node + linkType: hard + +"spawndamnit@npm:^3.0.1": + version: 3.0.1 + resolution: "spawndamnit@npm:3.0.1" + dependencies: + cross-spawn: "npm:^7.0.5" + signal-exit: "npm:^4.0.1" + checksum: 10/47d88a7f1e5691e13e435eddc3d34123c2f7746e2853e91bfac5ea7c6e3bb4b1d1995223b25f7a8745871510d92f63ecd3c9fa02aa2896ac0c79fb618eb08bbe + languageName: node + linkType: hard + +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10/b93b606b209ca785456bd850b8925f21a76522ee5b46701235ecff3eba17686560c27575f91863842dc843a39772f6d2f5a8755df9eaff0924d20598df18828d + languageName: node + linkType: hard + +"spdy@npm:^4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10/d29b89e48e7d762e505a2f83b1bc2c92268bd518f1b411864ab42a9e032e387d10467bbce0d8dbf8647bf4914a063aa1d303dff85e248f7a57f81a7b18ac34ef + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10/c34828732ab8509c2741e5fd1af6b767c3daf2c642f267788f933a65b1614943c282e74c4284f4fa749c264b18ee016a0d37a3e5b73aee446da46277d3a85daa + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/f92c1b3cc9bfd0a925417412d07d999935917bc87049f43ebec41074661d64cf720315661844106a77da9f8204b6d55ae29f9514e673083cae39464343af2a8b + languageName: node + linkType: hard + +"stable@npm:^0.1.8": + version: 0.1.8 + resolution: "stable@npm:0.1.8" + checksum: 10/2ff482bb100285d16dd75cd8f7c60ab652570e8952c0bfa91828a2b5f646a0ff533f14596ea4eabd48bb7f4aeea408dce8f8515812b975d958a4cc4fa6b9dfeb + languageName: node + linkType: hard + +"stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: 10/29ca71c1fd17974c1c178df0236b1407bc65f6ea389cc43dec000def6e42ff548d4453de9a85b76469e2ae2b2abdd802c6b6f3db947c05794efbd740d1cf4121 + languageName: node + linkType: hard + +"statuses@npm:>= 1.5.0 < 2": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: 10/c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c + languageName: node + linkType: hard + +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10/6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10/ff36c4db171ee76c936ccfe9541946b77017f12703d4c446652017356816862d3aa029a64e7d4c4ceb484e00ed4a81789333896390d808458638f3a216aa1f41 + languageName: node + linkType: hard + +"stream-browserify@npm:^3.0.0": + version: 3.0.0 + resolution: "stream-browserify@npm:3.0.0" + dependencies: + inherits: "npm:~2.0.4" + readable-stream: "npm:^3.5.0" + checksum: 10/05a3cd0a0ce2d568dbdeb69914557c26a1b0a9d871839666b692eae42b96189756a3ed685affc90dab64ff588a8524c8aec6d85072c07905a1f0d941ea68f956 + languageName: node + linkType: hard + +"stream-http@npm:^3.2.0": + version: 3.2.0 + resolution: "stream-http@npm:3.2.0" + dependencies: + builtin-status-codes: "npm:^3.0.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + xtend: "npm:^4.0.2" + checksum: 10/4f85738cbc6de70ecf0a04bc38b6092b4d91dd5317d3d93c88a84c48e63b82a8724ab5fd591df9f587b5139fe439d1748e4e3db3cb09c2b1e23649cb9d89859e + languageName: node + linkType: hard + +"string-argv@npm:~0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10/f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af + languageName: node + linkType: hard + +"string-hash@npm:^1.1.1": + version: 1.1.3 + resolution: "string-hash@npm:1.1.3" + checksum: 10/104b8667a5e0dc71bfcd29fee09cb88c6102e27bfb07c55f95535d90587d016731d52299380052e514266f4028a7a5172e0d9ac58e2f8f5001be61dc77c0754d + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10/e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10/7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string-width@npm:^7.0.0, string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/42f9e82f61314904a81393f6ef75b832c39f39761797250de68c041d8ba4df2ef80db49ab6cd3a292923a6f0f409b8c9980d120f7d32c820b4a8a84a2598a295 + languageName: node + linkType: hard + +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + checksum: 10/939a5447e4a99a86f29cc97fa24f358e5071f79e34746de4c7eb2cd736ed626ad24870a1e356f33915b3b352bb87f7e4d1cebc15d1e1aaae0923777e21b1b28b + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.12": + version: 4.1.0 + resolution: "string.prototype.matchall@npm:4.1.0" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.2" + get-intrinsic: "npm:^1.3.0" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.4" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.1.1" + checksum: 10/d8c54b52afad226eae80fa5930a9ab72f0277ea8e1a8b17cae674880d424a0e5f3b685f9381cad9168baf2e2ea8a0e77f6c6c02ea3fea6bb48d63190d840a4f3 + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10/4b1bd91b75fa8fdf0541625184ebe80e445a465ce4253c19c3bccd633898005dadae0f74b85ae72662a53aafb8035bf48f8f5c0755aec09bc106a7f13959d05e + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.11 + resolution: "string.prototype.trim@npm:1.2.11" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.2" + es-object-atoms: "npm:^1.1.2" + has-property-descriptors: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/77c2301fe9f2f2e2085c2a9ab048f9f86b1b95609944e1f16d067186b7ac9121db2dd5bf8d165835891876d750ed325314e3181b8b6829d533f5214d472b3fc4 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.10 + resolution: "string.prototype.trimend@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.2" + checksum: 10/f8a85346be853bbe34490c03f4c3f7adb0b4d5dedb206e4a48a006839fece0843fa97fe9c3222be5fd91ba33cdc7d495970af7a4707d15a62591555bfe5a5e20 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/160167dfbd68e6f7cb9f51a16074eebfce1571656fc31d40c3738ca9e30e35496f2c046fe57b6ad49f65f238a152be8c86fd9a2dd58682b5eba39dad995b3674 + languageName: node + linkType: hard + +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10/54d23f4a6acae0e93f999a585e673be9e561b65cd4cca37714af1e893ab8cd8dfa52a9e4f58f48f87b4a44918d3a9254326cb80ed194bf2e4c226e2b21767e56 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10/7c41c17ed4dea105231f6df208002ebddd732e8e9e2d619d133cecd8e0087ddfd9587d2feb3c8caf3213cbd841ada6d057f5142cae68a4e62d3540778d9819b4 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:6.0, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10/ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 + languageName: node + linkType: hard + +"strip-ansi@npm:5.2.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: "npm:^4.1.0" + checksum: 10/bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.2.0 + resolution: "strip-ansi@npm:7.2.0" + dependencies: + ansi-regex: "npm:^6.2.2" + checksum: 10/96da3bc6d73cfba1218625a3d66cf7d37a69bf0920d8735b28f9eeaafcdb6c1fe8440e1ae9eb1ba0ca355dbe8702da872e105e2e939fa93e7851b3cb5dd7d316 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10/8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-json-comments@npm:5.0.3": + version: 5.0.3 + resolution: "strip-json-comments@npm:5.0.3" + checksum: 10/3ccbf26f278220f785e4b71f8a719a6a063d72558cc63cb450924254af258a4f4c008b8c9b055373a680dc7bd525be9e543ad742c177f8a7667e0b726258e0e4 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10/1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + +"strtok3@npm:^10.3.4": + version: 10.6.2 + resolution: "strtok3@npm:10.6.2" + dependencies: + "@tokenizer/token": "npm:^0.3.0" + checksum: 10/f2f2a75898b7ed0e8a7bb9c9824e6e64938221594b9d0893b582a532729fafb8bc30ad1c3c925af675269c83cd8d53941c49c064c9562de8c2b82b92eadb33f3 + languageName: node + linkType: hard + +"style-inject@npm:^0.3.0": + version: 0.3.0 + resolution: "style-inject@npm:0.3.0" + checksum: 10/fa5f5f6730c3eb4ccc5735347935703c7c02759d4ddb5983d037ed0efda3c50a80640c2fed4f4d4c5ea600c97cdfdb45f79f734630324fa21a3a86723c0472da + languageName: node + linkType: hard + +"style-loader@npm:^3.3.1": + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" + peerDependencies: + webpack: ^5.0.0 + checksum: 10/2dd2a77d4fc689e1f73836ed7653830cb4e628af0b2979dcf6f31524c72bf44fca4bac8aebe62df95a5f9be19bea18f952a2cfcaaeff32c524c4402226d9c58f + languageName: node + linkType: hard + +"stylehacks@npm:^5.1.1": + version: 5.1.1 + resolution: "stylehacks@npm:5.1.1" + dependencies: + browserslist: "npm:^4.21.4" + postcss-selector-parser: "npm:^6.0.4" + peerDependencies: + postcss: ^8.2.15 + checksum: 10/bddce1f5a8ba5a129995fc5585fa59fda6c8c580a8b39631955ee03810957eea62d13c7711a61f3a4f3bc2f9a4a9e019846f73b669c4aa0b5c52cd0198824b5c + languageName: node + linkType: hard + +"sucrase@npm:^3.20.2": + version: 3.35.1 + resolution: "sucrase@npm:3.35.1" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.2" + commander: "npm:^4.0.0" + lines-and-columns: "npm:^1.1.6" + mz: "npm:^2.7.0" + pirates: "npm:^4.0.1" + tinyglobby: "npm:^0.2.11" + ts-interface-checker: "npm:^0.1.9" + bin: + sucrase: bin/sucrase + sucrase-node: bin/sucrase-node + checksum: 10/539f5c6ebc1ff8d449a89eb52b8c8944a730b9840ddadbd299a7d89ebcf16c3f4bc9aa59e1f2e112a502e5cf1508f7e02065f0e97c0435eb9a7058e997dfff5a + languageName: node + linkType: hard + +"supports-color@npm:10.2.2": + version: 10.2.2 + resolution: "supports-color@npm:10.2.2" + checksum: 10/bd132705fc07213a4024131fb061f0a46a48b49ecaf434bb029c0a5aa0339b969236d496d63969e3c248a90fdcac16d4f9c5bf187e7be0bfb5e804ed13bef6b0 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10/c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0, supports-color@npm:~8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10/157b534df88e39c5518c5e78c35580c1eca848d7dbaf31bbe06cdfc048e22c7ff1a9d046ae17b25691128f631a51d9ec373c1b740c12ae4f0de6e292037e4282 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^3.1.0": + version: 3.2.0 + resolution: "supports-hyperlinks@npm:3.2.0" + dependencies: + has-flag: "npm:^4.0.0" + supports-color: "npm:^7.0.0" + checksum: 10/f7924de6049fc30bc808f98d3561318c1a4e3d55d786f9fede5e23dc5a7b0f625485bd1143135b496d521ccd0110463f2c077eb71a4ce0cf783b8b31f7909242 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10/a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e + languageName: node + linkType: hard + +"svgo@npm:^2.7.0": + version: 2.8.4 + resolution: "svgo@npm:2.8.4" + dependencies: + commander: "npm:^7.2.0" + css-select: "npm:^4.1.3" + css-tree: "npm:^1.1.3" + csso: "npm:^4.2.0" + picocolors: "npm:^1.0.0" + sax: "npm:^1.5.0" + stable: "npm:^0.1.8" + bin: + svgo: bin/svgo + checksum: 10/102d2129a427c5b4a773cad5889de2f74feed20fab97d1bacac125952ccfc4fb015874e185e7690681e1970b38359be712ca212a3dac0ac54930acc91b6cd115 + languageName: node + linkType: hard + +"swc-loader@npm:^0.2.3": + version: 0.2.7 + resolution: "swc-loader@npm:0.2.7" + dependencies: + "@swc/counter": "npm:^0.1.3" + peerDependencies: + "@swc/core": ^1.2.147 + webpack: ">=2" + checksum: 10/15cbc3769209f7e2f927e49c19a5ef30fe03663bd34688289c003d966c7dfe782eec39de77c454aa7465ce84138d8bc31257b736b32ff3be10191f1de88cbbf5 + languageName: node + linkType: hard + +"tapable@npm:2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10/496a841039960533bb6e44816a01fffc2a1eb428bb2051ecab9e87adf07f19e1f937566cbbbb09dceff31163c0ffd81baafcad84db900b601f0155dd0b37e9f2 + languageName: node + linkType: hard + +"tapable@npm:^1.0.0": + version: 1.1.3 + resolution: "tapable@npm:1.1.3" + checksum: 10/1cec71f00f9a6cb1d88961b5d4f2dead4e185508b18b1bf1e688c8135039a391dd3e12b0887232b682ef28f1ef6f0c5e9a48794f6f5ef68f35d05de7e7a0a578 + languageName: node + linkType: hard + +"tapable@npm:^2.0.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0, tapable@npm:^2.3.3": + version: 2.3.3 + resolution: "tapable@npm:2.3.3" + checksum: 10/21fb64a7ae1a0e11d855a6c33a22ae5ecf7e2f23170c942da673b44bf4c3aae8aa52451ef2792d0ce36c7feca13dceafa4f135105d66fc06912632488c0913fd + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.5 + resolution: "tar-fs@npm:2.1.5" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10/9dfbde66d223e3164a8018521c7c1eb205696917cbfb116d15cde286ccc7f2445964bb3d4772f369eb003aad67c2573e4f1390c74266fee32fa16cb846b6d144 + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10/1a52a51d240c118cbcd30f7368ea5e5baef1eac3e6b793fb1a41e6cd7319296c79c0264ccc5859f5294aa80f8f00b9239d519e627b9aade80038de6f966fec6a + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10/bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 + languageName: node + linkType: hard + +"tar@npm:^7.5.21, tar@npm:^7.5.7": + version: 7.5.22 + resolution: "tar@npm:7.5.22" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10/129606384b3c895f422aaca48bf316357be6dc7aa35c1066c3f06c28acfff0be5b356e1b0a0be7c53a7a8945534ac06cec6d8e296d170d8a09c8bff67b29300e + languageName: node + linkType: hard + +"tarn@npm:^3.1.0": + version: 3.1.2 + resolution: "tarn@npm:3.1.2" + checksum: 10/7b8bb2f439abd867ac40ab72c2a1d8f6bf7825523c15189b71bcc2fe38b38a404319f0358cf32fa0d3c3b731eeff5429dfadae69eeb14eaf2903a4f04c0d7a18 + languageName: node + linkType: hard + +"term-size@npm:^2.1.0": + version: 2.2.1 + resolution: "term-size@npm:2.2.1" + checksum: 10/f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537 + languageName: node + linkType: hard + +"terminal-columns@npm:^2.0.0": + version: 2.0.0 + resolution: "terminal-columns@npm:2.0.0" + checksum: 10/f958993886e09d7c0780f47833316532a0c7dd7db2fb43da9d34a88c821633408a6e7084af59f99c20b045776814748f14a8e33573886186be7a30174092964f + languageName: node + linkType: hard + +"terser@npm:^5.10.0, terser@npm:^5.51.0": + version: 5.51.2 + resolution: "terser@npm:5.51.2" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.15.0" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10/1cb6f4189eba6406ef3aad5356ce1441bfe5ab419b5e66a1054db254fd92ce881d6c4718097621044c777922282640397104fb22e651974245bbabd5e138f3d9 + languageName: node + linkType: hard + +"text-table@npm:0.2.0, text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 + languageName: node + linkType: hard + +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: "npm:>= 3.1.0 < 4" + checksum: 10/dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: "npm:^1.0.0" + checksum: 10/486e1283a867440a904e36741ff1a177faa827cf94d69506f7e3ae4187b9afdf9ec368b3d8da225c192bfe2eb943f3f0080594156bf39f21b57cd1411e2e7f6d + languageName: node + linkType: hard + +"thingies@npm:^2.5.0": + version: 2.6.1 + resolution: "thingies@npm:2.6.1" + peerDependencies: + tslib: ^2 + checksum: 10/23fd7ec0ae386d9aa3e5fa69bf6d4d4a2e0305723c2aeef848f5513e845bb463b0f697727b53f31029e7cf949f12a413bf4a0ea5705dde3daa0c1feaa712822e + languageName: node + linkType: hard + +"through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10/5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 + languageName: node + linkType: hard + +"thunky@npm:^1.0.2": + version: 1.1.0 + resolution: "thunky@npm:1.1.0" + checksum: 10/825e3bd07ab3c9fd6f753c457a60957c628cacba5dd0656fd93b037c445e2828b43cf0805a9f2b16b0c5f5a10fd561206271acddb568df4f867f0aea0eb2772f + languageName: node + linkType: hard + +"tildify@npm:2.0.0": + version: 2.0.0 + resolution: "tildify@npm:2.0.0" + checksum: 10/0f5fee93624c4afdf75ee224c3b65aece4817ba5317fd70f49eaf084ea720d73556a6ef3f50079425a773ba3b93805b4524d14057841d4e4336516fdbe80635b + languageName: node + linkType: hard + +"timers-browserify@npm:^2.0.4": + version: 2.0.12 + resolution: "timers-browserify@npm:2.0.12" + dependencies: + setimmediate: "npm:^1.0.4" + checksum: 10/ec37ae299066bef6c464dcac29c7adafba1999e7227a9bdc4e105a459bee0f0b27234a46bfd7ab4041da79619e06a58433472867a913d01c26f8a203f87cee70 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10/f85e8a217d675c3f78d5f0ad25ea4557e7e023ed13ddc2b014da10bd0312eea53a34cd52356af07ccdff777f1243012547656282a4ca70936f68bf5065fbaa71 + languageName: node + linkType: hard + +"to-buffer@npm:^1.2.0, to-buffer@npm:^1.2.1, to-buffer@npm:^1.2.2": + version: 1.2.2 + resolution: "to-buffer@npm:1.2.2" + dependencies: + isarray: "npm:^2.0.5" + safe-buffer: "npm:^5.2.1" + typed-array-buffer: "npm:^1.0.3" + checksum: 10/69d806c20524ff1e4c44d49276bc96ff282dcae484780a3974e275dabeb75651ea430b074a2a4023701e63b3e1d87811cd82c0972f35280fe5461710e4872aba + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10/10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10/952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 + languageName: node + linkType: hard + +"token-types@npm:^6.1.1": + version: 6.1.2 + resolution: "token-types@npm:6.1.2" + dependencies: + "@borewit/text-codec": "npm:^0.2.1" + "@tokenizer/token": "npm:^0.3.0" + ieee754: "npm:^1.2.1" + checksum: 10/0c7811a2da5a0ca474c795d883d871a184d1d54f67058d66084110f0b246fff66151885dbcb91d66533e776478bf57f3b4fac69ce03b805a0e1060def87947de + languageName: node + linkType: hard + +"tosource@npm:^2.0.0-alpha.3": + version: 2.0.0-alpha.3 + resolution: "tosource@npm:2.0.0-alpha.3" + checksum: 10/bc03a7571de8ed4306e6721283fa891f2adcab9dd80c46f6f177d4259b34bb192fe3a2cb3e1e2ce16f9db0bc7e534acfcb5478ab094b0ba255f98abfce6dab46 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10/8f1f5aa6cb232f9e1bdc86f485f916b7aa38caee8a778b378ffec0b70d9307873f253f5cbadbe2955ece2ac5c83d0dc14a77513166ccd0a0c7fe197e21396695 + languageName: node + linkType: hard + +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/2c20118d2671996aa6f1ba1310cef1404fb525bde5d989ab542013f62b23a3633c0f0b32cbd516ee6205051ec21912b2470dabca006d19c9eba0740b567e2b60 + languageName: node + linkType: hard + +"tree-kill@npm:1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10/49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 + languageName: node + linkType: hard + +"tryer@npm:^1.0.1": + version: 1.0.1 + resolution: "tryer@npm:1.0.1" + checksum: 10/4d869d187bd715136903b349f39d1cc3e5c19f742689a348190aff92408ee8dd3d7d9adc26dc9265c35d722731184c979ed316109b6c1239249a8707bb92cc49 + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.5.0": + version: 2.5.0 + resolution: "ts-api-utils@npm:2.5.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10/d5f1936f5618c6ab6942a97b78802217540ced00e7501862ae1f578d9a3aa189fc06050e64cb8951d21f7088e5fd35f53d2bf0d0370a883861c7b05e993ebc44 + languageName: node + linkType: hard + +"ts-checker-rspack-plugin@npm:^1.1.5": + version: 1.7.1 + resolution: "ts-checker-rspack-plugin@npm:1.7.1" + dependencies: + "@rspack/lite-tapable": "npm:^1.3.0" + chokidar: "npm:^4.0.3" + memfs: "npm:^4.79.0" + picocolors: "npm:^1.1.1" + peerDependencies: + "@rspack/core": ^1.0.0 || ^2.0.0 + "@typescript/native-preview": ^7.0.0-0 + typescript: ">=3.8.0" + peerDependenciesMeta: + "@rspack/core": + optional: true + "@typescript/native-preview": + optional: true + checksum: 10/06202b919350a93ded325b84f45a93bd9e71c0519a49ff866abc48d8389a447c07975f921470002b4724307ae793c68419a595e80e9b60a48b832fc53142368c + languageName: node + linkType: hard + +"ts-interface-checker@npm:^0.1.9": + version: 0.1.13 + resolution: "ts-interface-checker@npm:0.1.13" + checksum: 10/9f7346b9e25bade7a1050c001ec5a4f7023909c0e1644c5a96ae20703a131627f081479e6622a4ecee2177283d0069e651e507bedadd3904fc4010ab28ffce00 + languageName: node + linkType: hard + +"ts-json-schema-generator@npm:^2.9.0": + version: 2.9.0 + resolution: "ts-json-schema-generator@npm:2.9.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + commander: "npm:^14.0.3" + glob: "npm:^13.0.6" + json5: "npm:^2.2.3" + normalize-path: "npm:^3.0.0" + safe-stable-stringify: "npm:^2.5.0" + tslib: "npm:^2.8.1" + typescript: "npm:^5.9.3" + bin: + ts-json-schema-generator: bin/ts-json-schema-generator.js + checksum: 10/50a18cb6a1171e495af16a4fe8165000d0155ef693cec9345bacb8a5b6cc559dcc730443ebdc025590cd29ffd2019564267a8222c7f6389bdf5558856fbe479b + languageName: node + linkType: hard + +"ts-morph@npm:^24.0.0": + version: 24.0.0 + resolution: "ts-morph@npm:24.0.0" + dependencies: + "@ts-morph/common": "npm:~0.25.0" + code-block-writer: "npm:^13.0.3" + checksum: 10/560f64eac91429f852277af7588d116b83f91ace2e6ba89c71893b364a42c1e9a658fb40ad2c8d1b48af14d744ba1d4ee7a7efeae033d14ad7a6b5f50b83ccca + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10/2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 + languageName: node + linkType: hard + +"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + +"tslib@npm:^1.14.1, tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb + languageName: node + linkType: hard + +"tsyringe@npm:^4.10.0": + version: 4.10.0 + resolution: "tsyringe@npm:4.10.0" + dependencies: + tslib: "npm:^1.9.3" + checksum: 10/b42660dc112cee2db02b3d69f2ef6a6a9d185afd96b18d8f88e47c1e62be94b69a9f5a58fcfdb2a3fbb7c6c175b8162ea00f7db6499bf333ce945e570e31615c + languageName: node + linkType: hard + +"tty-browserify@npm:0.0.1": + version: 0.0.1 + resolution: "tty-browserify@npm:0.0.1" + checksum: 10/93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/7f0d9ed5c22404072b2ae8edc45c071772affd2ed14a74f03b4e71b4dd1a14c3714d85aed64abcaaee5fec2efc79002ba81155c708f4df65821b444abb0cfade + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10/14687776479d048e3c1dbfe58a2409e00367810d6960c0f619b33793271ff2a27f81b52461f14a162f1f89a9b1d8da1b237fc7c99b0e1fdcec28ec63a86b1fec + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10/f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f + languageName: node + linkType: hard + +"type-flag@npm:^4.5.2": + version: 4.5.2 + resolution: "type-flag@npm:4.5.2" + checksum: 10/c5911adedd694fc96fd0658f7a14dc29f77f6f6e9d83d783d80ae138be2e1ba40290068b6e84673bf4c48e350c360d6e7c3f509e08e427b96c8b6287a0e15b8a + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10/0bd9eeae5efd27d98fd63519f999908c009e148039d8e7179a074f105362d4fcc214c38b24f6cda79c87e563cbd12083a4691381ed28559220d4a10c2047bed4 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/269dad101dda73e3110117a9b84db86f0b5c07dad3a9418116fd38d580cab7fc628a4fc167e29b6d7c39da2f53374b78e7cb578b3c5ec7a556689d985d193519 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.5 + resolution: "typed-array-byte-offset@npm:1.0.5" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.9" + for-each: "npm:^0.3.5" + gopd: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.10" + checksum: 10/c7054706f6957a406c9546db88787ecd389f3e468182b1e05dd07175ca263fbf672c6f773074d38d1832a0cab20cdb2138a45f18960c828f4c9d46cac14a5696 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.8 + resolution: "typed-array-length@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.9" + for-each: "npm:^0.3.5" + gopd: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + possible-typed-array-names: "npm:^1.1.0" + reflect.getprototypeof: "npm:^1.0.10" + checksum: 10/c044c644eee13fe8814d4c2401146103efd49bfd1e40412104f04c4d67f76b373da7e93026fbd99aaef1fdaa9c81d0886f34772d045472be9704157f4e1d0164 + languageName: node + linkType: hard + +"typescript@npm:5.9.3, typescript@npm:^5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/c089d9d3da2729fd4ac517f9b0e0485914c4b3c26f80dc0cffcb5de1719a17951e92425d55db59515c1a7ddab65808466debb864d0d56dcf43f27007d0709594 + languageName: node + linkType: hard + +"typescript@npm:~5.8.0": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/65c40944c51b513b0172c6710ee62e951b70af6f75d5a5da745cb7fab132c09ae27ffdf7838996e3ed603bb015dadd099006658046941bd0ba30340cc563ae92 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.9.3#optional!builtin, typescript@patch:typescript@npm%3A^5.9.3#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/696e1b017bc2635f4e0c94eb4435357701008e2f272f553d06e35b494b8ddc60aa221145e286c28ace0c89ee32827a28c2040e3a69bdc108b1a5dc8fb40b72e3 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A~5.8.0#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/b9b1e73dabac5dc730c041325dbd9c99467c1b0d239f1b74ec3b90d831384af3e2ba973946232df670519147eb51a2c20f6f96163cea2b359f03de1e2091cc4f + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 10/6b9639c1985d24580b01bb0ab68e78de310d38eeba7db45bec7850ab4093d8ee464d80ccfaceda9c68d1c366efbee28573b52f95e69ac792354c145acd380b11 + languageName: node + linkType: hard + +"uid@npm:2.0.2": + version: 2.0.2 + resolution: "uid@npm:2.0.2" + dependencies: + "@lukeed/csprng": "npm:^1.0.0" + checksum: 10/18f6da43d8e1b8643077e8123f877b4506759d9accc15337140a1bf7c99f299a66e88b27ab4c640e66e6a10f19e3a85afa45fdf830dd4bab7570d07a3d51e073 + languageName: node + linkType: hard + +"uint8array-extras@npm:^1.4.0": + version: 1.6.0 + resolution: "uint8array-extras@npm:1.6.0" + checksum: 10/485927269f68809fb9b37f17effcf9094b2f4c332d8468c7488d259e662ec0ad5c5bba66ca5500e1f5d8de8cf29c83db9148600b3633d444f1a1bc6b734145da + languageName: node + linkType: hard + +"unbash@npm:^2.2.0": + version: 2.2.0 + resolution: "unbash@npm:2.2.0" + checksum: 10/dc169c6cacff0364c3d46dbe3f08f4c812cee63359f94ebace483b1a382585d5a1bf4007c12ed3c73671a0256d0026efc23e4732583ae76b42d8570fc4680667 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10/fadb347020f66b2c8aeacf8b9a79826fa34cc5e5457af4eb0bbc4e79bd87fed0fa795949825df534320f7c13f199259516ad30abc55a6e7b91d8d996ca069e50 + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10/ec8f41aa4359d50f9b59fa61fe3efce3477cc681908c8f84354d8567bb3701fafdddf36ef6bff307024d3feb42c837cf6f670314ba37fc8145e219560e473d14 + languageName: node + linkType: hard + +"undici-types@npm:~8.9.0": + version: 8.9.0 + resolution: "undici-types@npm:8.9.0" + checksum: 10/8785591929de2b71d281c684e915c4a8c41becc225adbf42a3e89148f8b384724a21533494c30a1cbb85b4cbccd088d020788ff4f2d605013eb2863cd47a1639 + languageName: node + linkType: hard + +"undici@npm:7.29.0": + version: 7.29.0 + resolution: "undici@npm:7.29.0" + checksum: 10/ca73639071bdcbc41e57be1800847fa18f86f8fbf7a5641ff9899f7bbb6f5cecdd593e225f5fd94e31703dcbfaea4a722a3b81cab90c5c4e2b406aec1ae55732 + languageName: node + linkType: hard + +"undici@npm:^8.4.1": + version: 8.12.3 + resolution: "undici@npm:8.12.3" + checksum: 10/8a238fd928ec1791b76b6b1df512eb6b77bdf51eb609d5b2248c3d8545100e2bdeb4d1695cf1594456dd9d085a6a51069ed42be231e56b270f3ee2191bc6517a + languageName: node + linkType: hard + +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: 10/6e1521d35fa69493207eb8b41f8edb95985d8b3faf07c01d820a1830b5e8403e20002563e2f84683e8e962a49beccae789f0879356bf92a4ec7a4dd8e2d16fdb + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10/8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10/40912a8963fc02fb8b600cf50197df4a275c602c60de4cac4f75879d3c48558cfac48de08a25cc10df8112161f7180b3bbb4d662aadb711568602f9eddee54f0 + languageName: node + linkType: hard + +"universal-user-agent@npm:^6.0.0": + version: 6.0.1 + resolution: "universal-user-agent@npm:6.0.1" + checksum: 10/fdc8e1ae48a05decfc7ded09b62071f571c7fe0bd793d700704c80cea316101d4eac15cc27ed2bb64f4ce166d2684777c3198b9ab16034f547abea0d3aa1c93c + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 10/40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10/ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + +"unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10/4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + languageName: node + linkType: hard + +"unplugin-utils@npm:^0.2.4": + version: 0.2.5 + resolution: "unplugin-utils@npm:0.2.5" + dependencies: + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + checksum: 10/f9ff443089de3159ccab001d075fa4245a741696182dbe6b9708aa01945ded163bd846a3f4099132a2195de3fcbefe404a05380e4697faa4c5917c89f97a2361 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.3.4": + version: 1.3.4 + resolution: "update-browserslist-db@npm:1.3.4" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/b572dffa5e87f5b31e2934fa72d91f537dc219fec97ee9d13d744ed2ded8d540118d3cd8fb10236b984106b27ac8a074a32d606ebe18b55b0377aad8854a7a86 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10/b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb + languageName: node + linkType: hard + +"uri-template@npm:^2.0.0": + version: 2.0.0 + resolution: "uri-template@npm:2.0.0" + dependencies: + pct-encode: "npm:~1.0.0" + checksum: 10/99d520cd116171fb83f742508aa68e78559fc87ece5c3da1455a38e6105e9463c1f52c9f5b62c68659c85c98f66a68abaa61dc7290b0e54e7e893ffe12dbb3d1 + languageName: node + linkType: hard + +"urijs@npm:^1.19.11": + version: 1.19.11 + resolution: "urijs@npm:1.19.11" + checksum: 10/2aa5547b53c37ebee03a8ad70feae1638a37cc4c7e543abbffb14fc86b17f84f303d08e45c501441410c025bab22aa84673c97604b7b2619967f1dd49f69931f + languageName: node + linkType: hard + +"url@npm:^0.11.4": + version: 0.11.4 + resolution: "url@npm:0.11.4" + dependencies: + punycode: "npm:^1.4.1" + qs: "npm:^6.12.3" + checksum: 10/e787d070f0756518b982a4653ef6cdf4d9030d8691eee2d483344faf2b530b71d302287fa63b292299455fea5075c502a5ad5f920cb790e95605847f957a65e4 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10/474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"util@npm:^0.12.3, util@npm:^0.12.4, util@npm:^0.12.5": + version: 0.12.5 + resolution: "util@npm:0.12.5" + dependencies: + inherits: "npm:^2.0.3" + is-arguments: "npm:^1.0.4" + is-generator-function: "npm:^1.0.7" + is-typed-array: "npm:^1.1.3" + which-typed-array: "npm:^1.1.2" + checksum: 10/61a10de7753353dd4d744c917f74cdd7d21b8b46379c1e48e1c4fd8e83f8190e6bd9978fc4e5102ab6a10ebda6019d1b36572fa4a325e175ec8b789a121f6147 + languageName: node + linkType: hard + +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10/b068d8cb140588da0d0c80ee3c14c6b75d3f68760d8a1c6c3908d0270e9e4056454ff16189586481b7382926c44674f6929d08e06eaf9ec8f62736cd900169c5 + languageName: node + linkType: hard + +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 10/a3c51463fc807ed04ccc8b5d0fa6e31f3dcd7a4cbd30ab4bc6d760ce5319dd493d95bf04244693daf316f97e9ab2a37741edfed8748ad38572a595398ad0fdaf + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1, utils-merge@npm:^1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10/5d6949693d58cb2e636a84f3ee1c6e7b2f9c16cb1d42d0ecb386d8c025c69e327205aa1c69e2868cc06a01e5e20681fbba55a4e0ed0cce913d60334024eae798 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10/9a5f7aa1d6f56dd1e8d5f2478f855f25c645e64e26e347a98e98d95781d5ed20062d6cca2eecb58ba7c84bc3910be95c0451ef4161906abaab44f9cb68ffbdd1 + languageName: node + linkType: hard + +"validate.io-array@npm:^1.0.3": + version: 1.0.6 + resolution: "validate.io-array@npm:1.0.6" + checksum: 10/54eca83ebc702e3e46499f9d9e77287a95ae25c4e727cd2fafee29c7333b3a36cca0c5d8f090b9406262786de80750fba85e7e7ef41e20bf8cc67d5570de449b + languageName: node + linkType: hard + +"validate.io-function@npm:^1.0.2": + version: 1.0.2 + resolution: "validate.io-function@npm:1.0.2" + checksum: 10/e4cce2479a20cb7c42e8630c777fb107059c27bc32925f769e3a73ca5fd62b4892d897b3c80227e14d5fcd1c5b7d05544e0579d63e59f14034c0052cda7f7c44 + languageName: node + linkType: hard + +"validate.io-integer-array@npm:^1.0.0": + version: 1.0.0 + resolution: "validate.io-integer-array@npm:1.0.0" + dependencies: + validate.io-array: "npm:^1.0.3" + validate.io-integer: "npm:^1.0.4" + checksum: 10/5f6d7fab8df7d2bf546a05e830201768464605539c75a2c2417b632b4411a00df84b462f81eac75e1be95303e7e0ac92f244c137424739f4e15cd21c2eb52c7f + languageName: node + linkType: hard + +"validate.io-integer@npm:^1.0.4": + version: 1.0.5 + resolution: "validate.io-integer@npm:1.0.5" + dependencies: + validate.io-number: "npm:^1.0.3" + checksum: 10/88b3f8bb5a5277a95305d64abbfc437079220ce4f57a148cc6113e7ccec03dd86b10a69d413982602aa90a62b8d516148a78716f550dcd3aff863ac1c2a7a5e6 + languageName: node + linkType: hard + +"validate.io-number@npm:^1.0.3": + version: 1.0.3 + resolution: "validate.io-number@npm:1.0.3" + checksum: 10/42418aeb6c969efa745475154fe576809b02eccd0961aad0421b090d6e7a12d23a3e28b0d5dddd2c6347c1a6bdccb82bba5048c716131cd20207244d50e07282 + languageName: node + linkType: hard + +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10/31389debef15a480849b8331b220782230b9815a8e0dbb7b9a8369559aed2e9a7800cd904d4371ea74f4c3527db456dc8e7ac5befce5f0d289014dbdf47b2242 + languageName: node + linkType: hard + +"vm-browserify@npm:^1.0.1": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 10/ad5b17c9f7a9d9f1ed0e24c897782ab7a587c1fd40f370152482e1af154c7cf0b0bacc45c5ae76a44289881e083ae4ae127808fdff864aa9b562192aae8b5c3b + languageName: node + linkType: hard + +"walk-up-path@npm:^4.0.0": + version: 4.0.0 + resolution: "walk-up-path@npm:4.0.0" + checksum: 10/6a230b20e5de296895116dc12b09dafaec1f72b8060c089533d296e241aff059dfaebe0d015c77467f857e4b40c78e08f7481add76f340233a1f34fa8af9ed63 + languageName: node + linkType: hard + +"watchpack@npm:^2.5.2": + version: 2.6.3 + resolution: "watchpack@npm:2.6.3" + dependencies: + graceful-fs: "npm:^4.1.2" + checksum: 10/e0509644c09acbb91626cb318f2745a3d842040d458894e8f63bbbb797408cd8838cbc100f019ed4b5cc6d5426474d4d01d451f90758956e4fab2d8f4e9da384 + languageName: node + linkType: hard + +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: "npm:^1.0.0" + checksum: 10/c18b51c4e1fb19705c94b93c0cf093ba014606abceee949399d56074ef1863bf4897a8d884be24e8d224d18c9ce411cf6924006d0a5430492729af51256e067a + languageName: node + linkType: hard + +"wcwidth@npm:>=1.0.1, wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10/182ebac8ca0b96845fae6ef44afd4619df6987fe5cf552fdee8396d3daa1fb9b8ec5c6c69855acb7b3c1231571393bd1f0a4cdc4028d421575348f64bb0a8817 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10/b65b9f8d6854572a84a5c69615152b63371395f0c5dcd6729c45789052296df54314db2bc3e977df41705eacb8bc79c247cee139a63fa695192f95816ed528ad + languageName: node + linkType: hard + +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.6 + resolution: "webpack-dev-middleware@npm:7.4.6" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^4.43.1" + mime-types: "npm:^3.0.1" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10/fd82b8338d93b99bdc3169b4d2d35201a0a9a50b8c403c142b56d643d822e3c5f7295785388de0158879f5769c13207d35ff2b2c3739848e4ac8c01ef81528df + languageName: node + linkType: hard + +"webpack-dev-server@npm:^5.0.0": + version: 5.2.7 + resolution: "webpack-dev-server@npm:5.2.7" + dependencies: + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.25" + "@types/express-serve-static-core": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" + colorette: "npm:^2.0.10" + compression: "npm:^1.8.1" + connect-history-api-fallback: "npm:^2.0.0" + express: "npm:^4.22.1" + graceful-fs: "npm:^4.2.6" + http-proxy-middleware: "npm:^2.0.9" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.14.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^5.5.0" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10/9e36be7736e45d13a9a9750f0960bdbe06d7c28f0a608a2033917fc72d2ebd44ec1fc370a51806e647a22140dd7602b61a604faaf9e5adf7c6021494fc9a49ae + languageName: node + linkType: hard + +"webpack-sources@npm:^3.3.4, webpack-sources@npm:^3.5.1": + version: 3.6.0 + resolution: "webpack-sources@npm:3.6.0" + checksum: 10/7f89bc6a7f08b4b19dd7098ed92eac397648bc36d4c555ad54abad621ff60643ea94d2652cb708d57a3ccf10cec0471aec8dca254c9e30721157082ff66b9964 + languageName: node + linkType: hard + +"webpack@npm:~5.111.0": + version: 5.111.1 + resolution: "webpack@npm:5.111.1" + dependencies: + "@types/estree": "npm:^1.0.8" + "@types/json-schema": "npm:^7.0.15" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + browserslist: "npm:^4.28.1" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.25.0" + es-module-lexer: "npm:^2.1.0" + events: "npm:^3.2.0" + graceful-fs: "npm:^4.2.11" + mime-db: "npm:^1.54.0" + minimizer-webpack-plugin: "npm:^5.7.0" + schema-utils: "npm:^4.5.0" + tapable: "npm:^2.3.0" + watchpack: "npm:^2.5.2" + webpack-sources: "npm:^3.5.1" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10/1ce6844f0e2709083c8e24165dfa526d08a52ad2dfd7d39eed87edb170618ad5e23ac50deb646b019c41d576eed071e6bf407b7f9fce2010643f9fc9a705d284 + languageName: node + linkType: hard + +"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": + version: 0.7.5 + resolution: "websocket-driver@npm:0.7.5" + dependencies: + http-parser-js: "npm:>=0.5.1" + safe-buffer: "npm:>=5.1.0" + websocket-extensions: "npm:>=0.1.1" + checksum: 10/0671fef8c79ba1b1b2fa6b7d95cb034d059410e7c4cfd7ef42063a254e12ca2917806c3a5026206b33abf25a5d44a651c547b8f74d9ec94c9fe4df6fa1bc63f7 + languageName: node + linkType: hard + +"websocket-extensions@npm:>=0.1.1": + version: 0.1.4 + resolution: "websocket-extensions@npm:0.1.4" + checksum: 10/b5399b487d277c78cdd2aef63764b67764aa9899431e3a2fa272c6ad7236a0fb4549b411d89afa76d5afd664c39d62fc19118582dc937e5bb17deb694f42a0d1 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10/f95adbc1e80820828b45cc671d97da7cd5e4ef9deb426c31bcd5ab00dc7103042291613b3ef3caec0a2335ed09e0d5ed026c940755dbb6d404e2b27f940fdf07 + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10/a877c0667bc089518c83ad4d845cf8296b03efe3565c1de1940c646e00a2a1ae9ed8a185bcfa27cbf352de7906f0616d83b9d2f19ca500ee02a551fb5cf40740 + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10/22c81c5cb7a896c5171742cd30c90d992ff13fb1ea7693e6cf80af077791613fb3f89aa9b4b7f890bd47b6ce09c6322c409932359580a2a2a54057f7b52d1cbe + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10/674bf659b9bcfe4055f08634b48a8588e879161b9fefed57e9ec4ff5601e4d50a05ccd76cf10f698ef5873784e5df3223336d56c7ce88e13bcf52ebe582fc8d7 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": + version: 1.1.24 + resolution: "which-typed-array@npm:1.1.24" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10/5b9abdc4ff046414312eac5c5b2fedab57b08979209882049fd2f4064166f8f97edd6831ff701cb6171313da19dbbd091ed46f30712e733e9b166f5f5388159e + languageName: node + linkType: hard + +"which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10/549dcf1752f3ee7fbb64f5af2eead4b9a2f482108b7de3e85c781d6c26d8cf6a52d37cfbe0642a155fa6470483fe892661a859c03157f24c669cf115f3bbab5e + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10/4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10/f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"which@npm:^7.0.0": + version: 7.0.0 + resolution: "which@npm:7.0.0" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10/913a43ac10df37602ba9795a004dd7ab12ba7dd592aca1f08ec333be1fdd6a49bbf119a88c3f8d0ea70eeb6251726e77069251424d73000299a0a840ed000732 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10/1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 10/497d40beb2bdb08e6d38754faa17ce20b0bf1306327f80cb777927edb23f461ee1f6bc659b3c3c93f26b08e1cf4b46acc5bae8fda1f0be3b5ab9a1a0211034cd + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10/cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10/0d64f2d438e0b555e693b95aee7b2689a12c3be5ac458192a1ce28f542a6e9e59ddfecc37520910c2c88eb1f82a5411260566dba5064e8f9895e76e169e76187 + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10/7b1e4b35e9bb2312d2ee9ee7dc95b8cb5f8b4b5a89f7dde5543fe66c1e3715663094defa50d75454ac900bd210f702d575f15f3f17fa9ec0291806d2578d1ddf + languageName: node + linkType: hard + +"wrap-ansi@npm:^9.0.0": + version: 9.0.2 + resolution: "wrap-ansi@npm:9.0.2" + dependencies: + ansi-styles: "npm:^6.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/f3907e1ea9717404ca53a338fa5a017c2121550c3a5305180e2bc08c03e21aa45068df55b0d7676bf57be1880ba51a84458c17241ebedea485fafa9ef16b4024 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10/159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:8.21.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/088411956432c8f876158409d5a285cb9ad1382f593391f51d3a599bd0a5b277f876609ebd00fc3596321c4a4c9064d6fffe1ebad960e8ea7fd9ae25324f35c2 + languageName: node + linkType: hard + +"ws@npm:^8.18.0": + version: 8.22.0 + resolution: "ws@npm:8.22.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/ed771c2766bdb5724a66872f60ffc1a39f06e1a5bc8849f453c273e97c91a40ed5a224f06dc0e22f44b4a9e03938bf746fc5938d6887433cc0f4c416237d3b10 + languageName: node + linkType: hard + +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10/de4c92187e04c3c27b4478f410a02e81c351dc85efa3447bf1666f34fc80baacd890a6698ec91995631714086992036013286aea3d77e6974020d40a08e00aec + languageName: node + linkType: hard + +"xtend@npm:^4.0.2": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10/ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10/5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10/4cb02b42b8a93b5cf50caf5d8e9beb409400a8a4d85e83bb0685c1457e9ac0b7a00819e9f5991ac25ffabb56a78e2f017c1acc010b3a1babfe6de690ba531abd + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10/1884d272d485845ad04759a255c71775db0fac56308764b4c77ea56a20d56679fad340213054c8c9c9c26fcfd4c4b2a90df993b7e0aaf3cdb73c618d1d1a802a + languageName: node + linkType: hard + +"yaml-diff-patch@npm:^2.0.0": + version: 2.0.0 + resolution: "yaml-diff-patch@npm:2.0.0" + dependencies: + fast-json-patch: "npm:^3.1.0" + oppa: "npm:^0.4.0" + yaml: "npm:^2.0.0-10" + bin: + yaml-diff-patch: dist/bin/yaml-patch.js + yaml-overwrite: dist/bin/yaml-patch.js + yaml-patch: dist/bin/yaml-patch.js + checksum: 10/8563022369295a974a838070365fd827f05fcb3341e004c43b8c7883d222fcb93144ac875e31ae0b033bd6e377b1d6cab96abb47d3e5135bebe7c73620d0f674 + languageName: node + linkType: hard + +"yaml@npm:^1.10.2, yaml@npm:^1.7.2": + version: 1.10.3 + resolution: "yaml@npm:1.10.3" + checksum: 10/e2ef2feb92c708138f016c69777a0f1e45f6d3c5e7cbcda30807a98a37eda2e008bd4fa57352b043c65245a4c799d0c99d1f9b3425de40e70929e26d2ea38215 + languageName: node + linkType: hard + +"yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.8.2": + version: 2.9.1 + resolution: "yaml@npm:2.9.1" + bin: + yaml: bin.mjs + checksum: 10/123c5e56a26f4962d3d5954971b2071a533d17041e00ae9ff6a5e634aed2503639bbdeea143b1610eac29613aad95a3a1d10f5fbda87b92203c039ce63934295 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e + languageName: node + linkType: hard + +"yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10/f13c42bad6ebed1a587a72f2db5694f5fa772bcaf409a701691d13cf74eb5adfcf61a2611de08807e319b829d3e5e6e1578b16ebe174cae8e8be3bf7b8e7a19e + languageName: node + linkType: hard + +"yargs@npm:18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" + dependencies: + cliui: "npm:^9.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + string-width: "npm:^7.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^22.0.0" + checksum: 10/5af36234871390386b31cac99f00e79fcbc2ead858a61b30a8ca381c5fde5df8af0b407c36b000d3f774bcbe4aec5833f2f1c915f6ddc49ce97b78176b651801 + languageName: node + linkType: hard + +"yargs@npm:^16.0.0, yargs@npm:^16.2.0": + version: 16.2.2 + resolution: "yargs@npm:16.2.2" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 10/4ea83fae599077207a663d07c3b8de5d6879e7030bef3ebcddd1e6f9ed63f6622b04c84bf9c2121df626d25f3e2d832a6573e47343a75f05d982df2b60d5e9bd + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.3 + resolution: "yargs@npm:17.7.3" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10/a3826798c03b159e139d0580a3b2733953889a9a1bac8e4e1ca7a1a249b55315b213c323a6a1dbdb305f6e59496a9eaa810742c87e34abcf1a0584d8f59212a1 + languageName: node + linkType: hard + +"yml-loader@npm:^2.1.0": + version: 2.1.0 + resolution: "yml-loader@npm:2.1.0" + dependencies: + js-yaml: "npm:^3.8.3" + loader-utils: "npm:^1.1.0" + checksum: 10/7afc624b3c9d3520698d275069b891a826ecb1ecf3c37e8312737067b23427f1e0d5c4b05cb08bea85d675c0a4f883831bcc82fda34f79158c0659a2d09de920 + languageName: node + linkType: hard + +"yn@npm:^4.0.0": + version: 4.0.0 + resolution: "yn@npm:4.0.0" + checksum: 10/2d60113b6f43f7c29a0a97719d8da4f626b755f5bb2fd19b00d1fe732db1900ad3f1785811a86d941cbe2800f02773af00d0ed99201333eeb3618db8502f7e96 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard + +"zod-to-json-schema@npm:^3.25.1": + version: 3.25.2 + resolution: "zod-to-json-schema@npm:3.25.2" + peerDependencies: + zod: ^3.25.28 || ^4 + checksum: 10/7035328654113f1a0b8e4c2d34a06f918c93650ef8a50d4fb30ad8f22e47d5762c163af9c82494756b34776bae3c41c26cfc6945105b0eee7dceb528cc07e665 + languageName: node + linkType: hard + +"zod-validation-error@npm:^5.0.0": + version: 5.0.0 + resolution: "zod-validation-error@npm:5.0.0" + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + checksum: 10/d5713f6608f9b8fcb0d74c591cb5c5839fcab679adde5c668f8f95539a1b54fb6910ba577ec66ccda77645e9d2c1ae3fafca771a291f4648aaae8bdfed9b27a7 + languageName: node + linkType: hard + +"zod@npm:^3.25.76 || ^4.0.0, zod@npm:^4.0.0, zod@npm:^4.1.11": + version: 4.6.7 + resolution: "zod@npm:4.6.7" + checksum: 10/3ca8b8d6bb401538e59504c543db629ea7beaa775e504c3f22269b406fdffbf1431c856d59a597bf66d8487e4d2be12b03a55d76fc2c63d9f046eae1ca173bca + languageName: node + linkType: hard From fff5c6e153186b8dd1cfaf5117130d7807f7e25b Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:15:59 +0200 Subject: [PATCH 02/28] Add OpenSpec proposal for guided tour plugin Proposal, design, tasks and spec for an extension-driven guided tour system on the new frontend system: a web library plugins depend on (blueprint, API ref, hook, markdown), a plugin with the api/overlay/page, per-user progress in user settings, login and route auto-start, and cross-page steps. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../changes/guided-tour-plugin/design.md | 338 ++++++++++++++++++ .../changes/guided-tour-plugin/proposal.md | 68 ++++ .../specs/guided-tour/spec.md | 144 ++++++++ .../changes/guided-tour-plugin/tasks.md | 46 +++ 4 files changed, 596 insertions(+) create mode 100644 workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md create mode 100644 workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md create mode 100644 workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md create mode 100644 workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md new file mode 100644 index 00000000000..5eb149d26a5 --- /dev/null +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md @@ -0,0 +1,338 @@ +# Design: Guided tour plugin + +## Context + +- The app runs on the new frontend system (`@backstage/frontend-defaults` + `createApp`, `app.packages: all`, `@backstage/frontend-plugin-api` 0.18). +- `@backstage/ui` 0.17 is installed and already provides `Popover` (a thin + wrapper over `react-aria-components` `Popover` that forwards `triggerRef`, + `placement`, `isOpen`, `isNonModal`), `Dialog`, `Button`, `ButtonIcon`, + `Text`, `Link`, `Card`, `Table`, `Tooltip`, `VisuallyHidden`. It has no + markdown component, but internally uses `marked`'s `Lexer` to turn inline + markdown into `Link`/text (see its `Header`). We reuse that approach. +- App root elements (`AppRootElementBlueprint`) are rendered by + `@backstage/plugin-app` _inside_ the router and the `BUIProvider`, before + the routed content, and (when a sign-in page is configured) _outside_ the + sign-in gate. So the overlay can use `useNavigate`/`useLocation`, but must + wait for identity before doing anything. +- `storageApiRef` is implemented by `UserSettingsStorage` (user-settings + backend, synced across tabs via signals). Without that module it degrades + to `WebStorage` (localStorage); the tour plugin does not care which. +- Nav items are derived from `PageBlueprint` `title`/`icon` params and picked + in `packages/app/src/modules/nav/Sidebar.tsx` via `nav.take('page:')`. + +## Goals + +1. Any NFS plugin can ship tours by adding one extension and depending only + on the `-react` library. +2. One global, ordered tour list owned by `api:guided-tour`. +3. Steps spotlight a DOM element and show markdown text in a popover with + Previous / Next / Close. +4. Progress (current step, dismissed, completed) is saved per user. +5. Auto-start modes: on login, on first visit of a route, or manual only. +6. A tour that appears after the user has already been onboarded is played + on its own, not merged into the welcome sequence. +7. `/guided-tours` page lists all tours, allows replay and reset. +8. Steps can change the route, or advance by the user clicking the + highlighted element, so a tour can span pages. + +## Non-goals + +- No tour authoring UI, no backend storage of tour definitions. +- No support for the legacy frontend system (`createPlugin`). +- No Material UI in the new packages. + +## Package layout + +``` +plugins/guided-tour-react/ @internal/backstage-plugin-guided-tour-react (web-library) + src/ + api.ts guidedTourApiRef, GuidedTourApi, GuidedTourProgress, GuidedTourRunnerState + types.ts GuidedTour, GuidedTourStep, GuidedTourAutoStart + blueprint.ts GuidedTourBlueprint, guidedTourDataRef + hooks/useGuidedTour.ts + components/GuidedTourTarget.tsx (optional wrapper that sets data-guided-tour) + components/MarkdownText.tsx (minimal markdown -> BUI elements) + index.ts + +plugins/guided-tour/ @internal/backstage-plugin-guided-tour (frontend-plugin, pluginId guided-tour) + src/ + api/DefaultGuidedTourApi.ts registry + runner state machine + progress store + api/progressStore.ts storageApi bucket helpers + extensions/api.ts ApiBlueprint.makeWithOverrides -> api:guided-tour (input: tours) + extensions/overlay.tsx AppRootElementBlueprint -> app-root-element:guided-tour/overlay + extensions/page.tsx PageBlueprint -> page:guided-tour (/guided-tours) + components/overlay/GuidedTourOverlay.tsx orchestration (identity gate, queue, route triggers) + components/overlay/Spotlight.tsx fixed SVG mask with cut-out + components/overlay/StepPopover.tsx BUI Popover + react-aria Dialog, buttons + components/overlay/useTargetElement.ts selector -> element, MutationObserver + timeout + components/page/GuidedToursPage.tsx + translation.ts + plugin.ts, routes.ts, index.ts, alpha.ts + dev/index.tsx createDevApp-style playground with 2 demo tours + +packages/app/src/modules/guided-tour/ welcome tour for this app +plugins/example/src/guidedTour.ts example.intro tour (route triggered) +``` + +## Public contract (`-react` library) + +```ts +export interface GuidedTourStep { + id: string; // unique inside the tour + title?: string; + content: string; // minimal markdown, see below + /** Element to spotlight. A bare id resolves to `[data-guided-tour=""]`; + * use `{ selector }` for an arbitrary CSS selector. Omit for a centered step. */ + target?: string | { selector: string }; + placement?: 'top' | 'bottom' | 'left' | 'right' | 'start' | 'end'; // react-aria Placement subset, default 'bottom' + /** Navigate here (app-relative path) before the step is shown. */ + route?: string; + /** 'next' (default): Next button. 'click': clicking the target advances; clicks pass through the mask. */ + advanceOn?: 'next' | 'click'; + /** How long to wait for the target to appear (lazy pages, navigation). Default 5000 ms. */ + targetTimeoutMs?: number; + /** When the target never appears: 'center' (default) shows the step without spotlight, 'skip' jumps over it. */ + onMissingTarget?: 'center' | 'skip'; +} + +export type GuidedTourAutoStart = + | false // manual only (default) + | 'login' // part of onboarding / shown alone when new + | { route: string }; // first time the location matches this path (matchPath semantics) + +export interface GuidedTour { + id: string; // defaults to the extension node id without the kind prefix, e.g. "example/intro" + title: string; + description?: string; + version?: number; // bump to show the tour again to users who completed/dismissed an older version + order?: number; // ordering in the queue and on the page, default 100 + autoStart?: GuidedTourAutoStart; + steps: GuidedTourStep[]; +} + +export const guidedTourDataRef = createExtensionDataRef().with({ + id: 'guided-tour.tour', +}); + +export const GuidedTourBlueprint = createExtensionBlueprint({ + kind: 'guided-tour', + attachTo: { id: 'api:guided-tour', input: 'tours' }, + output: [guidedTourDataRef], + dataRefs: { tour: guidedTourDataRef }, + factory(params: Omit & { id?: string }, { node }) { + return [ + guidedTourDataRef({ + id: params.id ?? node.spec.id.replace(/^guided-tour:/, ''), + ...params, + }), + ]; + }, +}); + +export interface GuidedTourProgress { + status: 'in-progress' | 'completed' | 'dismissed'; + stepIndex: number; + version: number; + updatedAt: string; // ISO +} + +export interface GuidedTourRunnerState { + activeTourId?: string; + stepIndex: number; + queue: string[]; // tours that will play after the active one +} + +export interface GuidedTourApi { + getTours(): GuidedTour[]; // global ordered list + getTour(id: string): GuidedTour | undefined; + start(id: string, opts?: { force?: boolean; stepId?: string }): void; // force ignores saved progress + next(): void; + previous(): void; + dismiss(): void; + complete(): void; + state$(): Observable; + progress$(): Observable>; + resetProgress(id?: string): Promise; // undefined = all +} +export const guidedTourApiRef = createApiRef({ + id: 'plugin.guided-tour.api', +}); + +/** Safe in any plugin: returns no-op handlers when the guided tour plugin is not installed. */ +export function useGuidedTour(id: string): { + available: boolean; + start(opts?: { force?: boolean }): void; + progress?: GuidedTourProgress; +}; +``` + +Why the API and not the overlay owns the registry: tours must be queryable +by the page, by `useGuidedTour`, and by the overlay. `api:guided-tour` is +the single attachment point, created with +`ApiBlueprint.makeWithOverrides({ inputs: { tours: createExtensionInput([guidedTourDataRef]) }, configSchema: { autoStart: z => z.boolean().default(true) }, factory })`. +Extensions attached to an input of an extension that is not installed are +simply left unattached by the NFS app graph, which is what makes the +"ships a tour without the tour plugin" requirement free. + +## Minimal markdown + +`MarkdownText` lexes with `marked`'s `Lexer` (block + inline tokens) and +maps tokens to BUI elements. Supported: paragraphs, line breaks, `**bold**`, +`_italic_`, `` `code` ``, `[links](...)` (URLs through +`@braintree/sanitize-url`; app-relative links rendered with BUI `Link`, which +is router-aware), bullet and numbered lists. Headings render as +`Text` with a title variant. Everything else (HTML, images, tables) renders as +its raw text. No `dangerouslySetInnerHTML` anywhere. + +## Runner behaviour + +State machine in `DefaultGuidedTourApi` (framework-agnostic, observable): + +``` +idle --start(id)--> running{tour, stepIndex, queue} +running --next()--> stepIndex+1 | last step --> complete() --> pop queue or idle +running --previous()--> stepIndex-1 (min 0) +running --dismiss()--> progress[id] = dismissed --> pop queue or idle +``` + +Every transition writes progress: + +| Event | Saved | +| ----------------------------------- | ----------------------------------------------------------------------- | +| Next / Previous | `{ status: 'in-progress', stepIndex }` so a reload resumes at that step | +| Close / Esc / "Skip tour" | `{ status: 'dismissed', stepIndex }` | +| Next on last step | `{ status: 'completed', stepIndex: last }` | +| Start with `force` or from the page | overwrites previous status | + +Storage: `storageApi.forBucket('guided-tour')`, one key per tour +(`tour/`) plus `onboarded: true` written when the login queue finishes +or is dismissed. One key per tour keeps writes small and lets the page +observe a single tour. `version` mismatch (tour bumped) is treated as "never +seen". + +### Auto-start rules (evaluated once per page load, after identity resolves) + +1. Wait for `identityApi.getBackstageIdentity()` and the first snapshot of + the bucket (so a signed-out app or a loading storage shows nothing). +2. Skip everything if `api:guided-tour` config `autoStart` is `false`. +3. `loginTours = tours.filter(autoStart === 'login')` sorted by `order`. +4. If `onboarded` is not set: queue **all** `loginTours` without progress + and play them back to back; each still has its own title, counter and + progress. On finishing or dismissing the queue, write `onboarded`. +5. If `onboarded` is set: queue only `loginTours` that have **no** progress + entry (new plugin enabled later, or bumped `version`). They are played + alone, i.e. not re-attached to tours the user already handled. +6. Route tours: a `useLocation` effect matches `autoStart.route` against the + pathname. First match with no progress entry and nothing running starts + the tour. Matching tours while another tour runs wait for the next + navigation, they do not interrupt. +7. Manual: `useGuidedTour(id).start()` or the page. `start` while a tour runs + replaces it (the replaced tour is saved as `in-progress`). + +### Steps, targets and cross-page flows + +For the active step the overlay: + +1. If `step.route` is set and differs from the current pathname, calls + `navigate(step.route)`. +2. Resolves the target with `useTargetElement`: immediate `querySelector`, + then a `MutationObserver` on `document.body` until found or + `targetTimeoutMs` elapses. While waiting, a dimmed mask without hole and a + small BUI `Skeleton` card is shown so the user sees something happened. +3. On found: `scrollIntoView({ block: 'center', inline: 'nearest' })`, then + measure `getBoundingClientRect()`; re-measure on `ResizeObserver`, + `scroll` (capture) and `resize`, throttled to animation frames. +4. On timeout: `onMissingTarget` decides between centered `Dialog` and skip. +5. `advanceOn: 'click'`: the mask hole has `pointer-events: none`, a + capture-phase `click` listener on the target calls `next()`. If the click + navigates, the next step's `useTargetElement` waits for the new page. The + popover hides its Next button in this mode and shows "Click the + highlighted element to continue". + +Spotlight = `position: fixed; inset: 0` SVG with a `fill-rule="evenodd"` +path (full rect minus rounded target rect, padding 6px). Mask rects are +`pointer-events: auto` except the hole. z-index sits below BUI's Popover +portal so the card is always on top. Colors come from BUI tokens +(`--bui-bg-overlay`-like neutrals), so dark theme is free. + +Step card = BUI `Popover` (`triggerRef={{ current: targetElement }}`, +`isNonModal`, `isOpen`, `placement`, `shouldFlip`) wrapping a +`react-aria-components` `Dialog` for `role="dialog"`, `aria-labelledby`, +focus containment and Esc handling. Contents: `Text` title, `MarkdownText` +body, footer `Flex` with step counter `n / total`, `Button variant="secondary"` Previous +(disabled on first step), `Button variant="primary"` Next / Done, and a +`ButtonIcon` close in the header. Steps without a target reuse the same +card inside BUI `Dialog` (modal, centered). + +The overlay renders nothing at all when there is no active tour, so it costs +nothing on normal pages. + +### Guided tours page (`/guided-tours`) + +`PageBlueprint` with `title: 'Guided tours'`, icon, lazy loader. BUI `Table` +(or `Card` list on narrow screens) with columns Title, Description, Steps, +Status (New / In progress / Completed / Dismissed with BUI `Badge`), and +actions Start / Restart. Header actions: "Reset all tours" (confirm with BUI +`Dialog`, then `resetProgress()`), and a note explaining auto-start. +Starting a tour from the page navigates to the first step's `route` if set. +Sidebar: `nav.take('page:guided-tour')` inside the Settings group. + +## Configuration + +```yaml +app: + extensions: + - guided-tour:example/intro: false # disable one tour + - api:guided-tour: + config: + autoStart: false # never auto-start (e2e, kiosks) +``` + +## Testing + +- `-react`: `MarkdownText` snapshot tests; blueprint test with + `createExtensionTester` asserting the `guided-tour.tour` output and derived id. +- plugin: `DefaultGuidedTourApi` state machine with `MockStorageApi` + (auto-start rules 4–6 as table tests); `useTargetElement` with jsdom + `MutationObserver`; overlay rendered via `renderInTestApp` with a fake + identity; page rendered with a stubbed api. +- app: Playwright test in `packages/app/e2e-tests` that logs in as guest, + walks the welcome tour across `/catalog` and `/settings`, reloads mid-tour + and expects to resume at the saved step. + +## Risks and mitigations + +- **Root elements render before sign-in** → identity gate in the overlay. +- **Lazy pages / portals**: targets appear late → MutationObserver + timeout + - `onMissingTarget`. +- **Legacy MUI sidebar** is not BUI: targeting uses `data-guided-tour` + attributes, so the welcome tour adds that attribute to `SidebarItem`s via + the existing `nav.withComponent` hook; no MUI dependency in the plugin. +- **Storage write races** (Next clicked fast): writes are serialized per key + in `progressStore`; the in-memory runner state is the source of truth + while running. +- **Two tabs**: `UserSettingsStorage` emits updates via signals; the runner + ignores remote updates while a tour is active and re-reads them when idle. +- **Selector drift** when plugins change markup: targets are ids on a data + attribute, not DOM paths; `onMissingTarget: 'skip'` keeps tours resilient. + +## Alternatives considered + +- _react-joyride / driver.js_: own CSS and overlay stack, MUI-era styling, + no portal awareness of BUI; rejected to keep one design system. +- _Tour registry in the overlay element instead of the API_: would force + every consumer to go through React context; rejected because the page and + the hook need the list without being descendants of the overlay. +- _One `tours` storage key_: simpler, but every Next rewrites every tour and + the page cannot observe one tour; rejected. +- _A user-settings tab instead of a page_: the user asked for a dedicated + page; a settings tab can be added later with the same component. + +## Open questions + +1. Should a dismissed login tour be re-offered after N days, or only after + a `version` bump? Proposal: only on version bump; the page is the way back. +2. Should the "Reset all" action also clear `onboarded` so the full welcome + sequence replays on next login? Proposal: yes, that is what users expect + from "show all guided tours again". diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md new file mode 100644 index 00000000000..c265a287f55 --- /dev/null +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md @@ -0,0 +1,68 @@ +# Proposal: Guided tour plugin for Backstage (new frontend system) + +## Why + +New users land in Backstage without any in-product orientation, and every +plugin that ships its own features has no shared way to introduce them. +Backstage offers nothing built in for spotlight-style walkthroughs, and +third-party tour libraries (react-joyride, driver.js, shepherd) bring their +own styling, their own overlay stack and no awareness of the new frontend +system (NFS), user settings or routing. + +This change adds a first-class, extension-driven guided tour system that: + +- renders with `@backstage/ui` (BUI) and falls back to `react-aria` only for + the low-level overlay/positioning primitives BUI itself is built on; +- lets _any_ NFS plugin ship one or more tours by adding an extension, with a + dependency only on a small `-react` library, never on the tour plugin itself; +- remembers per user, in user settings, what has been seen, dismissed and + completed; +- can auto-start tours on login or on first visit of a route, shows a tour + that arrives later (new plugin installed) on its own, and lets users replay + everything from a dedicated page. + +## What changes + +Two new workspace packages and one app-level module: + +| Package | Role | Purpose | +| ---------------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `plugins/guided-tour-react` (`@internal/backstage-plugin-guided-tour-react`) | `web-library` | Public contract: `GuidedTourBlueprint`, `guidedTourApiRef`, types, `useGuidedTour()` hook, `data-guided-tour` target helper, markdown renderer. This is the only package other plugins depend on. | +| `plugins/guided-tour` (`@internal/backstage-plugin-guided-tour`) | `frontend-plugin`, `pluginId: guided-tour` | The engine: `api:guided-tour` (collects tours, persists progress via `storageApiRef`), `app-root-element:guided-tour/overlay` (spotlight + step popover + navigation), `page:guided-tour` at `/guided-tours` (replay/reset page). | +| `packages/app/src/modules/guided-tour` | app module | A "Welcome to Backstage" login tour spanning sidebar, catalog and settings. | + +Demonstration of the "plugin ships its own tour" story: + +- `plugins/example` gets a `guided-tour:example/intro` extension that + auto-starts the first time a user navigates to `/example` and includes a + "click the highlighted element" step. The example plugin only adds + `@internal/backstage-plugin-guided-tour-react` to its dependencies. + +Also touched: + +- `packages/app/package.json`: add the two packages (discovered through + `app.packages: all`), add the `/guided-tours` nav item to the sidebar + settings group. +- `app-config.yaml`: document `app.extensions` toggles for individual tours + and the `guidedTour.autoStart` kill switch (useful for e2e runs). + +Nothing is removed. No backend changes: persistence reuses the existing +`@backstage/plugin-user-settings-backend` through `storageApiRef`, which the +app already wires via `@backstage/plugin-app-module-user-settings`. + +## Impact + +- **Other plugins**: opt-in. A plugin that adds a tour extension and the + `-react` dependency keeps working unchanged when the guided tour plugin is + not installed; the extension simply stays unattached. +- **Users**: a one-time welcome tour on first login, a tour on first visit of + `/example`, a new sidebar entry "Guided tours". +- **Design system**: first app-level overlay written entirely in BUI; no new + Material UI usage. Adds `marked` and `@braintree/sanitize-url` as direct + dependencies of the react library (both already resolved in `yarn.lock` + through `@backstage/ui`, so no new packages are installed). +- **Testing**: unit tests with `@backstage/frontend-test-utils`, one Playwright + flow for a cross-page tour. +- **Out of scope**: backend-driven tour definitions, per-group targeting, + analytics events, translations beyond the default English strings (strings + are kept in one `translationRef` so they can be translated later). diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md new file mode 100644 index 00000000000..6deb23a5ce7 --- /dev/null +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md @@ -0,0 +1,144 @@ +# Capability: guided-tour + +## ADDED Requirements + +### Requirement: Tours are registered through NFS extensions + +The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tour`, and `api:guided-tour` SHALL expose the collected tours as one list ordered by `order` then title. + +#### Scenario: Plugin ships a tour + +- **WHEN** a frontend plugin includes an extension made with `GuidedTourBlueprint` and the guided tour plugin is installed +- **THEN** the tour appears in `guidedTourApi.getTours()` with an id derived from the extension id (e.g. `example/intro`) + +#### Scenario: Guided tour plugin not installed + +- **WHEN** a plugin includes a `guided-tour` extension and the guided tour plugin is not part of the app +- **THEN** the app starts without error and the plugin behaves as if it shipped no tour + +#### Scenario: Tour disabled by config + +- **WHEN** `app.extensions` contains `guided-tour:example/intro: false` +- **THEN** the tour is absent from the list, the page, and auto-start + +### Requirement: Steps spotlight an element and show markdown content + +Each step SHALL highlight its target element with a dimmed mask and a cut-out and SHALL show title and content in a popover anchored to that element. Content SHALL support minimal markdown: paragraphs, bold, italic, inline code, links, bullet and numbered lists. HTML SHALL be rendered as text. + +#### Scenario: Step with target + +- **WHEN** a step with `target: 'catalog.create'` becomes active and an element with `data-guided-tour="catalog.create"` exists +- **THEN** the element is scrolled into view, the mask cuts it out, and the popover is positioned next to it with role `dialog` and the step title as accessible name + +#### Scenario: Step without target + +- **WHEN** a step has no `target` +- **THEN** the step is shown in a centered dialog without a cut-out + +#### Scenario: Target never appears + +- **WHEN** the target is not found within `targetTimeoutMs` +- **THEN** the step is shown centered when `onMissingTarget` is `center` (default), or skipped when it is `skip` + +### Requirement: Navigation buttons + +The popover SHALL show a Previous button (disabled on the first step), a Next button (labelled Done on the last step), a close control, and a `current / total` counter. Escape SHALL close the tour. + +#### Scenario: Next and Previous + +- **WHEN** the user presses Next on step 2 of 4 +- **THEN** step 3 is shown; pressing Previous returns to step 2 + +#### Scenario: Done + +- **WHEN** the user presses Done on the last step +- **THEN** the tour ends and its progress is saved as `completed` + +### Requirement: Progress is saved per user + +The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. + +#### Scenario: Next persists the step + +- **WHEN** the user presses Next and then reloads the page +- **THEN** the tour resumes at the saved step + +#### Scenario: Dismiss is remembered + +- **WHEN** the user closes a tour +- **THEN** the tour is saved as `dismissed` and is not auto-started again for that tour version + +#### Scenario: Version bump re-shows + +- **WHEN** a tour's `version` is higher than the saved version +- **THEN** the saved progress is ignored and the tour counts as never seen + +### Requirement: Auto-start on login + +Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tour` config `autoStart` is `false`. + +#### Scenario: First login + +- **WHEN** a user with no saved tour progress and no `onboarded` flag signs in +- **THEN** all login tours without progress play one after another in `order`, and `onboarded` is written when the sequence finishes or is dismissed + +#### Scenario: New tour after onboarding + +- **WHEN** `onboarded` is set and a login tour without any progress entry exists (newly enabled plugin) +- **THEN** only that tour starts, on its own, not combined with previously seen tours + +#### Scenario: Global kill switch + +- **WHEN** `api:guided-tour` is configured with `autoStart: false` +- **THEN** no tour starts automatically; manual start and the page still work + +### Requirement: Auto-start on first visit of a route + +A tour with `autoStart: { route }` SHALL start the first time the location matches `route` for a user who has no progress entry for it, provided no other tour is running. + +#### Scenario: First navigation to a plugin + +- **WHEN** a user without progress for `example/intro` navigates to `/example` +- **THEN** `example/intro` starts + +#### Scenario: Already seen + +- **WHEN** the user has `completed` or `dismissed` progress for `example/intro` and navigates to `/example` +- **THEN** nothing starts + +### Requirement: Manual start from any plugin + +The `-react` library SHALL provide `useGuidedTour(id)` returning `{ available, start, progress }`; `start` SHALL be a no-op and `available` false when the guided tour plugin is not installed. + +#### Scenario: Replay button in a plugin + +- **WHEN** a plugin renders a button calling `useGuidedTour('example/intro').start({ force: true })` +- **THEN** the tour starts from step 1 regardless of saved progress + +### Requirement: Dedicated page lists all tours + +The system SHALL provide a page at `/guided-tours` (title "Guided tours") listing every registered tour with its status, a Start/Restart action per tour, and a Reset all action that clears all progress and the `onboarded` flag. + +#### Scenario: Restart a completed tour + +- **WHEN** the user presses Restart for a completed tour +- **THEN** the tour starts from step 1, navigating to the first step's `route` if set + +#### Scenario: Reset all + +- **WHEN** the user confirms Reset all +- **THEN** every tour shows status New and the next login replays the login sequence + +### Requirement: Cross-page steps + +A step MAY set `route` to navigate before being shown, and MAY set `advanceOn: 'click'` so that clicking the highlighted element advances the tour. + +#### Scenario: Route step + +- **WHEN** a step with `route: '/catalog'` becomes active while the user is on `/` +- **THEN** the app navigates to `/catalog` and waits for the step target before showing the popover + +#### Scenario: Click-through step + +- **WHEN** a step has `advanceOn: 'click'` and the user clicks the highlighted element +- **THEN** the click reaches the element, the tour advances, and if the click navigated, the next step waits for its target on the new page diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md new file mode 100644 index 00000000000..9ee8bfd2040 --- /dev/null +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md @@ -0,0 +1,46 @@ +# Tasks: Guided tour plugin + +## 1. `plugins/guided-tour-react` (web library) + +- [ ] 1.1 Scaffold `@internal/backstage-plugin-guided-tour-react` with `backstage-cli new` (role `web-library`); deps: `@backstage/frontend-plugin-api`, `@backstage/ui`, `marked`, `@braintree/sanitize-url`; peer `react`, `react-router-dom`. +- [ ] 1.2 Add `types.ts` (`GuidedTour`, `GuidedTourStep`, `GuidedTourAutoStart`) and `api.ts` (`GuidedTourApi`, `GuidedTourProgress`, `GuidedTourRunnerState`, `guidedTourApiRef`). +- [ ] 1.3 Add `guidedTourDataRef` and `GuidedTourBlueprint` (kind `guided-tour`, attachTo `api:guided-tour` / `tours`, id derived from node id). +- [ ] 1.4 Add `useGuidedTour(id)` hook using `useApiHolder()` so it is a no-op without the plugin. +- [ ] 1.5 Add `MarkdownText` (marked `Lexer` → BUI `Text`/`Link`/lists/code, sanitized links) with tests. +- [ ] 1.6 Add `GuidedTourTarget` helper (`data-guided-tour` attribute) and `guidedTourTargetProps(id)`. +- [ ] 1.7 Export everything from `index.ts`, write `README.md` with the "ship a tour from your plugin" recipe, run `yarn tsc && yarn lint && yarn test` for the package. + +## 2. `plugins/guided-tour` core + +- [ ] 2.1 Scaffold `@internal/backstage-plugin-guided-tour` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. +- [ ] 2.2 Implement `progressStore.ts` over `storageApiRef.forBucket('guided-tour')` (per-tour keys, `onboarded`, serialized writes, `observe$`). +- [ ] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `state$`, `progress$`, `resetProgress`), with table-driven unit tests using `MockStorageApi`. +- [ ] 2.4 Add `api:guided-tour` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. +- [ ] 2.5 Add `translation.ts` with all user-facing strings. + +## 3. Overlay (app root element) + +- [ ] 3.1 `useTargetElement` (selector resolution, MutationObserver, timeout, rect tracking) with jsdom tests. +- [ ] 3.2 `Spotlight` SVG mask with evenodd hole, pointer-events rules for `advanceOn: 'click'`. +- [ ] 3.3 `StepPopover` on BUI `Popover` + react-aria `Dialog` (title, `MarkdownText`, counter, Previous / Next / Done / close, Esc = dismiss, keyboard focus). Centered BUI `Dialog` variant for target-less steps. +- [ ] 3.4 `GuidedTourOverlay`: identity gate, storage-ready gate, login queue and `onboarded` logic, route-triggered tours, `step.route` navigation, click-to-advance wiring, no render when idle. +- [ ] 3.5 Register `app-root-element:guided-tour/overlay` with `AppRootElementBlueprint`; render tests via `renderInTestApp`. + +## 4. Guided tours page + +- [ ] 4.1 `GuidedToursPage` (BUI `Table`/`Card`, status `Badge`, Start / Restart, Reset all with confirm `Dialog`). +- [ ] 4.2 Register `page:guided-tour` (`/guided-tours`, title "Guided tours", icon) and `rootRouteRef`. +- [ ] 4.3 Dev app under `plugins/guided-tour/dev` with two demo tours (one route-triggered, one with a click step). + +## 5. App wiring and demo tours + +- [ ] 5.1 Add both packages to `packages/app/package.json`; add `nav.take('page:guided-tour')` to the Settings group in `Sidebar.tsx`; add `data-guided-tour` ids to sidebar items via `nav.withComponent`. +- [ ] 5.2 Add `packages/app/src/modules/guided-tour` with the `app/welcome` login tour (sidebar → `/catalog` → create button → `/settings`) and register it in `App.tsx`. +- [ ] 5.3 Add `guided-tour:example/intro` to `plugins/example` (route `/example`, one `advanceOn: 'click'` step), depending only on the `-react` package; mark targets in `TodoPage`. +- [ ] 5.4 Document `app.extensions` toggles and `autoStart: false` in `app-config.yaml` comments and `plugins/guided-tour/README.md`. + +## 6. Verification + +- [ ] 6.1 `yarn tsc`, `yarn lint:all`, `yarn prettier:check`, `yarn test:all` green. +- [ ] 6.2 Playwright e2e: welcome tour across pages, reload resumes saved step, dismiss is remembered, Reset all replays. +- [ ] 6.3 Manual check in light and dark theme, keyboard-only navigation, screen reader announces step title. From eddaaaf6b6862ffab881d6a98bfcc10e61db6184 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:16:21 +0200 Subject: [PATCH 03/28] Add guided tour plugin for the new frontend system Two new packages: - plugins/guided-tour-react: the contract other plugins depend on (GuidedTourBlueprint, guidedTourApiRef, useGuidedTour, target helpers, minimal markdown renderer built on Backstage UI). - plugins/guided-tour: api:guided-tour (registry, runner, per-user progress in the storage api), the app root overlay (spotlight mask, Backstage UI popover anchored with react-aria, route and click-through steps) and the /guided-tours page. App wiring: welcome tour on first login, sidebar entry, data-guided-tour ids on sidebar items. The example plugin ships its own tour that starts on the first visit of /example and depends only on the react library. Verified with unit tests, a Playwright e2e spec and screenshots. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../changes/guided-tour-plugin/design.md | 25 +- .../specs/guided-tour/spec.md | 5 + .../changes/guided-tour-plugin/tasks.md | 54 +- .../plugins/guided-tour-react/.eslintrc.js | 1 + .../plugins/guided-tour-react/README.md | 57 + .../plugins/guided-tour-react/package.json | 49 + .../plugins/guided-tour-react/src/api.ts | 118 + .../guided-tour-react/src/blueprint.test.ts | 44 + .../guided-tour-react/src/blueprint.ts | 64 + .../src/components/GuidedTourTarget.tsx | 47 + .../src/components/MarkdownText.test.tsx | 63 + .../src/components/MarkdownText.tsx | 188 + .../src/hooks/useGuidedTour.ts | 68 + .../plugins/guided-tour-react/src/index.ts | 22 + .../guided-tour-react/src/setupTests.ts | 16 + .../plugins/guided-tour-react/src/types.ts | 118 + .../plugins/guided-tour/.eslintrc.js | 1 + .../plugins/guided-tour/README.md | 39 + .../plugins/guided-tour/dev/index.tsx | 126 + .../plugins/guided-tour/package.json | 55 + .../src/api/DefaultGuidedTourApi.test.ts | 188 + .../src/api/DefaultGuidedTourApi.ts | 260 + .../guided-tour/src/api/progressStore.ts | 165 + .../src/components/overlay/ActiveStep.tsx | 161 + .../components/overlay/GuidedTourOverlay.tsx | 116 + .../src/components/overlay/Spotlight.tsx | 97 + .../src/components/overlay/StepCard.tsx | 103 + .../overlay/useGuidedTourSnapshot.ts | 26 + .../components/overlay/useTargetElement.ts | 155 + .../src/components/page/GuidedToursPage.tsx | 179 + .../plugins/guided-tour/src/extensions/api.ts | 52 + .../guided-tour/src/extensions/overlay.tsx | 25 + .../guided-tour/src/extensions/page.tsx | 31 + .../plugins/guided-tour/src/index.ts | 17 + .../plugins/guided-tour/src/plugin.test.ts | 22 + .../plugins/guided-tour/src/plugin.ts | 35 + .../plugins/guided-tour/src/routes.ts | 18 + .../plugins/guided-tour/src/setupTests.ts | 16 + .../plugins/guided-tour/src/translation.ts | 56 + workspaces/guided-tours/yarn.lock | 5055 ++++++++++++++++- 40 files changed, 7732 insertions(+), 205 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/README.md create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/package.json create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/api.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/index.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/types.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/.eslintrc.js create mode 100644 workspaces/guided-tours/plugins/guided-tour/README.md create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/index.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/package.json create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/index.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/plugin.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/routes.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/translation.ts diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md index 5eb149d26a5..db70329140c 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md @@ -147,13 +147,17 @@ export interface GuidedTourApi { getTours(): GuidedTour[]; // global ordered list getTour(id: string): GuidedTour | undefined; start(id: string, opts?: { force?: boolean; stepId?: string }): void; // force ignores saved progress + startQueue(ids: string[], opts?: { onboarding?: boolean }): void; // first starts, rest queued next(): void; previous(): void; dismiss(): void; complete(): void; - state$(): Observable; - progress$(): Observable>; - resetProgress(id?: string): Promise; // undefined = all + isAutoStartEnabled(): boolean; + getSnapshot(): GuidedTourSnapshot; // { ready, onboarded, state, progress }, immutable + subscribe(listener: () => void): () => void; // for useSyncExternalStore + getProgress(id: string): GuidedTourProgress | undefined; // undefined when version differs + resetProgress(id?: string): Promise; // undefined = all + onboarded flag + markOnboarded(): Promise; } export const guidedTourApiRef = createApiRef({ id: 'plugin.guided-tour.api', @@ -167,6 +171,10 @@ export function useGuidedTour(id: string): { }; ``` +The API exposes a snapshot plus `subscribe` instead of Observables so that +React consumers use `useSyncExternalStore` directly and tests need no +observable helpers. + Why the API and not the overlay owns the registry: tours must be queryable by the page, by `useGuidedTour`, and by the overlay. `api:guided-tour` is the single attachment point, created with @@ -229,6 +237,10 @@ seen". navigation, they do not interrupt. 7. Manual: `useGuidedTour(id).start()` or the page. `start` while a tour runs replaces it (the replaced tour is saved as `in-progress`). +8. Resume: before 4–6, a tour saved as `in-progress` resumes at its step, + but only when that step has no `route` or its route matches the current + page. A deep link is never redirected; the tours page shows "Continue" + for such a tour instead. ### Steps, targets and cross-page flows @@ -258,8 +270,11 @@ portal so the card is always on top. Colors come from BUI tokens Step card = BUI `Popover` (`triggerRef={{ current: targetElement }}`, `isNonModal`, `isOpen`, `placement`, `shouldFlip`) wrapping a -`react-aria-components` `Dialog` for `role="dialog"`, `aria-labelledby`, -focus containment and Esc handling. Contents: `Text` title, `MarkdownText` +`react-aria-components` `Dialog` for `role="dialog"` and focus handling. +Escape is handled by the overlay itself with a capturing `keydown` +listener; the popover's `onOpenChange` is deliberately ignored because +react-aria also reports "closed" when focus leaves the popover, which +happens for a moment on every step change. Contents: `Text` title, `MarkdownText` body, footer `Flex` with step counter `n / total`, `Button variant="secondary"` Previous (disabled on first step), `Button variant="primary"` Next / Done, and a `ButtonIcon` close in the header. Steps without a target reuse the same diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md index 6deb23a5ce7..66dd0bc1043 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md @@ -63,6 +63,11 @@ The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each - **WHEN** the user presses Next and then reloads the page - **THEN** the tour resumes at the saved step +#### Scenario: Deep link while a tour is in progress + +- **WHEN** a tour is saved as `in-progress` at a step with `route: '/'` and the user opens `/guided-tours` directly +- **THEN** the user stays on `/guided-tours`, no tour starts, and the tour's row offers Continue + #### Scenario: Dismiss is remembered - **WHEN** the user closes a tour diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md index 9ee8bfd2040..237d850911f 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md @@ -2,45 +2,45 @@ ## 1. `plugins/guided-tour-react` (web library) -- [ ] 1.1 Scaffold `@internal/backstage-plugin-guided-tour-react` with `backstage-cli new` (role `web-library`); deps: `@backstage/frontend-plugin-api`, `@backstage/ui`, `marked`, `@braintree/sanitize-url`; peer `react`, `react-router-dom`. -- [ ] 1.2 Add `types.ts` (`GuidedTour`, `GuidedTourStep`, `GuidedTourAutoStart`) and `api.ts` (`GuidedTourApi`, `GuidedTourProgress`, `GuidedTourRunnerState`, `guidedTourApiRef`). -- [ ] 1.3 Add `guidedTourDataRef` and `GuidedTourBlueprint` (kind `guided-tour`, attachTo `api:guided-tour` / `tours`, id derived from node id). -- [ ] 1.4 Add `useGuidedTour(id)` hook using `useApiHolder()` so it is a no-op without the plugin. -- [ ] 1.5 Add `MarkdownText` (marked `Lexer` → BUI `Text`/`Link`/lists/code, sanitized links) with tests. -- [ ] 1.6 Add `GuidedTourTarget` helper (`data-guided-tour` attribute) and `guidedTourTargetProps(id)`. -- [ ] 1.7 Export everything from `index.ts`, write `README.md` with the "ship a tour from your plugin" recipe, run `yarn tsc && yarn lint && yarn test` for the package. +- [x] 1.1 Scaffold `@internal/backstage-plugin-guided-tour-react` with `backstage-cli new` (role `web-library`); deps: `@backstage/frontend-plugin-api`, `@backstage/ui`, `marked`, `@braintree/sanitize-url`; peer `react`, `react-router-dom`. +- [x] 1.2 Add `types.ts` (`GuidedTour`, `GuidedTourStep`, `GuidedTourAutoStart`) and `api.ts` (`GuidedTourApi`, `GuidedTourProgress`, `GuidedTourRunnerState`, `guidedTourApiRef`). +- [x] 1.3 Add `guidedTourDataRef` and `GuidedTourBlueprint` (kind `guided-tour`, attachTo `api:guided-tour` / `tours`, id derived from node id). +- [x] 1.4 Add `useGuidedTour(id)` hook using `useApiHolder()` so it is a no-op without the plugin. +- [x] 1.5 Add `MarkdownText` (marked `Lexer` → BUI `Text`/`Link`/lists/code, sanitized links) with tests. +- [x] 1.6 Add `GuidedTourTarget` helper (`data-guided-tour` attribute) and `guidedTourTargetProps(id)`. +- [x] 1.7 Export everything from `index.ts`, write `README.md` with the "ship a tour from your plugin" recipe, run `yarn tsc && yarn lint && yarn test` for the package. ## 2. `plugins/guided-tour` core -- [ ] 2.1 Scaffold `@internal/backstage-plugin-guided-tour` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. -- [ ] 2.2 Implement `progressStore.ts` over `storageApiRef.forBucket('guided-tour')` (per-tour keys, `onboarded`, serialized writes, `observe$`). -- [ ] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `state$`, `progress$`, `resetProgress`), with table-driven unit tests using `MockStorageApi`. -- [ ] 2.4 Add `api:guided-tour` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. -- [ ] 2.5 Add `translation.ts` with all user-facing strings. +- [x] 2.1 Scaffold `@internal/backstage-plugin-guided-tour` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. +- [x] 2.2 Implement `progressStore.ts` over `storageApiRef.forBucket('guided-tour')` (per-tour keys, `onboarded`, serialized writes, `observe$`). +- [x] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `state$`, `progress$`, `resetProgress`), with table-driven unit tests using `MockStorageApi`. +- [x] 2.4 Add `api:guided-tour` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. +- [x] 2.5 Add `translation.ts` with all user-facing strings. ## 3. Overlay (app root element) -- [ ] 3.1 `useTargetElement` (selector resolution, MutationObserver, timeout, rect tracking) with jsdom tests. -- [ ] 3.2 `Spotlight` SVG mask with evenodd hole, pointer-events rules for `advanceOn: 'click'`. -- [ ] 3.3 `StepPopover` on BUI `Popover` + react-aria `Dialog` (title, `MarkdownText`, counter, Previous / Next / Done / close, Esc = dismiss, keyboard focus). Centered BUI `Dialog` variant for target-less steps. -- [ ] 3.4 `GuidedTourOverlay`: identity gate, storage-ready gate, login queue and `onboarded` logic, route-triggered tours, `step.route` navigation, click-to-advance wiring, no render when idle. -- [ ] 3.5 Register `app-root-element:guided-tour/overlay` with `AppRootElementBlueprint`; render tests via `renderInTestApp`. +- [x] 3.1 `useTargetElement` (selector resolution, MutationObserver, timeout, rect tracking) with jsdom tests. +- [x] 3.2 `Spotlight` SVG mask with evenodd hole, pointer-events rules for `advanceOn: 'click'`. +- [x] 3.3 `StepPopover` on BUI `Popover` + react-aria `Dialog` (title, `MarkdownText`, counter, Previous / Next / Done / close, Esc = dismiss, keyboard focus). Centered BUI `Dialog` variant for target-less steps. +- [x] 3.4 `GuidedTourOverlay`: identity gate, storage-ready gate, login queue and `onboarded` logic, route-triggered tours, `step.route` navigation, click-to-advance wiring, no render when idle. +- [x] 3.5 Register `app-root-element:guided-tour/overlay` with `AppRootElementBlueprint`; render tests via `renderInTestApp`. ## 4. Guided tours page -- [ ] 4.1 `GuidedToursPage` (BUI `Table`/`Card`, status `Badge`, Start / Restart, Reset all with confirm `Dialog`). -- [ ] 4.2 Register `page:guided-tour` (`/guided-tours`, title "Guided tours", icon) and `rootRouteRef`. -- [ ] 4.3 Dev app under `plugins/guided-tour/dev` with two demo tours (one route-triggered, one with a click step). +- [x] 4.1 `GuidedToursPage` (BUI `Table`/`Card`, status `Badge`, Start / Restart, Reset all with confirm `Dialog`). +- [x] 4.2 Register `page:guided-tour` (`/guided-tours`, title "Guided tours", icon) and `rootRouteRef`. +- [x] 4.3 Dev app under `plugins/guided-tour/dev` with two demo tours (one route-triggered, one with a click step). ## 5. App wiring and demo tours -- [ ] 5.1 Add both packages to `packages/app/package.json`; add `nav.take('page:guided-tour')` to the Settings group in `Sidebar.tsx`; add `data-guided-tour` ids to sidebar items via `nav.withComponent`. -- [ ] 5.2 Add `packages/app/src/modules/guided-tour` with the `app/welcome` login tour (sidebar → `/catalog` → create button → `/settings`) and register it in `App.tsx`. -- [ ] 5.3 Add `guided-tour:example/intro` to `plugins/example` (route `/example`, one `advanceOn: 'click'` step), depending only on the `-react` package; mark targets in `TodoPage`. -- [ ] 5.4 Document `app.extensions` toggles and `autoStart: false` in `app-config.yaml` comments and `plugins/guided-tour/README.md`. +- [x] 5.1 Add both packages to `packages/app/package.json`; add `nav.take('page:guided-tour')` to the Settings group in `Sidebar.tsx`; add `data-guided-tour` ids to sidebar items via `nav.withComponent`. +- [x] 5.2 Add `packages/app/src/modules/guided-tour` with the `app/welcome` login tour (sidebar → `/catalog` → create button → `/settings`) and register it in `App.tsx`. +- [x] 5.3 Add `guided-tour:example/intro` to `plugins/example` (route `/example`, one `advanceOn: 'click'` step), depending only on the `-react` package; mark targets in `TodoPage`. +- [x] 5.4 Document `app.extensions` toggles and `autoStart: false` in `app-config.yaml` comments and `plugins/guided-tour/README.md`. ## 6. Verification -- [ ] 6.1 `yarn tsc`, `yarn lint:all`, `yarn prettier:check`, `yarn test:all` green. -- [ ] 6.2 Playwright e2e: welcome tour across pages, reload resumes saved step, dismiss is remembered, Reset all replays. -- [ ] 6.3 Manual check in light and dark theme, keyboard-only navigation, screen reader announces step title. +- [x] 6.1 `yarn tsc`, `yarn lint:all`, `yarn prettier:check`, `yarn test:all` green. +- [x] 6.2 Playwright e2e: welcome tour across pages, reload resumes saved step, dismiss is remembered, Reset all replays. +- [ ] 6.3 Manual check in light and dark theme, keyboard-only navigation, screen reader announces step title. _Done so far: light theme via Playwright screenshots, Escape and button focus via e2e; dark theme and screen reader not yet checked._ diff --git a/workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js b/workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js new file mode 100644 index 00000000000..e2a53a6ad28 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/README.md b/workspaces/guided-tours/plugins/guided-tour-react/README.md new file mode 100644 index 00000000000..bd94507cdc7 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/README.md @@ -0,0 +1,57 @@ +# @internal/backstage-plugin-guided-tour-react + +Ship a guided tour from any Backstage frontend plugin (new frontend system). +This package only holds the contract: the `GuidedTourBlueprint`, the +`guidedTourApiRef`, the `useGuidedTour` hook and a tiny markdown renderer. +The engine lives in `@internal/backstage-plugin-guided-tour`; when that +plugin is not installed, your tour extension stays unattached and nothing +breaks. + +## Ship a tour + +```ts +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +export const introTour = GuidedTourBlueprint.make({ + name: 'intro', + params: { + title: 'Welcome to Example', + description: 'A two minute walk through the example plugin.', + autoStart: { route: '/example' }, // first visit of /example + steps: [ + { + id: 'todos', + target: 'example.todos', + content: 'These are your **todos**.', + }, + { + id: 'go', + target: 'example.catalog-link', + advanceOn: 'click', + content: 'Click here to continue.', + }, + { + id: 'done', + content: 'Done! Open [all tours](/guided-tours) any time.', + }, + ], + }, +}); +``` + +Add it to your plugin's `extensions` and mark the targets in your UI: + +```tsx +
...
+``` + +## Start a tour from code + +```tsx +const { available, start } = useGuidedTour('example/intro'); +{ + available && ( + + ); +} +``` diff --git a/workspaces/guided-tours/plugins/guided-tour-react/package.json b/workspaces/guided-tours/plugins/guided-tour-react/package.json new file mode 100644 index 00000000000..b9cf9424eb3 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/package.json @@ -0,0 +1,49 @@ +{ + "name": "@internal/backstage-plugin-guided-tour-react", + "version": "0.1.0", + "license": "UNLICENSED", + "private": true, + "description": "Web library for shipping guided tours from any Backstage frontend plugin", + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "web-library", + "pluginId": "guided-tour" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/frontend-plugin-api": "^0.18.0", + "@backstage/ui": "^0.17.1", + "@braintree/sanitize-url": "^7.1.2", + "marked": "^15.0.12" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "devDependencies": { + "@backstage/cli": "^0.36.5", + "@backstage/frontend-test-utils": "^0.6.3", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "files": [ + "dist" + ] +} diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts new file mode 100644 index 00000000000..e59bfe0a387 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts @@ -0,0 +1,118 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createApiRef } from '@backstage/frontend-plugin-api'; +import { GuidedTour } from './types'; + +/** + * Saved progress of one tour for the current user. + * + * @public + */ +export interface GuidedTourProgress { + status: 'in-progress' | 'completed' | 'dismissed'; + stepIndex: number; + version: number; + updatedAt: string; +} + +/** + * The currently running tour, if any, and the tours queued after it. + * + * @public + */ +export interface GuidedTourRunnerState { + activeTourId?: string; + stepIndex: number; + queue: string[]; +} + +/** + * Immutable snapshot of everything the guided tour API knows. A new object + * is produced on every change, which makes it suitable for + * `useSyncExternalStore`. + * + * @public + */ +export interface GuidedTourSnapshot { + /** True once the per-user progress has been loaded from storage. */ + ready: boolean; + /** True once the user has gone through (or dismissed) the login sequence. */ + onboarded: boolean; + state: GuidedTourRunnerState; + progress: Record; +} + +/** + * Options for {@link GuidedTourApi.start}. + * + * @public + */ +export interface GuidedTourStartOptions { + /** Ignore saved progress and start at the first step (or `stepId`). */ + force?: boolean; + /** Start at this step instead of the first or the saved one. */ + stepId?: string; +} + +/** + * The guided tour API: the global tour registry, the runner and the + * per-user progress store. + * + * @public + */ +export interface GuidedTourApi { + /** All registered tours, ordered by `order` then title. */ + getTours(): GuidedTour[]; + getTour(id: string): GuidedTour | undefined; + + /** + * Starts a tour. Without `force`, a dismissed or completed tour of the + * same version is not started and an in-progress tour resumes at its + * saved step. Any running tour is replaced. + */ + start(id: string, options?: GuidedTourStartOptions): void; + /** Starts the first tour of the list and queues the rest. */ + startQueue(ids: string[], options?: { onboarding?: boolean }): void; + next(): void; + previous(): void; + dismiss(): void; + complete(): void; + + /** Whether tours may start on their own (login and route triggers). */ + isAutoStartEnabled(): boolean; + getSnapshot(): GuidedTourSnapshot; + subscribe(listener: () => void): () => void; + + /** + * Returns the saved progress for a tour, or undefined when there is none + * or it belongs to an older version of the tour. + */ + getProgress(id: string): GuidedTourProgress | undefined; + /** Clears progress for one tour, or for all tours and the onboarded flag. */ + resetProgress(id?: string): Promise; + /** Marks the login sequence as handled for this user. */ + markOnboarded(): Promise; +} + +/** + * API ref for the guided tour API. Resolve it with `useApiHolder()` when the + * guided tour plugin may not be installed. + * + * @public + */ +export const guidedTourApiRef = createApiRef({ + id: 'plugin.guided-tour.api', +}); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts new file mode 100644 index 00000000000..bb8099da58c --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createExtensionTester } from '@backstage/frontend-test-utils'; +import { GuidedTourBlueprint, guidedTourDataRef } from './blueprint'; + +describe('GuidedTourBlueprint', () => { + it('derives the tour id from the extension id', () => { + const tour = GuidedTourBlueprint.make({ + name: 'intro', + params: { + title: 'Intro', + steps: [{ id: 'a', content: 'hi' }], + }, + }); + const tester = createExtensionTester(tour); + expect(tester.get(guidedTourDataRef)).toMatchObject({ + id: 'intro', + title: 'Intro', + }); + }); + + it('keeps an explicit id', () => { + const tour = GuidedTourBlueprint.make({ + name: 'intro', + params: { id: 'custom', title: 'Intro', steps: [] }, + }); + expect(createExtensionTester(tour).get(guidedTourDataRef).id).toBe( + 'custom', + ); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts new file mode 100644 index 00000000000..dcab15e6ee1 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts @@ -0,0 +1,64 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createExtensionBlueprint, + createExtensionDataRef, +} from '@backstage/frontend-plugin-api'; +import { GuidedTour, GuidedTourParams } from './types'; + +/** + * Extension data carrying a guided tour definition. + * + * @public + */ +export const guidedTourDataRef = createExtensionDataRef().with({ + id: 'guided-tour.tour', +}); + +/** + * Creates a `guided-tour` extension that registers a tour with the guided + * tour plugin. When that plugin is not installed the extension stays + * unattached and nothing happens. + * + * @example + * ```ts + * const introTour = GuidedTourBlueprint.make({ + * name: 'intro', + * params: { + * title: 'Welcome to Example', + * autoStart: { route: '/example' }, + * steps: [{ id: 'todos', target: 'example.todos', content: 'Your **todos**.' }], + * }, + * }); + * ``` + * + * @public + */ +export const GuidedTourBlueprint = createExtensionBlueprint({ + kind: 'guided-tour', + attachTo: { id: 'api:guided-tour', input: 'tours' }, + output: [guidedTourDataRef], + dataRefs: { tour: guidedTourDataRef }, + factory(params: GuidedTourParams, { node }) { + const { id, ...rest } = params; + return [ + guidedTourDataRef({ + id: id ?? node.spec.id.replace(/^guided-tour:/, ''), + ...rest, + }), + ]; + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx b/workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx new file mode 100644 index 00000000000..82291392d4d --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx @@ -0,0 +1,47 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ReactNode } from 'react'; + +/** + * Returns the props that mark an element as a tour target, for spreading + * onto any element: `
`. + * + * @public + */ +export function guidedTourTargetProps(id: string): { + 'data-guided-tour': string; +} { + return { 'data-guided-tour': id }; +} + +/** + * Wraps children in a `span` marked as a tour target, for components that + * do not forward unknown props. + * + * @public + */ +export function GuidedTourTarget(props: { + id: string; + children: ReactNode; + as?: 'span' | 'div'; +}) { + const { id, children, as: Component = 'span' } = props; + return ( + + {children} + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx b/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx new file mode 100644 index 00000000000..3f503181b1e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx @@ -0,0 +1,63 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; +import { MarkdownText } from './MarkdownText'; + +const renderMd = (content: string) => + render( + + + , + ); + +describe('MarkdownText', () => { + it('renders inline formatting', () => { + const { container } = renderMd('Hello **bold** and _em_ and `code`.'); + expect(container.querySelector('strong')).toHaveTextContent('bold'); + expect(container.querySelector('em')).toHaveTextContent('em'); + expect(container.querySelector('code')).toHaveTextContent('code'); + }); + + it('renders lists and headings', () => { + const { container } = renderMd('## Title\n\n- one\n- two\n\n1. a\n2. b'); + expect(container.querySelector('h2')).toHaveTextContent('Title'); + expect(container.querySelectorAll('ul li')).toHaveLength(2); + expect(container.querySelectorAll('ol li')).toHaveLength(2); + }); + + it('renders links and drops unsafe ones', () => { + renderMd( + '[catalog](/catalog) [ext](https://example.com) [bad](javascript:alert(1))', + ); + expect(screen.getByRole('link', { name: 'catalog' })).toHaveAttribute( + 'href', + '/catalog', + ); + expect(screen.getByRole('link', { name: 'ext' })).toHaveAttribute( + 'target', + '_blank', + ); + expect(screen.queryByRole('link', { name: 'bad' })).toBeNull(); + expect(screen.getByText('bad')).toBeInTheDocument(); + }); + + it('shows html as text instead of injecting it', () => { + const { container } = renderMd('x y'); + expect(container.querySelector('img')).toBeNull(); + expect(container).toHaveTextContent(''); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx b/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx new file mode 100644 index 00000000000..94aabdbf7c3 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx @@ -0,0 +1,188 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Link, Text } from '@backstage/ui'; +import { sanitizeUrl } from '@braintree/sanitize-url'; +import { Lexer, Token, Tokens } from 'marked'; +import { Fragment, ReactNode, useMemo } from 'react'; + +/** + * Props for {@link MarkdownText}. + * + * @public + */ +export interface MarkdownTextProps { + content: string; + className?: string; +} + +const HEADING_VARIANTS = [ + 'title-medium', + 'title-small', + 'title-x-small', + 'title-x-small', + 'title-x-small', + 'title-x-small', +] as const; + +function renderInline(tokens: Token[] | undefined): ReactNode[] { + if (!tokens) return []; + return tokens.map((token, i) => { + switch (token.type) { + case 'strong': + return ( + + {renderInline((token as Tokens.Strong).tokens)} + + ); + case 'em': + return {renderInline((token as Tokens.Em).tokens)}; + case 'del': + return {renderInline((token as Tokens.Del).tokens)}; + case 'codespan': + return {(token as Tokens.Codespan).text}; + case 'br': + return
; + case 'link': { + const link = token as Tokens.Link; + const href = sanitizeUrl(link.href); + const children = renderInline(link.tokens); + if (href === 'about:blank') { + return {children}; + } + const external = /^[a-z][a-z0-9+.-]*:/i.test(href); + return ( + + {children} + + ); + } + case 'escape': + return {(token as Tokens.Escape).text}; + case 'text': { + const text = token as Tokens.Text; + return ( + + {text.tokens ? renderInline(text.tokens) : text.text} + + ); + } + default: + // html, image and anything else render as their literal source + return {token.raw}; + } + }); +} + +function renderBlocks(tokens: Token[]): ReactNode[] { + return tokens.map((token, i) => { + switch (token.type) { + case 'paragraph': + return ( + + {renderInline((token as Tokens.Paragraph).tokens)} + + ); + case 'heading': { + const heading = token as Tokens.Heading; + const depth = Math.min(Math.max(heading.depth, 1), 6); + return ( + + {renderInline(heading.tokens)} + + ); + } + case 'list': { + const list = token as Tokens.List; + const ListTag = list.ordered ? 'ol' : 'ul'; + return ( + + {list.items.map((item, j) => ( +
  • + {renderBlocksInline(item.tokens)} +
  • + ))} +
    + ); + } + case 'code': + return ( +
    +            {(token as Tokens.Code).text}
    +          
    + ); + case 'blockquote': + return ( +
    + {renderBlocks((token as Tokens.Blockquote).tokens)} +
    + ); + case 'text': + return ( + + {renderInline((token as Tokens.Text).tokens ?? [token])} + + ); + case 'space': + case 'hr': + return null; + default: + return ( + + {token.raw} + + ); + } + }); +} + +/** List items contain block tokens; render them without paragraph wrappers. */ +function renderBlocksInline(tokens: Token[]): ReactNode[] { + return tokens.map((token, i) => { + if (token.type === 'text' || token.type === 'paragraph') { + return ( + + {renderInline((token as Tokens.Text).tokens ?? [token])} + + ); + } + return {renderBlocks([token])}; + }); +} + +/** + * Renders minimal markdown with Backstage UI elements and no HTML + * injection. Supported: paragraphs, headings, bold, italic, inline code, + * links, bullet and numbered lists, code blocks. Raw HTML is shown as text. + * + * @public + */ +export function MarkdownText(props: MarkdownTextProps) { + const { content, className } = props; + const nodes = useMemo(() => renderBlocks(Lexer.lex(content)), [content]); + return
    {nodes}
    ; +} diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts new file mode 100644 index 00000000000..c5c74282c52 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts @@ -0,0 +1,68 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useApiHolder } from '@backstage/frontend-plugin-api'; +import { useCallback, useSyncExternalStore } from 'react'; +import { + GuidedTourProgress, + GuidedTourStartOptions, + guidedTourApiRef, +} from '../api'; + +/** + * Result of {@link useGuidedTour}. + * + * @public + */ +export interface UseGuidedTourResult { + /** False when the guided tour plugin is not installed or the tour is unknown. */ + available: boolean; + /** Whether this tour is currently running. */ + active: boolean; + /** Saved progress for the current user, if any. */ + progress?: GuidedTourProgress; + /** Starts the tour. A no-op when not available. */ + start(options?: GuidedTourStartOptions): void; +} + +const noop = () => {}; +const noopSubscribe = () => noop; + +/** + * Lets a plugin start or inspect one of its tours. Safe to use in plugins + * that do not depend on the guided tour plugin: everything becomes a no-op. + * + * @public + */ +export function useGuidedTour(id: string): UseGuidedTourResult { + const api = useApiHolder().get(guidedTourApiRef); + const snapshot = useSyncExternalStore( + api ? api.subscribe : noopSubscribe, + api ? api.getSnapshot : () => undefined, + api ? api.getSnapshot : () => undefined, + ); + + const start = useCallback( + (options?: GuidedTourStartOptions) => api?.start(id, options), + [api, id], + ); + + return { + available: !!api?.getTour(id), + active: snapshot?.state.activeTourId === id, + progress: api?.getProgress(id), + start, + }; +} diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts new file mode 100644 index 00000000000..d8d9aeaa60a --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './types'; +export * from './api'; +export * from './blueprint'; +export * from './hooks/useGuidedTour'; +export * from './components/GuidedTourTarget'; +export * from './components/MarkdownText'; diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts new file mode 100644 index 00000000000..5f11bab1c2c --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts new file mode 100644 index 00000000000..f10ad016713 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts @@ -0,0 +1,118 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type GuidedTourPlacement = + | 'top' + | 'bottom' + | 'left' + | 'right' + | 'start' + | 'end'; + +/** + * A single step of a guided tour. + * + * @public + */ +export interface GuidedTourStep { + /** Unique id of the step inside its tour. */ + id: string; + /** Optional title shown above the content. */ + title?: string; + /** + * Content shown in the step card. Supports minimal markdown: paragraphs, + * bold, italic, inline code, links, bullet and numbered lists. + */ + content: string; + /** + * Element to spotlight. A bare id is resolved to + * `[data-guided-tour=""]`; use `{ selector }` for an arbitrary CSS + * selector. Omit to show the step centered without a spotlight. + */ + target?: string | { selector: string }; + /** Where to place the card relative to the target. Default `bottom`. */ + placement?: GuidedTourPlacement; + /** App-relative path to navigate to before the step is shown. */ + route?: string; + /** + * `next` (default): the Next button advances the tour. + * `click`: clicking the highlighted element advances the tour and the + * click is passed through to the element. + */ + advanceOn?: 'next' | 'click'; + /** How long to wait for the target to appear. Default 5000 ms. */ + targetTimeoutMs?: number; + /** + * What to do when the target never appears: show the step centered + * (`center`, default) or skip it (`skip`). + */ + onMissingTarget?: 'center' | 'skip'; +} + +/** + * When a tour starts on its own. + * + * - `false`: manual only (default). + * - `'login'`: part of the onboarding sequence; a login tour that shows up + * after the user has been onboarded is played alone. + * - `{ route }`: the first time the current location matches the path. + * + * @public + */ +export type GuidedTourAutoStart = false | 'login' | { route: string }; + +/** + * A guided tour: an ordered list of steps plus metadata. + * + * @public + */ +export interface GuidedTour { + /** Unique id, e.g. `example/intro`. */ + id: string; + title: string; + description?: string; + /** + * Bump to show the tour again to users who completed or dismissed an + * older version. Default 1. + */ + version?: number; + /** Ordering in the onboarding queue and on the overview page. Default 100. */ + order?: number; + autoStart?: GuidedTourAutoStart; + steps: GuidedTourStep[]; +} + +/** + * Params accepted by {@link GuidedTourBlueprint}. The id defaults to the + * extension id without the `guided-tour:` prefix. + * + * @public + */ +export type GuidedTourParams = Omit & { id?: string }; + +/** + * Resolves a step target into a CSS selector. + * + * @public + */ +export function guidedTourTargetSelector( + target: NonNullable, +): string { + if (typeof target === 'string') { + return `[data-guided-tour="${target.replace(/"/g, '\\"')}"]`; + } + return target.selector; +} diff --git a/workspaces/guided-tours/plugins/guided-tour/.eslintrc.js b/workspaces/guided-tours/plugins/guided-tour/.eslintrc.js new file mode 100644 index 00000000000..e2a53a6ad28 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/workspaces/guided-tours/plugins/guided-tour/README.md b/workspaces/guided-tours/plugins/guided-tour/README.md new file mode 100644 index 00000000000..3ad485cdc48 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/README.md @@ -0,0 +1,39 @@ +# @internal/backstage-plugin-guided-tour + +Guided tours for the Backstage new frontend system: spotlight steps with +markdown, per-user progress in user settings, auto-start on login or on the +first visit of a route, and an overview page at `/guided-tours`. + +Install the package in `packages/app` (it is discovered through +`app.packages: all`) and add the page to your sidebar: + +```tsx +{ + nav.take('page:guided-tour'); +} +``` + +Ship tours from any plugin with `@internal/backstage-plugin-guided-tour-react`, +see its README. + +## Configuration + +```yaml +app: + extensions: + - guided-tour:example/intro: false # disable a single tour + - api:guided-tour: + config: + autoStart: false # never start tours on their own +``` + +## Extensions + +| Extension | Purpose | +| -------------------------------------- | --------------------------------------------------- | +| `api:guided-tour` | Registry (`tours` input), runner and progress store | +| `app-root-element:guided-tour/overlay` | Spotlight and step card | +| `page:guided-tour` | Overview page at `/guided-tours` | + +Progress is stored in the `guided-tour` bucket of the `storageApi`, one key +per tour plus an `onboarded` flag. diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx new file mode 100644 index 00000000000..862c7ee007e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -0,0 +1,126 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createDevApp } from '@backstage/frontend-dev-utils'; +import { + createFrontendModule, + PageBlueprint, +} from '@backstage/frontend-plugin-api'; +import { Button, Container, Flex, Header, Text } from '@backstage/ui'; +import { + GuidedTourBlueprint, + useGuidedTour, +} from '@internal/backstage-plugin-guided-tour-react'; +import { Link } from 'react-router-dom'; +import plugin from '../src'; + +const DemoPage = () => { + const replay = useGuidedTour('guided-tour/demo-login'); + return ( + <> +
    + + + + This paragraph is the first target. + + + Click me to continue the tour on the next page + + + + + + ); +}; + +const SecondPage = () => ( + <> +
    + + + You arrived on the second page. + + + +); + +const demoModule = createFrontendModule({ + pluginId: 'guided-tour', + extensions: [ + PageBlueprint.make({ + name: 'demo', + params: { path: '/', title: 'Demo', loader: async () => }, + }), + PageBlueprint.make({ + name: 'second', + params: { + path: '/second', + title: 'Second', + loader: async () => , + }, + }), + GuidedTourBlueprint.make({ + name: 'demo-login', + params: { + title: 'Welcome to the demo', + description: 'Starts on login and crosses pages.', + autoStart: 'login', + order: 1, + steps: [ + { + id: 'intro', + target: 'demo.intro', + content: 'This is the **first** target.', + }, + { + id: 'link', + target: 'demo.link', + advanceOn: 'click', + content: 'Click this link to continue on the next page.', + }, + { + id: 'second', + target: 'second.text', + content: 'You made it across pages!', + }, + { + id: 'done', + content: 'Done. Replay it from [Guided tours](/guided-tours).', + }, + ], + }, + }), + GuidedTourBlueprint.make({ + name: 'demo-route', + params: { + title: 'Second page tour', + autoStart: { route: '/second' }, + steps: [ + { + id: 'text', + target: 'second.text', + placement: 'top', + content: 'Starts on first visit of `/second`.', + }, + ], + }, + }), + ], +}); + +createDevApp({ features: [plugin, demoModule] }); diff --git a/workspaces/guided-tours/plugins/guided-tour/package.json b/workspaces/guided-tours/plugins/guided-tour/package.json new file mode 100644 index 00000000000..58ff5c19bf1 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/package.json @@ -0,0 +1,55 @@ +{ + "name": "@internal/backstage-plugin-guided-tour", + "version": "0.1.0", + "license": "UNLICENSED", + "private": true, + "description": "Guided tours for Backstage: spotlight steps, per-user progress, auto-start on login or route", + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin", + "pluginId": "guided-tour" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/frontend-plugin-api": "^0.18.0", + "@backstage/types": "^1.2.2", + "@backstage/ui": "^0.17.1", + "@internal/backstage-plugin-guided-tour-react": "workspace:^", + "@remixicon/react": "^4.6.0", + "react-aria-components": "~1.17.0", + "zod": "^4.0.0" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "devDependencies": { + "@backstage/cli": "^0.36.5", + "@backstage/frontend-defaults": "^0.5.5", + "@backstage/frontend-dev-utils": "^0.1.5", + "@backstage/frontend-test-utils": "^0.6.3", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "files": [ + "dist" + ] +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts new file mode 100644 index 00000000000..bc2ae42e2b3 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts @@ -0,0 +1,188 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { mockApis } from '@backstage/frontend-test-utils'; +import { GuidedTour } from '@internal/backstage-plugin-guided-tour-react'; +import { DefaultGuidedTourApi, selectLoginTours } from './DefaultGuidedTourApi'; + +const tour = (id: string, extra: Partial = {}): GuidedTour => ({ + id, + title: id, + steps: [ + { id: 's1', content: 'one' }, + { id: 's2', content: 'two' }, + { id: 's3', content: 'three' }, + ], + ...extra, +}); + +const flush = () => new Promise(r => setTimeout(r, 0)); + +describe('DefaultGuidedTourApi', () => { + it('becomes ready once storage reported every key', () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a')], + storageApi: mockApis.storage(), + }); + expect(api.getSnapshot().ready).toBe(true); + expect(api.getSnapshot().onboarded).toBe(false); + }); + + it('sorts tours by order then title', () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('b'), tour('c', { order: 1 }), tour('a')], + storageApi: mockApis.storage(), + }); + expect(api.getTours().map(t => t.id)).toEqual(['c', 'a', 'b']); + }); + + it('walks through steps and saves progress on every move', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a')], + storageApi: mockApis.storage(), + }); + api.start('a'); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'a', + stepIndex: 0, + }); + api.next(); + expect(api.getProgress('a')).toMatchObject({ + status: 'in-progress', + stepIndex: 1, + }); + api.previous(); + expect(api.getSnapshot().state.stepIndex).toBe(0); + api.next(); + api.next(); + api.next(); // last step -> complete + await flush(); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + expect(api.getProgress('a')).toMatchObject({ status: 'completed' }); + }); + + it('resumes an in-progress tour and refuses a dismissed one unless forced', () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a')], + storageApi: mockApis.storage(), + }); + api.start('a'); + api.next(); + api.start('b'); // unknown, ignored + api.start('a'); + expect(api.getSnapshot().state.stepIndex).toBe(1); + api.dismiss(); + expect(api.getProgress('a')).toMatchObject({ status: 'dismissed' }); + api.start('a'); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + api.start('a', { force: true }); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'a', + stepIndex: 0, + }); + }); + + it('ignores progress of an older tour version', () => { + const storageApi = mockApis.storage(); + const api1 = new DefaultGuidedTourApi({ tours: [tour('a')], storageApi }); + api1.start('a'); + api1.dismiss(); + const api2 = new DefaultGuidedTourApi({ + tours: [tour('a', { version: 2 })], + storageApi, + }); + expect(api2.getProgress('a')).toBeUndefined(); + }); + + it('plays a queue and marks onboarded at the end', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a'), tour('b')], + storageApi: mockApis.storage(), + }); + api.startQueue(['a', 'b'], { onboarding: true }); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'a', + queue: ['b'], + }); + api.next(); + api.next(); + api.next(); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'b', + queue: [], + }); + expect(api.getSnapshot().onboarded).toBe(false); + api.dismiss(); + await flush(); + expect(api.getSnapshot().onboarded).toBe(true); + expect(api.getProgress('a')).toMatchObject({ status: 'completed' }); + expect(api.getProgress('b')).toMatchObject({ status: 'dismissed' }); + }); + + it('resets all progress including the onboarded flag', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a')], + storageApi: mockApis.storage(), + }); + api.startQueue(['a'], { onboarding: true }); + api.dismiss(); + await flush(); + expect(api.getSnapshot().onboarded).toBe(true); + await api.resetProgress(); + expect(api.getSnapshot().onboarded).toBe(false); + expect(api.getProgress('a')).toBeUndefined(); + }); +}); + +describe('selectLoginTours', () => { + const tours = [ + tour('manual'), + tour('login-b', { autoStart: 'login', order: 2 }), + tour('login-a', { autoStart: 'login', order: 1 }), + tour('route', { autoStart: { route: '/x' } }), + ]; + const progress = (id: string, status: 'completed' | 'dismissed') => ({ + [id]: { status, stepIndex: 0, version: 1, updatedAt: '' }, + }); + + it('queues all login tours on first login', () => { + expect(selectLoginTours({ tours, progress: {}, onboarded: false })).toEqual( + ['login-a', 'login-b'], + ); + }); + + it('only returns tours new to an onboarded user', () => { + expect( + selectLoginTours({ + tours, + progress: { ...progress('login-a', 'completed') }, + onboarded: true, + }), + ).toEqual(['login-b']); + }); + + it('returns nothing when everything was seen', () => { + expect( + selectLoginTours({ + tours, + progress: { + ...progress('login-a', 'completed'), + ...progress('login-b', 'dismissed'), + }, + onboarded: true, + }), + ).toEqual([]); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts new file mode 100644 index 00000000000..744801ae70e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts @@ -0,0 +1,260 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { StorageApi } from '@backstage/frontend-plugin-api'; +import { + GuidedTour, + GuidedTourApi, + GuidedTourProgress, + GuidedTourRunnerState, + GuidedTourSnapshot, + GuidedTourStartOptions, +} from '@internal/backstage-plugin-guided-tour-react'; +import { ProgressStore } from './progressStore'; + +const IDLE: GuidedTourRunnerState = { stepIndex: 0, queue: [] }; + +export function sortTours(tours: GuidedTour[]): GuidedTour[] { + return [...tours].sort( + (a, b) => + (a.order ?? 100) - (b.order ?? 100) || a.title.localeCompare(b.title), + ); +} + +/** Progress is only valid for the tour version it was written for. */ +export function effectiveProgress( + tour: GuidedTour, + progress: Record, +): GuidedTourProgress | undefined { + const saved = progress[tour.id]; + if (!saved || saved.version !== (tour.version ?? 1)) { + return undefined; + } + return saved; +} + +/** + * Picks the login tours to play now. Before onboarding every login tour + * without progress is queued; afterwards only tours that are new to the + * user (no progress entry at all for the current version). + */ +export function selectLoginTours(options: { + tours: GuidedTour[]; + progress: Record; + onboarded: boolean; +}): string[] { + return sortTours(options.tours) + .filter(t => t.autoStart === 'login') + .filter(t => effectiveProgress(t, options.progress) === undefined) + .map(t => t.id); +} + +export class DefaultGuidedTourApi implements GuidedTourApi { + private readonly tours: GuidedTour[]; + private readonly store: ProgressStore; + private readonly autoStart: boolean; + private readonly listeners = new Set<() => void>(); + private state: GuidedTourRunnerState = IDLE; + private onboardingRun = false; + private snapshot: GuidedTourSnapshot; + + constructor(options: { + tours: GuidedTour[]; + storageApi: StorageApi; + autoStart?: boolean; + }) { + this.tours = sortTours(options.tours); + this.autoStart = options.autoStart ?? true; + this.store = new ProgressStore({ + storage: options.storageApi, + tourIds: this.tours.map(t => t.id), + }); + this.snapshot = this.buildSnapshot(); + this.store.subscribe(() => this.emit()); + } + + getTours(): GuidedTour[] { + return this.tours; + } + + getTour(id: string): GuidedTour | undefined { + return this.tours.find(t => t.id === id); + } + + isAutoStartEnabled(): boolean { + return this.autoStart; + } + + getSnapshot = (): GuidedTourSnapshot => this.snapshot; + + subscribe = (listener: () => void): (() => void) => { + this.listeners.add(listener); + return () => { + this.listeners.delete(listener); + }; + }; + + getProgress(id: string): GuidedTourProgress | undefined { + const tour = this.getTour(id); + return tour + ? effectiveProgress(tour, this.store.getSnapshot().progress) + : undefined; + } + + start(id: string, options: GuidedTourStartOptions = {}): void { + const tour = this.getTour(id); + if (!tour || tour.steps.length === 0) { + return; + } + const saved = this.getProgress(id); + let stepIndex = 0; + if (options.stepId) { + stepIndex = Math.max( + 0, + tour.steps.findIndex(s => s.id === options.stepId), + ); + } else if (!options.force && saved) { + if (saved.status !== 'in-progress') { + return; + } + stepIndex = Math.min(saved.stepIndex, tour.steps.length - 1); + } + if (this.state.activeTourId && this.state.activeTourId !== id) { + this.save(this.state.activeTourId, 'in-progress', this.state.stepIndex); + } + this.onboardingRun = false; + this.setState({ activeTourId: id, stepIndex, queue: [] }); + this.save(id, 'in-progress', stepIndex); + } + + startQueue(ids: string[], options: { onboarding?: boolean } = {}): void { + const [first, ...rest] = ids.filter(id => this.getTour(id)); + if (!first) { + if (options.onboarding) { + this.markOnboarded(); + } + return; + } + this.start(first, { force: true }); + this.onboardingRun = !!options.onboarding; + this.setState({ ...this.state, queue: rest }); + } + + next(): void { + const tour = this.activeTour(); + if (!tour) return; + if (this.state.stepIndex >= tour.steps.length - 1) { + this.complete(); + return; + } + const stepIndex = this.state.stepIndex + 1; + this.setState({ ...this.state, stepIndex }); + this.save(tour.id, 'in-progress', stepIndex); + } + + previous(): void { + const tour = this.activeTour(); + if (!tour || this.state.stepIndex === 0) return; + const stepIndex = this.state.stepIndex - 1; + this.setState({ ...this.state, stepIndex }); + this.save(tour.id, 'in-progress', stepIndex); + } + + dismiss(): void { + const tour = this.activeTour(); + if (!tour) return; + this.save(tour.id, 'dismissed', this.state.stepIndex); + // Dismissing ends the whole sequence, not just the current tour. + this.finishRun(); + } + + complete(): void { + const tour = this.activeTour(); + if (!tour) return; + this.save(tour.id, 'completed', tour.steps.length - 1); + const [nextId, ...queue] = this.state.queue; + if (nextId) { + const onboarding = this.onboardingRun; + // leave the finished tour before starting the next one, otherwise + // start() would save it as in-progress again + this.state = IDLE; + this.start(nextId, { force: true }); + this.onboardingRun = onboarding; + this.setState({ ...this.state, queue }); + return; + } + this.finishRun(); + } + + async resetProgress(id?: string): Promise { + if (id === undefined) { + this.setState(IDLE); + await this.store.clearAll(); + return; + } + if (this.state.activeTourId === id) { + this.setState(IDLE); + } + await this.store.clearProgress(id); + } + + markOnboarded(): Promise { + return this.store.setOnboarded(true); + } + + private finishRun() { + const onboarding = this.onboardingRun; + this.onboardingRun = false; + this.setState(IDLE); + if (onboarding) { + this.markOnboarded(); + } + } + + private activeTour(): GuidedTour | undefined { + return this.state.activeTourId + ? this.getTour(this.state.activeTourId) + : undefined; + } + + private save( + id: string, + status: GuidedTourProgress['status'], + stepIndex: number, + ) { + const tour = this.getTour(id); + this.store.setProgress(id, { + status, + stepIndex, + version: tour?.version ?? 1, + updatedAt: new Date().toISOString(), + }); + } + + private setState(state: GuidedTourRunnerState) { + this.state = state; + this.emit(); + } + + private buildSnapshot(): GuidedTourSnapshot { + const { ready, onboarded, progress } = this.store.getSnapshot(); + return { ready, onboarded, progress, state: this.state }; + } + + private emit() { + this.snapshot = this.buildSnapshot(); + this.listeners.forEach(l => l()); + } +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts new file mode 100644 index 00000000000..2cbb750b700 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts @@ -0,0 +1,165 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + StorageApi, + StorageValueSnapshot, +} from '@backstage/frontend-plugin-api'; +import { JsonValue } from '@backstage/types'; +import { GuidedTourProgress } from '@internal/backstage-plugin-guided-tour-react'; + +export const PROGRESS_BUCKET = 'guided-tour'; +export const ONBOARDED_KEY = 'onboarded'; +export const tourKey = (id: string) => `tour/${id}`; + +export interface ProgressStoreSnapshot { + ready: boolean; + onboarded: boolean; + progress: Record; +} + +/** + * Per-user progress on top of a StorageApi bucket: one key per tour plus an + * `onboarded` flag. Writes to the same key are serialized. + */ +export class ProgressStore { + private readonly storage: StorageApi; + private readonly tourIds: string[]; + private readonly listeners = new Set<() => void>(); + private readonly pending = new Map>(); + private readonly loaded = new Set(); + private readonly subscriptions: Array<{ unsubscribe(): void }> = []; + private snapshot: ProgressStoreSnapshot = { + ready: false, + onboarded: false, + progress: {}, + }; + + constructor(options: { storage: StorageApi; tourIds: string[] }) { + this.storage = options.storage.forBucket(PROGRESS_BUCKET); + this.tourIds = options.tourIds; + this.observe(ONBOARDED_KEY, s => { + this.snapshot = { ...this.snapshot, onboarded: s.value === true }; + }); + for (const id of this.tourIds) { + this.observe(tourKey(id), s => { + const progress = { ...this.snapshot.progress }; + if (s.presence === 'present' && isProgress(s.value)) { + progress[id] = s.value; + } else { + delete progress[id]; + } + this.snapshot = { ...this.snapshot, progress }; + }); + } + if (this.tourIds.length === 0) { + // nothing but the onboarded key to wait for + } + } + + getSnapshot(): ProgressStoreSnapshot { + return this.snapshot; + } + + subscribe(listener: () => void): () => void { + this.listeners.add(listener); + return () => this.listeners.delete(listener); + } + + destroy() { + this.subscriptions.forEach(s => s.unsubscribe()); + this.listeners.clear(); + } + + async setProgress(id: string, progress: GuidedTourProgress): Promise { + // optimistic local update so the UI never waits for the backend + this.snapshot = { + ...this.snapshot, + progress: { ...this.snapshot.progress, [id]: progress }, + }; + this.emit(); + await this.write(tourKey(id), () => + this.storage.set(tourKey(id), progress as unknown as JsonValue), + ); + } + + async clearProgress(id: string): Promise { + const progress = { ...this.snapshot.progress }; + delete progress[id]; + this.snapshot = { ...this.snapshot, progress }; + this.emit(); + await this.write(tourKey(id), () => this.storage.remove(tourKey(id))); + } + + async setOnboarded(value: boolean): Promise { + this.snapshot = { ...this.snapshot, onboarded: value }; + this.emit(); + await this.write(ONBOARDED_KEY, () => + value + ? this.storage.set(ONBOARDED_KEY, true) + : this.storage.remove(ONBOARDED_KEY), + ); + } + + async clearAll(): Promise { + await Promise.all([ + ...this.tourIds.map(id => this.clearProgress(id)), + this.setOnboarded(false), + ]); + } + + private observe( + key: string, + apply: (snapshot: StorageValueSnapshot) => void, + ) { + const handle = (s: StorageValueSnapshot) => { + if (s.presence === 'unknown') { + return; + } + apply(s); + this.loaded.add(key); + const ready = this.loaded.size >= this.tourIds.length + 1; + if (ready !== this.snapshot.ready) { + this.snapshot = { ...this.snapshot, ready }; + } + this.emit(); + }; + handle(this.storage.snapshot(key)); + this.subscriptions.push( + this.storage.observe$(key).subscribe({ next: handle }), + ); + } + + private write(key: string, op: () => Promise): Promise { + const previous = this.pending.get(key) ?? Promise.resolve(); + const next = previous.then(op, op).catch(() => undefined); + this.pending.set(key, next); + return next; + } + + private emit() { + this.listeners.forEach(l => l()); + } +} + +function isProgress(value: JsonValue): value is GuidedTourProgress & JsonValue { + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof (value as any).status === 'string' && + typeof (value as any).stepIndex === 'number' + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx new file mode 100644 index 00000000000..19c7c97ddf2 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx @@ -0,0 +1,161 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useApi } from '@backstage/frontend-plugin-api'; +import { Dialog, Popover, Skeleton } from '@backstage/ui'; +import { + GuidedTour, + guidedTourApiRef, + guidedTourTargetSelector, +} from '@internal/backstage-plugin-guided-tour-react'; +import { useEffect, useMemo } from 'react'; +import { Dialog as AriaDialog } from 'react-aria-components'; +import { useLocation, useNavigate } from 'react-router-dom'; +import { Spotlight } from './Spotlight'; +import { StepCard } from './StepCard'; +import { useElementRect, useTargetElement } from './useTargetElement'; + +export interface ActiveStepProps { + tour: GuidedTour; + stepIndex: number; +} + +/** + * Renders the active step: navigates to its route, waits for its target, + * draws the spotlight and anchors the card to the element (or centers it). + */ +export function ActiveStep(props: ActiveStepProps) { + const { tour, stepIndex } = props; + const step = tour.steps[stepIndex]; + const api = useApi(guidedTourApiRef); + const navigate = useNavigate(); + const location = useLocation(); + + const onRoute = !step.route || location.pathname === step.route; + useEffect(() => { + if (!onRoute && step.route) { + navigate(step.route); + } + // only when the step changes, not on every location update + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tour.id, stepIndex]); + + const selector = step.target + ? guidedTourTargetSelector(step.target) + : undefined; + const { element, status } = useTargetElement(selector, { + enabled: onRoute, + timeoutMs: step.targetTimeoutMs, + resetKey: `${tour.id}:${stepIndex}`, + }); + const rect = useElementRect(element); + + // skip steps whose target never showed up, when configured so + useEffect(() => { + if (status === 'missing' && step.onMissingTarget === 'skip') { + api.next(); + } + }, [status, step.onMissingTarget, api]); + + // click-to-advance: let the click reach the element, then move on + useEffect(() => { + if (!element || step.advanceOn !== 'click') return undefined; + const onClick = () => api.next(); + element.addEventListener('click', onClick, { capture: true }); + return () => + element.removeEventListener('click', onClick, { capture: true }); + }, [element, step.advanceOn, api]); + + // Escape closes the tour. The overlays' own open state is never used for + // that: react-aria also reports "closed" when focus leaves a popover, which + // happens for a moment on every step change. + useEffect(() => { + const onKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + event.stopPropagation(); + api.dismiss(); + } + }; + document.addEventListener('keydown', onKeyDown, true); + return () => document.removeEventListener('keydown', onKeyDown, true); + }, [api]); + + const triggerRef = useMemo(() => ({ current: element }), [element]); + + const card = ( + api.previous()} + onNext={() => api.next()} + onDismiss={() => api.dismiss()} + /> + ); + + // The BUI Dialog brings its own backdrop, so the spotlight is only used + // for anchored steps. + if (status === 'resolving') { + return ( + + + + ); + } + + if (status === 'found' && element) { + return ( + <> + + false} + isKeyboardDismissDisabled + > + + {card} + + + + ); + } + + if (status === 'missing' && step.onMissingTarget === 'skip') { + return null; + } + + // no target, or target missing with the default `center` behaviour + return ( + !open && api.dismiss()} + width={420} + > + {card} + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx new file mode 100644 index 00000000000..4da990821f2 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx @@ -0,0 +1,116 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { identityApiRef, useApi } from '@backstage/frontend-plugin-api'; +import { guidedTourApiRef } from '@internal/backstage-plugin-guided-tour-react'; +import { useEffect, useRef, useState } from 'react'; +import { matchPath, useLocation } from 'react-router-dom'; +import { selectLoginTours } from '../../api/DefaultGuidedTourApi'; +import { ActiveStep } from './ActiveStep'; +import { useGuidedTourSnapshot } from './useGuidedTourSnapshot'; + +/** + * App root element: decides when tours start on their own and renders the + * active step. Renders nothing while no tour is running. + */ +export function GuidedTourOverlay() { + const api = useApi(guidedTourApiRef); + const identityApi = useApi(identityApiRef); + const snapshot = useGuidedTourSnapshot(); + const location = useLocation(); + const [signedIn, setSignedIn] = useState(false); + const loginHandled = useRef(false); + + // Root elements render before the sign-in page completes; wait for identity. + useEffect(() => { + let cancelled = false; + identityApi + .getBackstageIdentity() + .then(() => !cancelled && setSignedIn(true)) + .catch(() => undefined); + return () => { + cancelled = true; + }; + }, [identityApi]); + + const canAutoStart = signedIn && snapshot.ready && api.isAutoStartEnabled(); + + // Login tours: full sequence on first login, newcomers alone afterwards. + useEffect(() => { + if (!canAutoStart || loginHandled.current) return; + loginHandled.current = true; + if (snapshot.state.activeTourId) return; + // A tour left in progress (reload, closed tab) resumes at its saved step, + // unless that step belongs to another page: a deep link must not be + // redirected. The tours page offers "Continue" for that case. + const inProgress = api + .getTours() + .map(t => ({ tour: t, id: t.id, progress: api.getProgress(t.id) })) + .filter(t => t.progress?.status === 'in-progress') + .filter(t => { + const route = t.tour.steps[t.progress?.stepIndex ?? 0]?.route; + return !route || matchPath(route, location.pathname); + }) + .sort((a, b) => + (b.progress?.updatedAt ?? '').localeCompare( + a.progress?.updatedAt ?? '', + ), + )[0]; + if (inProgress) { + api.start(inProgress.id); + return; + } + const ids = selectLoginTours({ + tours: api.getTours(), + progress: snapshot.progress, + onboarded: snapshot.onboarded, + }); + if (ids.length > 0) { + api.startQueue(ids, { onboarding: !snapshot.onboarded }); + } else if (!snapshot.onboarded) { + api.markOnboarded(); + } + // the location is read once, when auto-start first becomes possible + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [canAutoStart, api, snapshot]); + + // Route tours: first visit of a matching path, never interrupting a run. + useEffect(() => { + if (!canAutoStart || snapshot.state.activeTourId) return; + const tour = api + .getTours() + .find( + t => + typeof t.autoStart === 'object' && + t.autoStart !== null && + matchPath( + { path: t.autoStart.route, end: false }, + location.pathname, + ) && + api.getProgress(t.id) === undefined, + ); + if (tour) { + api.start(tour.id); + } + }, [canAutoStart, location.pathname, api, snapshot.state.activeTourId]); + + const activeTour = snapshot.state.activeTourId + ? api.getTour(snapshot.state.activeTourId) + : undefined; + if (!activeTour || !activeTour.steps[snapshot.state.stepIndex]) { + return null; + } + return ; +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx new file mode 100644 index 00000000000..57edec222ad --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx @@ -0,0 +1,97 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Rect } from './useTargetElement'; + +const PADDING = 6; +const RADIUS = 8; +export const SPOTLIGHT_Z_INDEX = 99_990; + +/** + * Full-screen dimmed mask with a rounded cut-out around the target. The + * cut-out is not painted, so pointer events fall through it when + * `passThrough` is set; otherwise a transparent shield blocks them. + */ +export function Spotlight(props: { rect: Rect | null; passThrough?: boolean }) { + const { rect, passThrough } = props; + const hole = rect + ? { + x: rect.left - PADDING, + y: rect.top - PADDING, + w: rect.width + PADDING * 2, + h: rect.height + PADDING * 2, + } + : undefined; + + const path = hole + ? `M0 0H100000V100000H0Z ` + + `M${hole.x + RADIUS} ${hole.y}` + + `H${hole.x + hole.w - RADIUS}` + + `A${RADIUS} ${RADIUS} 0 0 1 ${hole.x + hole.w} ${hole.y + RADIUS}` + + `V${hole.y + hole.h - RADIUS}` + + `A${RADIUS} ${RADIUS} 0 0 1 ${hole.x + hole.w - RADIUS} ${ + hole.y + hole.h + }` + + `H${hole.x + RADIUS}` + + `A${RADIUS} ${RADIUS} 0 0 1 ${hole.x} ${hole.y + hole.h - RADIUS}` + + `V${hole.y + RADIUS}` + + `A${RADIUS} ${RADIUS} 0 0 1 ${hole.x + RADIUS} ${hole.y}Z` + : 'M0 0H100000V100000H0Z'; + + return ( + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx new file mode 100644 index 00000000000..4e5db49991b --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx @@ -0,0 +1,103 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useTranslationRef } from '@backstage/frontend-plugin-api'; +import { Button, ButtonIcon, Flex, Text } from '@backstage/ui'; +import { + GuidedTourStep, + MarkdownText, +} from '@internal/backstage-plugin-guided-tour-react'; +import { RiCloseLine } from '@remixicon/react'; +import { Heading } from 'react-aria-components'; +import { guidedTourTranslationRef } from '../../translation'; + +export interface StepCardProps { + tourTitle: string; + step: GuidedTourStep; + stepIndex: number; + stepCount: number; + onPrevious(): void; + onNext(): void; + onDismiss(): void; +} + +/** The inside of a step: title, markdown body, counter and buttons. */ +export function StepCard(props: StepCardProps) { + const { + tourTitle, + step, + stepIndex, + stepCount, + onPrevious, + onNext, + onDismiss, + } = props; + const { t } = useTranslationRef(guidedTourTranslationRef); + const isLast = stepIndex >= stepCount - 1; + const clickToAdvance = step.advanceOn === 'click'; + + return ( + + + + + {tourTitle} + + + + {step.title ?? tourTitle} + + + + } + aria-label={t('overlay.close')} + onPress={onDismiss} + /> + + + {clickToAdvance && ( + + {t('overlay.clickToContinue')} + + )} + + + {t('overlay.counter', { + current: String(stepIndex + 1), + total: String(stepCount), + })} + + + + {!clickToAdvance && ( + + )} + + + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts new file mode 100644 index 00000000000..7b496f1cf55 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useApi } from '@backstage/frontend-plugin-api'; +import { + GuidedTourSnapshot, + guidedTourApiRef, +} from '@internal/backstage-plugin-guided-tour-react'; +import { useSyncExternalStore } from 'react'; + +export function useGuidedTourSnapshot(): GuidedTourSnapshot { + const api = useApi(guidedTourApiRef); + return useSyncExternalStore(api.subscribe, api.getSnapshot, api.getSnapshot); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts new file mode 100644 index 00000000000..5fb9eb1a04b --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts @@ -0,0 +1,155 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useEffect, useState } from 'react'; + +export type TargetStatus = 'none' | 'resolving' | 'found' | 'missing'; + +export interface TargetResult { + element: HTMLElement | null; + status: TargetStatus; +} + +/** + * Resolves a CSS selector to an element, waiting for it to appear (lazy + * pages, navigation) until `timeoutMs` elapses. + */ +export function useTargetElement( + selector: string | undefined, + options: { enabled?: boolean; timeoutMs?: number; resetKey?: string } = {}, +): TargetResult { + const { enabled = true, timeoutMs = 5000, resetKey } = options; + const [result, setResult] = useState({ + element: null, + status: selector ? 'resolving' : 'none', + }); + + useEffect(() => { + if (!selector) { + setResult({ element: null, status: 'none' }); + return undefined; + } + if (!enabled) { + setResult({ element: null, status: 'resolving' }); + return undefined; + } + + const find = () => document.querySelector(selector); + const initial = find(); + if (initial) { + setResult({ element: initial, status: 'found' }); + return undefined; + } + setResult({ element: null, status: 'resolving' }); + + const timer: { id?: ReturnType } = {}; + const observer = new MutationObserver(() => { + const el = find(); + if (el) { + observer.disconnect(); + clearTimeout(timer.id); + setResult({ element: el, status: 'found' }); + } + }); + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['data-guided-tour'], + }); + timer.id = setTimeout(() => { + observer.disconnect(); + setResult({ element: null, status: 'missing' }); + }, timeoutMs); + + return () => { + observer.disconnect(); + clearTimeout(timer.id); + }; + }, [selector, enabled, timeoutMs, resetKey]); + + return result; +} + +export interface Rect { + top: number; + left: number; + width: number; + height: number; +} + +function measure(element: HTMLElement): Rect { + let rect = element.getBoundingClientRect(); + if (rect.width === 0 && rect.height === 0 && element.children.length > 0) { + // display: contents wrappers have no box; use the union of their children + const boxes = Array.from(element.children).map(c => + c.getBoundingClientRect(), + ); + const top = Math.min(...boxes.map(b => b.top)); + const left = Math.min(...boxes.map(b => b.left)); + const bottom = Math.max(...boxes.map(b => b.bottom)); + const right = Math.max(...boxes.map(b => b.right)); + rect = new DOMRect(left, top, right - left, bottom - top); + } + return { + top: rect.top, + left: rect.left, + width: rect.width, + height: rect.height, + }; +} + +/** + * Tracks the viewport rectangle of an element across scroll, resize and + * layout changes. Scrolls the element into view once. + */ +export function useElementRect(element: HTMLElement | null): Rect | null { + const [rect, setRect] = useState(null); + + useEffect(() => { + if (!element) { + setRect(null); + return undefined; + } + if (typeof element.scrollIntoView === 'function') { + element.scrollIntoView({ block: 'center', inline: 'nearest' }); + } + + let frame = 0; + const update = () => { + cancelAnimationFrame(frame); + frame = requestAnimationFrame(() => setRect(measure(element))); + }; + update(); + + window.addEventListener('resize', update); + window.addEventListener('scroll', update, true); + const resizeObserver = + typeof ResizeObserver !== 'undefined' + ? new ResizeObserver(update) + : undefined; + resizeObserver?.observe(element); + resizeObserver?.observe(document.body); + + return () => { + cancelAnimationFrame(frame); + window.removeEventListener('resize', update); + window.removeEventListener('scroll', update, true); + resizeObserver?.disconnect(); + }; + }, [element]); + + return rect; +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx new file mode 100644 index 00000000000..345e0262154 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx @@ -0,0 +1,179 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useApi, useTranslationRef } from '@backstage/frontend-plugin-api'; +import { + Badge, + Button, + Card, + CardBody, + Container, + Dialog, + DialogBody, + DialogFooter, + DialogHeader, + Flex, + Header, + Text, +} from '@backstage/ui'; +import { + GuidedTour, + GuidedTourProgress, + guidedTourApiRef, +} from '@internal/backstage-plugin-guided-tour-react'; +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useGuidedTourSnapshot } from '../overlay/useGuidedTourSnapshot'; +import { guidedTourTranslationRef } from '../../translation'; + +type StatusKey = 'new' | 'inProgress' | 'completed' | 'dismissed'; + +function statusOf(progress: GuidedTourProgress | undefined): StatusKey { + if (!progress) return 'new'; + if (progress.status === 'in-progress') return 'inProgress'; + return progress.status; +} + +function TourRow(props: { tour: GuidedTour; progress?: GuidedTourProgress }) { + const { tour, progress } = props; + const api = useApi(guidedTourApiRef); + const navigate = useNavigate(); + const { t } = useTranslationRef(guidedTourTranslationRef); + const status = statusOf(progress); + + const onStart = () => { + const resume = status === 'inProgress'; + const stepIndex = resume ? progress?.stepIndex ?? 0 : 0; + const route = tour.steps[stepIndex]?.route; + if (route) { + navigate(route); + } + api.start(tour.id, { force: !resume }); + }; + + const label = { + new: t('page.start'), + inProgress: t('page.continue'), + completed: t('page.restart'), + dismissed: t('page.restart'), + }[status]; + + return ( + + + + + + + {tour.title} + + {t(`page.status.${status}`)} + + {tour.description && ( + {tour.description} + )} + + {t('page.steps', { n: String(tour.steps.length) })} + {tour.autoStart === 'login' && ` · ${t('page.autoStartLogin')}`} + {typeof tour.autoStart === 'object' && + tour.autoStart !== null && + ` · ${t('page.autoStartRoute', { + route: tour.autoStart.route, + })}`} + + + + + + + ); +} + +export function GuidedToursPage() { + const api = useApi(guidedTourApiRef); + const snapshot = useGuidedTourSnapshot(); + const { t } = useTranslationRef(guidedTourTranslationRef); + const [confirmOpen, setConfirmOpen] = useState(false); + const tours = api.getTours(); + + return ( + <> +
    setConfirmOpen(true)} + isDisabled={tours.length === 0} + > + {t('page.resetAll')} + + } + /> + + + {tours.length === 0 && ( + {t('page.empty')} + )} + {tours.map(tour => ( + + ))} + + + + {t('page.resetAllTitle')} + + {t('page.resetAllBody')} + + + + + + + {/* keep the page re-rendering on progress changes */} + + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts b/workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts new file mode 100644 index 00000000000..f12e780062b --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts @@ -0,0 +1,52 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + ApiBlueprint, + createExtensionInput, + storageApiRef, +} from '@backstage/frontend-plugin-api'; +import { + guidedTourApiRef, + guidedTourDataRef, +} from '@internal/backstage-plugin-guided-tour-react'; +import { z } from 'zod'; +import { DefaultGuidedTourApi } from '../api/DefaultGuidedTourApi'; + +/** + * `api:guided-tour`: the registry every `guided-tour` extension attaches to. + */ +export const guidedTourApi = ApiBlueprint.makeWithOverrides({ + inputs: { + tours: createExtensionInput([guidedTourDataRef]), + }, + configSchema: { + /** Set to false to never start tours on their own (e2e runs, kiosks). */ + autoStart: z.boolean().default(true), + }, + factory: (originalFactory, { inputs, config }) => + originalFactory(defineParams => + defineParams({ + api: guidedTourApiRef, + deps: { storageApi: storageApiRef }, + factory: ({ storageApi }) => + new DefaultGuidedTourApi({ + tours: inputs.tours.map(t => t.get(guidedTourDataRef)), + storageApi, + autoStart: config.autoStart, + }), + }), + ), +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx b/workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx new file mode 100644 index 00000000000..6b6e7cf3d52 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx @@ -0,0 +1,25 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { AppRootElementBlueprint } from '@backstage/frontend-plugin-api'; +import { GuidedTourOverlay } from '../components/overlay/GuidedTourOverlay'; + +export const guidedTourOverlay = AppRootElementBlueprint.make({ + name: 'overlay', + params: { + // the key keeps React quiet when the app spreads root elements into a list + element: , + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx b/workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx new file mode 100644 index 00000000000..d0a10bfc0d4 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx @@ -0,0 +1,31 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { PageBlueprint } from '@backstage/frontend-plugin-api'; +import { RiCompass3Line } from '@remixicon/react'; +import { rootRouteRef } from '../routes'; + +export const guidedToursPage = PageBlueprint.make({ + params: { + path: '/guided-tours', + title: 'Guided tours', + icon: , + routeRef: rootRouteRef, + loader: () => + import('../components/page/GuidedToursPage').then(m => ( + + )), + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/index.ts b/workspaces/guided-tours/plugins/guided-tour/src/index.ts new file mode 100644 index 00000000000..62a1462f69e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { guidedTourPlugin as default, guidedTourPlugin } from './plugin'; +export { guidedTourTranslationRef } from './translation'; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts new file mode 100644 index 00000000000..df5069cf35e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { guidedTourPlugin } from './plugin'; + +describe('guided-tour', () => { + it('should export plugin', () => { + expect(guidedTourPlugin).toBeDefined(); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/plugin.ts b/workspaces/guided-tours/plugins/guided-tour/src/plugin.ts new file mode 100644 index 00000000000..93dce545435 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/plugin.ts @@ -0,0 +1,35 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFrontendPlugin } from '@backstage/frontend-plugin-api'; +import { guidedTourApi } from './extensions/api'; +import { guidedTourOverlay } from './extensions/overlay'; +import { guidedToursPage } from './extensions/page'; +import { rootRouteRef } from './routes'; + +/** + * The guided tour plugin: the tour registry (`api:guided-tour`), the overlay + * that plays tours (`app-root-element:guided-tour/overlay`) and the overview + * page (`page:guided-tour`). + * + * @public + */ +export const guidedTourPlugin = createFrontendPlugin({ + pluginId: 'guided-tour', + extensions: [guidedTourApi, guidedTourOverlay, guidedToursPage], + routes: { + root: rootRouteRef, + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/routes.ts b/workspaces/guided-tours/plugins/guided-tour/src/routes.ts new file mode 100644 index 00000000000..64dc1daab63 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/routes.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createRouteRef } from '@backstage/frontend-plugin-api'; + +export const rootRouteRef = createRouteRef(); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts new file mode 100644 index 00000000000..5f11bab1c2c --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/translation.ts b/workspaces/guided-tours/plugins/guided-tour/src/translation.ts new file mode 100644 index 00000000000..e9a35eb099a --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/translation.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createTranslationRef } from '@backstage/frontend-plugin-api'; + +/** @alpha */ +export const guidedTourTranslationRef = createTranslationRef({ + id: 'guided-tour', + messages: { + overlay: { + previous: 'Previous', + next: 'Next', + done: 'Done', + close: 'Close tour', + counter: 'Step {{current}} of {{total}}', + clickToContinue: 'Click the highlighted element to continue.', + loading: 'Looking for the next step…', + }, + page: { + title: 'Guided tours', + description: + 'Replay any tour at any time. Tours marked for login start on their own the first time you sign in.', + empty: 'No guided tours are installed.', + steps: '{{n}} steps', + start: 'Start', + continue: 'Continue', + restart: 'Restart', + resetAll: 'Reset all tours', + resetAllTitle: 'Reset all tours?', + resetAllBody: + 'Progress of every tour is cleared and the welcome tours play again on your next visit.', + cancel: 'Cancel', + confirm: 'Reset', + autoStartLogin: 'Starts on login', + autoStartRoute: 'Starts on first visit of {{route}}', + status: { + new: 'New', + inProgress: 'In progress', + completed: 'Completed', + dismissed: 'Dismissed', + }, + }, + }, +}); diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 947a867f691..9094692c9b1 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 9 cacheKey: 10 +"@adobe/css-tools@npm:^4.4.0": + version: 4.5.0 + resolution: "@adobe/css-tools@npm:4.5.0" + checksum: 10/a332050614f7e08928aba518ac65534621672590bdfc2079886e9ead90da78c7fe2498152c5083318e93ee909260ec13854c21ac77c24053f7d30c5d2d2adcc1 + languageName: node + linkType: hard + "@apidevtools/json-schema-ref-parser@npm:11.7.2": version: 11.7.2 resolution: "@apidevtools/json-schema-ref-parser@npm:11.7.2" @@ -66,6 +73,229 @@ __metadata: languageName: node linkType: hard +"@azure/abort-controller@npm:^2.0.0, @azure/abort-controller@npm:^2.1.2": + version: 2.2.0 + resolution: "@azure/abort-controller@npm:2.2.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/9321644b2ea7cc6c78b807a40f52b5b30ea5e2dfa348422c7b7df3bf271aab49312c19c7427632cbe6f223951f981b8b28d03882f57b9a8fe254e38de3f4d551 + languageName: node + linkType: hard + +"@azure/core-auth@npm:^1.10.0, @azure/core-auth@npm:^1.9.0": + version: 1.11.0 + resolution: "@azure/core-auth@npm:1.11.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@azure/core-util": "npm:^1.13.0" + tslib: "npm:^2.6.2" + checksum: 10/035e1ef4658d3809ff2cc3181decffe621ac2c21cdda761de9cae593d9d808ab40753b5779f116ec207e6e1bb042177ff05cb8bdd7a242212bb80dcfd15c5bd8 + languageName: node + linkType: hard + +"@azure/core-client@npm:^1.9.2, @azure/core-client@npm:^1.9.3": + version: 1.11.1 + resolution: "@azure/core-client@npm:1.11.1" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@azure/core-auth": "npm:^1.10.0" + "@azure/core-rest-pipeline": "npm:^1.22.0" + "@azure/core-tracing": "npm:^1.3.0" + "@azure/core-util": "npm:^1.13.0" + "@azure/logger": "npm:^1.3.0" + tslib: "npm:^2.6.2" + checksum: 10/f50e95d78552bf80f02ada5602f2a4e65fa4d284a923d061a1d1473279b7d3a04171dba7d3f837fbd14c1b4eab610a0caaed921f983911bee2d1a8547acd30c3 + languageName: node + linkType: hard + +"@azure/core-http-compat@npm:^2.2.0, @azure/core-http-compat@npm:^2.4.0": + version: 2.5.0 + resolution: "@azure/core-http-compat@npm:2.5.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + peerDependencies: + "@azure/core-client": ^1.10.0 + "@azure/core-rest-pipeline": ^1.22.0 + checksum: 10/bc764804ceb408a469265b5f5abd9d895cfa4fc4873ca72ec4ca3b7e7a19af25ac0bba1ca218b84b624ea50300bfd981908422c3880dd115baebcdbcedd4c9f3 + languageName: node + linkType: hard + +"@azure/core-lro@npm:^2.2.0": + version: 2.7.2 + resolution: "@azure/core-lro@npm:2.7.2" + dependencies: + "@azure/abort-controller": "npm:^2.0.0" + "@azure/core-util": "npm:^1.2.0" + "@azure/logger": "npm:^1.0.0" + tslib: "npm:^2.6.2" + checksum: 10/73b4e1d74afc0dc647914db3a79b6212b653d853f6ff7105eb6e19ab2f7af11cef99d6388b3125179c8872db819930ac0ab9768b07c06a3033dd22fa546f8a09 + languageName: node + linkType: hard + +"@azure/core-paging@npm:^1.6.2": + version: 1.7.0 + resolution: "@azure/core-paging@npm:1.7.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/bf13e46b0bbb0748a69000f224b7b3304ddc5bede84d7358529e9931800f7b7cd59c630db973128fee473339dc7e3c56cc1554fb601bfdbb8f2bfc5e420ce4df + languageName: node + linkType: hard + +"@azure/core-process@npm:^1.0.0": + version: 1.0.0 + resolution: "@azure/core-process@npm:1.0.0" + checksum: 10/760913c11b3be7b80dadd9bfbbc2c4aef32d8ba3a5b13e614241ebc6573c6b0a3ccb967cc880022451fe898682ccdbc51200255d2297034e1d2bd17969ced868 + languageName: node + linkType: hard + +"@azure/core-rest-pipeline@npm:^1.17.0, @azure/core-rest-pipeline@npm:^1.19.1, @azure/core-rest-pipeline@npm:^1.22.0, @azure/core-rest-pipeline@npm:^1.24.0": + version: 1.25.0 + resolution: "@azure/core-rest-pipeline@npm:1.25.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@azure/core-auth": "npm:^1.10.0" + "@azure/core-tracing": "npm:^1.3.0" + "@azure/core-util": "npm:^1.13.0" + "@azure/logger": "npm:^1.3.0" + "@typespec/ts-http-runtime": "npm:^0.3.4" + tslib: "npm:^2.6.2" + checksum: 10/a1066040f53807f68eadaca593ba472080665df3b5cd4fcdeeddeba19690adff05b52c7ac72817de2df90f4d70870a6d44298db22e5617f588bff2688839f3ef + languageName: node + linkType: hard + +"@azure/core-tracing@npm:^1.0.0, @azure/core-tracing@npm:^1.2.0, @azure/core-tracing@npm:^1.3.0": + version: 1.4.0 + resolution: "@azure/core-tracing@npm:1.4.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/291bfcba04dbc4b612707f14c02c999a8490f09fe6e2bb19f4fa9030b2b85368279ec0ef682a11eca7dc139d5e31bfd34c1481efedf1e911a21e5981c175c748 + languageName: node + linkType: hard + +"@azure/core-util@npm:^1.11.0, @azure/core-util@npm:^1.13.0, @azure/core-util@npm:^1.2.0": + version: 1.14.0 + resolution: "@azure/core-util@npm:1.14.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@typespec/ts-http-runtime": "npm:^0.3.0" + tslib: "npm:^2.6.2" + checksum: 10/a6f217ce02eed1800b48388e2b4c397090bc314b118107db3328ec841fd32d17f6cccd4a396f9d6cce3172a64bfdf7e9f75264f65908188608b0e9c1569a14d0 + languageName: node + linkType: hard + +"@azure/core-xml@npm:^1.4.5": + version: 1.6.0 + resolution: "@azure/core-xml@npm:1.6.0" + dependencies: + fast-xml-parser: "npm:^5.5.9" + tslib: "npm:^2.8.1" + checksum: 10/acba73594443ad04f507f367ef75e25c8cda17e2313f74617c7a5cf707a3b0e22ff2e6c1c12f70ce5a9a2d7ca89903a49da61d2f39a47005fb16a4b4a3d7da72 + languageName: node + linkType: hard + +"@azure/identity@npm:^4.0.0": + version: 4.14.0 + resolution: "@azure/identity@npm:4.14.0" + dependencies: + "@azure/abort-controller": "npm:^2.0.0" + "@azure/core-auth": "npm:^1.9.0" + "@azure/core-client": "npm:^1.9.2" + "@azure/core-process": "npm:^1.0.0" + "@azure/core-rest-pipeline": "npm:^1.17.0" + "@azure/core-tracing": "npm:^1.0.0" + "@azure/core-util": "npm:^1.11.0" + "@azure/logger": "npm:^1.0.0" + "@azure/msal-browser": "npm:^5.5.0" + "@azure/msal-node": "npm:^6.0.0" + open: "npm:^11.0.0" + tslib: "npm:^2.2.0" + checksum: 10/03de09943418670049f99bf618ab178c82f971de949f003b72402ebbd2f7cac16566916450604ff1bdfec035a3b0c2c7fc1ea7bd14daa68adc15482b2e665e07 + languageName: node + linkType: hard + +"@azure/logger@npm:^1.0.0, @azure/logger@npm:^1.1.4, @azure/logger@npm:^1.3.0": + version: 1.4.0 + resolution: "@azure/logger@npm:1.4.0" + dependencies: + "@typespec/ts-http-runtime": "npm:^0.3.0" + tslib: "npm:^2.6.2" + checksum: 10/84ee66109ae4385bb114010705db82a1ecdf6782d854d8e3e40d5d21934817f7896d1480e91a3aaf7e4663bec89eb13ceb11e3467f013bde02fea90907c97c68 + languageName: node + linkType: hard + +"@azure/msal-browser@npm:^5.5.0": + version: 5.26.0 + resolution: "@azure/msal-browser@npm:5.26.0" + dependencies: + "@azure/msal-common": "npm:16.14.3" + checksum: 10/11938ba9a426f5506a6db4048e377b815077dd118dcb13bdf85131c541e05ec198968cc2e48d1d5ca03dc6d2fa3630087c50805b3f24cb55f3fdfc7da70d79de + languageName: node + linkType: hard + +"@azure/msal-common@npm:16.14.1": + version: 16.14.1 + resolution: "@azure/msal-common@npm:16.14.1" + checksum: 10/7b8355aa95895ab4598a143e72ebf1ed1c63b8ada01ff4e82a768d8700fab768c5e047467c9931c6a1cec48b7cbd8fa5d2b0dd149cb172ab414fc2682aa72735 + languageName: node + linkType: hard + +"@azure/msal-common@npm:16.14.3": + version: 16.14.3 + resolution: "@azure/msal-common@npm:16.14.3" + checksum: 10/be6df5c62dee049588494e605e9288f2cd601f3949de1e1165dd99822ea70c73a270e3e9c12190c9ed39a215d4de2910053506846450199e3d6634179b82f478 + languageName: node + linkType: hard + +"@azure/msal-node@npm:^6.0.0": + version: 6.0.1 + resolution: "@azure/msal-node@npm:6.0.1" + dependencies: + "@azure/msal-common": "npm:16.14.1" + jsonwebtoken: "npm:^9.0.0" + checksum: 10/75c8f2d42f0b905b14b0f0cea19efb5f1abff921e6ee2abd021a398b83a1dee6f18d31568f3fb8d3d46fc78d8be6db935a125fc4abe4b7bb674ec6bc74b91dc3 + languageName: node + linkType: hard + +"@azure/storage-blob@npm:^12.5.0": + version: 12.34.0 + resolution: "@azure/storage-blob@npm:12.34.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@azure/core-auth": "npm:^1.9.0" + "@azure/core-client": "npm:^1.9.3" + "@azure/core-http-compat": "npm:^2.2.0" + "@azure/core-lro": "npm:^2.2.0" + "@azure/core-paging": "npm:^1.6.2" + "@azure/core-rest-pipeline": "npm:^1.19.1" + "@azure/core-tracing": "npm:^1.2.0" + "@azure/core-util": "npm:^1.11.0" + "@azure/core-xml": "npm:^1.4.5" + "@azure/logger": "npm:^1.1.4" + "@azure/storage-common": "npm:^12.5.0" + apache-arrow: "npm:^21.1.0" + events: "npm:^3.0.0" + tslib: "npm:^2.8.1" + checksum: 10/9e3f2e49f7d3770ee970fc9d6edec50748a6fa4958654a4214fad88a086d16c155ad6dad2de9a1e0c12a20ef52134150a87c065085c4c5f9f3ddab0772fef656 + languageName: node + linkType: hard + +"@azure/storage-common@npm:^12.5.0": + version: 12.5.0 + resolution: "@azure/storage-common@npm:12.5.0" + dependencies: + "@azure/abort-controller": "npm:^2.1.2" + "@azure/core-auth": "npm:^1.9.0" + "@azure/core-http-compat": "npm:^2.4.0" + "@azure/core-rest-pipeline": "npm:^1.24.0" + "@azure/core-tracing": "npm:^1.2.0" + "@azure/core-util": "npm:^1.11.0" + "@azure/logger": "npm:^1.1.4" + events: "npm:^3.3.0" + tslib: "npm:^2.8.1" + checksum: 10/ff709f3593a223d2676e68420a59991849d9e922d17b410bf738ef6e7f66e6049504e94f6ca10765a69cae159adda420202fb5cb9e3317e829bad2921bb036f8 + languageName: node + linkType: hard + "@babel/code-frame@npm:7.0.0": version: 7.0.0 resolution: "@babel/code-frame@npm:7.0.0" @@ -75,7 +305,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.29.7, @babel/code-frame@npm:^7.8.3": version: 7.29.7 resolution: "@babel/code-frame@npm:7.29.7" dependencies: @@ -96,6 +326,43 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/generator@npm:7.29.8" + dependencies: + "@babel/parser": "npm:^7.29.8" + "@babel/types": "npm:^7.29.8" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/679c3d1302936f391260acee4059e0c3cd5bff6341772f0b85bb142feab1a253d0e155aad0e9c8531e024d6239a2cc5169d1e294c6890901e7d4ab0f7c9eaaaa + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-globals@npm:7.29.7" + checksum: 10/e53203e87ae24a45f59639edea0c429bc3c63c6d74f1862fe60a35032d89478e7511d2f34855da0fcb65782668d72e59e93d1de5bc00121ba9bc1aa38f1f0ad3 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.16.7": + version: 7.29.7 + resolution: "@babel/helper-module-imports@npm:7.29.7" + dependencies: + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/28ec6f7efd99588d6eebfb25c9f1ccc34cb0cdb0839c4c0f08b3ec0105ccaefbe7e8b4f651f3f55a4f5c4fcb1d979bd32a9b8ee23e3e62163ea22aaa7ee0dfa1 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-string-parser@npm:7.29.7" + checksum: 10/4d8ef0ef7105f3d9fe4361137c8f42e5b4c7a52b5380b962762f2a528a1ba89064e2c6236090716ce34b63707b886ae0ebf36b2c2fcc2851f27e652febfc3648 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-validator-identifier@npm:7.29.7" @@ -122,13 +389,60 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.5.5": +"@babel/parser@npm:^7.29.7, @babel/parser@npm:^7.29.8, @babel/parser@npm:^7.29.9": + version: 7.29.9 + resolution: "@babel/parser@npm:7.29.9" + dependencies: + "@babel/types": "npm:^7.29.8" + bin: + parser: ./bin/babel-parser.js + checksum: 10/b8d6acda3fc7405c497b839b0b6d46cbd309d81bdb310c349e5760ecd689c3641925e1184574106161ce2c78cf5c09d22544a0b3e4d5f002e3b78c263c6f11e6 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.29.10 resolution: "@babel/runtime@npm:7.29.10" checksum: 10/883bb39a09f4773cf46cdd7ba0080ef6b30ff996a4ed21f8d34511ec0836122e697716533da5efc9b5016f763110b19aa07e81cec6e2036fe72cb26aad556af2 languageName: node linkType: hard +"@babel/template@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/template@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/da92f7a5b61e05d2fb3934a44f18cec6006ee3c595116c17a3b44cb9756ecd43205c7360dbfa326fa8f4d00aaeb9e777342a881070d11c2305e9c694bc3ca6ff + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.29.7": + version: 7.29.10 + resolution: "@babel/traverse@npm:7.29.10" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.8" + "@babel/helper-globals": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.9" + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.8" + debug: "npm:^4.3.1" + checksum: 10/2d322e15e9e23caf722036254ae328c8f23bc4b54361f711cbd2cfde4a927711ec3b37ee5e918e470c6cc63c10c3c735209a3c42008e8d3ba66758037e202cb7 + languageName: node + linkType: hard + +"@babel/types@npm:^7.29.7, @babel/types@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/types@npm:7.29.8" + dependencies: + "@babel/helper-string-parser": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + checksum: 10/ff2becf0f8b432f0820f286fb9319d7f3819b2d0eb95bc26957fbc6250a3ca0ae3656feb98ecb5f171f9e04b34a4c08f5036447f17459ed7bfc32ff649d9b71e + languageName: node + linkType: hard + "@backstage/backend-plugin-api@npm:^1.11.0": version: 1.11.0 resolution: "@backstage/backend-plugin-api@npm:1.11.0" @@ -623,7 +937,7 @@ __metadata: languageName: node linkType: hard -"@backstage/cli@npm:^0.36.7": +"@backstage/cli@npm:^0.36.5, @backstage/cli@npm:^0.36.7": version: 0.36.7 resolution: "@backstage/cli@npm:0.36.7" dependencies: @@ -723,6 +1037,118 @@ __metadata: languageName: node linkType: hard +"@backstage/core-app-api@npm:^1.20.6": + version: 1.20.6 + resolution: "@backstage/core-app-api@npm:1.20.6" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@types/prop-types": "npm:^15.7.3" + history: "npm:^5.0.0" + i18next: "npm:^22.4.15" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.7.2" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/41316faaa202f0529e2e1c172173faaead7b800b5375b8d4ff8dc43bcc293a412a4e423ec6dc4b97ca34a4e2fd38eec01440dd22225a6466b290f0eb2f9e350d + languageName: node + linkType: hard + +"@backstage/core-components@npm:^0.18.15": + version: 0.18.15 + resolution: "@backstage/core-components@npm:0.18.15" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/theme": "npm:^0.7.3" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@dagrejs/dagre": "npm:^1.1.4" + "@date-io/core": "npm:^1.3.13" + "@material-table/core": "npm:^3.1.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@testing-library/dom": "npm:^10.0.0" + "@testing-library/react": "npm:^16.0.0" + "@types/react-sparklines": "npm:^1.7.0" + ansi-regex: "npm:^6.0.1" + classnames: "npm:^2.2.6" + csstype: "npm:^3.0.2" + d3-selection: "npm:^3.0.0" + d3-shape: "npm:^3.0.0" + d3-zoom: "npm:^3.0.0" + js-yaml: "npm:^5.0.0" + linkify-react: "npm:4.3.2" + linkifyjs: "npm:4.3.2" + lodash: "npm:^4.17.21" + parse5: "npm:^6.0.0" + qs: "npm:^6.15.2" + rc-progress: "npm:3.5.1" + react-full-screen: "npm:^1.1.1" + react-helmet: "npm:6.1.0" + react-hook-form: "npm:^7.12.2" + react-idle-timer: "npm:5.7.3" + react-markdown: "npm:^8.0.0" + react-sparklines: "npm:^1.7.0" + react-syntax-highlighter: "npm:^15.4.5" + react-use: "npm:^17.3.2" + react-virtualized-auto-sizer: "npm:^1.0.11" + react-window: "npm:^1.8.6" + rehype-raw: "npm:^6.0.0" + rehype-sanitize: "npm:^5.0.0" + remark-gfm: "npm:^3.0.1" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/65e5fb5f1e610cce5e8260062185964b98f9ca1fe2048bbe3662c756704fcbc081528ab0243ab0063d98a9fc0b6b001c543245ec0e08d5e325c293f99f133f4a + languageName: node + linkType: hard + +"@backstage/core-plugin-api@npm:^1.12.11": + version: 1.12.11 + resolution: "@backstage/core-plugin-api@npm:1.12.11" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + history: "npm:^5.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/395ad29a375cf6528e99e82e4799c67f34242512e98039f6982925760eff0ce03cba5d7e93c769ccc6c289d85a6120860495d65a8650ad971dd92744380f549d + languageName: node + linkType: hard + "@backstage/e2e-test-utils@npm:^0.1.2": version: 0.1.2 resolution: "@backstage/e2e-test-utils@npm:0.1.2" @@ -771,97 +1197,351 @@ __metadata: languageName: node linkType: hard -"@backstage/module-federation-common@npm:^0.1.6": - version: 0.1.6 - resolution: "@backstage/module-federation-common@npm:0.1.6" +"@backstage/frontend-app-api@npm:^0.16.9": + version: 0.16.9 + resolution: "@backstage/frontend-app-api@npm:0.16.9" dependencies: "@backstage/config": "npm:^1.3.10" + "@backstage/core-app-api": "npm:^1.20.6" + "@backstage/core-plugin-api": "npm:^1.12.11" "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-defaults": "npm:^0.5.7" + "@backstage/frontend-plugin-api": "npm:^0.18.2" "@backstage/types": "npm:^1.2.2" - "@module-federation/runtime": "npm:~2.8.2" + "@backstage/version-bridge": "npm:^1.0.12" + lodash: "npm:^4.17.21" peerDependencies: - "@emotion/react": ^11.10.5 - "@material-ui/core": ^4.12.2 - "@material-ui/styles": ^4.10.0 - "@mui/material": ^5.12.2 "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router: ^6.30.2 react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/983edd8a2a828dea76c724b6e94c296f354f31a282933f793158e978af12c6742ed55ef248b91d67741ea56f210d9d09c5003ae3869c35308db682d97d5e7c25 + checksum: 10/037b213e00980fd04aa6e7bb0b6569072de727da0858ee7d51da32e25d4a01cbb123159e48a54d5e7144babc45dcf6020b0f70fb3f5dc685f0c73ea6f0f040a4 languageName: node linkType: hard -"@backstage/plugin-auth-node@npm:^0.7.7": - version: 0.7.7 - resolution: "@backstage/plugin-auth-node@npm:0.7.7" +"@backstage/frontend-defaults@npm:^0.5.5, @backstage/frontend-defaults@npm:^0.5.7": + version: 0.5.7 + resolution: "@backstage/frontend-defaults@npm:0.5.7" dependencies: - "@backstage/backend-plugin-api": "npm:^1.11.0" - "@backstage/catalog-client": "npm:^1.16.3" - "@backstage/catalog-model": "npm:^1.10.2" "@backstage/config": "npm:^1.3.10" + "@backstage/core-components": "npm:^0.18.15" "@backstage/errors": "npm:^1.3.2" - "@backstage/types": "npm:^1.2.2" - "@types/express": "npm:^4.17.6" - "@types/passport": "npm:^1.0.3" - express: "npm:^4.22.0" - jose: "npm:^5.0.0" - lodash: "npm:^4.17.21" - passport: "npm:^0.7.0" - zod: "npm:^3.25.76 || ^4.0.0" - zod-to-json-schema: "npm:^3.25.1" - zod-validation-error: "npm:^5.0.0" - checksum: 10/f6938bf766a5002096c4d89b40dd76068fc078a1007a5a1096ba624d0eca43d6f0ef57a3353630e21a73cce9b473430f2e26c9297feb66cace181c9a6c53806a + "@backstage/frontend-app-api": "npm:^0.16.9" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-app": "npm:^0.5.4" + "@react-hookz/web": "npm:^24.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/72d2e29aef5198ba8c5bc4f532339fecba317c21110bcc6e693c32069c59586241d7c602d6c89e7a19805daf8703155cdeae70c920263d62e018a4c8a7bec5ab languageName: node linkType: hard -"@backstage/plugin-catalog-common@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/plugin-catalog-common@npm:1.2.1" +"@backstage/frontend-dev-utils@npm:^0.1.5": + version: 0.1.7 + resolution: "@backstage/frontend-dev-utils@npm:0.1.7" dependencies: - "@backstage/catalog-model": "npm:^1.10.2" - "@backstage/plugin-permission-common": "npm:^0.9.12" - "@backstage/plugin-search-common": "npm:^1.2.26" - checksum: 10/ccf35e7c2d5cdabc1e97e981673631bb58b878b982193238768359929ccfa8efc8d23977cde23e99480e05cbced232256afb082418c78fc6cb900e6b6cf6ad7b + "@backstage/frontend-defaults": "npm:^0.5.7" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-app": "npm:^0.5.4" + "@backstage/ui": "npm:^0.19.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/aa281e62b063a453d4295547d6abb1e35f0daef00a249ff5efe63653dafc9345d550d9591c38e17d97f4cd00f2ffe1e7ff931342770039e55e304094594d14eb languageName: node linkType: hard -"@backstage/plugin-permission-common@npm:^0.9.12": - version: 0.9.12 - resolution: "@backstage/plugin-permission-common@npm:0.9.12" +"@backstage/frontend-plugin-api@npm:^0.18.0, @backstage/frontend-plugin-api@npm:^0.18.2": + version: 0.18.2 + resolution: "@backstage/frontend-plugin-api@npm:0.18.2" dependencies: "@backstage/config": "npm:^1.3.10" "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" "@backstage/types": "npm:^1.2.2" - cross-fetch: "npm:^4.0.0" - zod: "npm:^3.25.76 || ^4.0.0" - zod-to-json-schema: "npm:^3.25.1" - checksum: 10/abc9b9ee19c9dd18dad75923b8d81cb63c7fe03bac5045f9e8e5af20479903a292452e6d5f0db0cc4dcff6c9cee4e254c3fa0a7c186c14d9aee1651f34c60a6f + "@backstage/version-bridge": "npm:^1.0.12" + "@standard-schema/spec": "npm:^1.1.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/64262714d1f26943bd498ca72ab91da6c24544817c628261bb8d94e80078832d40bf1aae96daed2ddee3ecdebd0bf74cc62bfb731a7713d65b9a9ecb440a2883 languageName: node linkType: hard -"@backstage/plugin-permission-node@npm:^0.11.5": - version: 0.11.5 - resolution: "@backstage/plugin-permission-node@npm:0.11.5" +"@backstage/frontend-test-utils@npm:^0.6.3": + version: 0.6.5 + resolution: "@backstage/frontend-test-utils@npm:0.6.5" dependencies: - "@backstage/backend-plugin-api": "npm:^1.11.0" "@backstage/config": "npm:^1.3.10" - "@backstage/errors": "npm:^1.3.2" + "@backstage/core-app-api": "npm:^1.20.6" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-app-api": "npm:^0.16.9" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-app": "npm:^0.5.4" + "@backstage/plugin-app-react": "npm:^0.2.8" "@backstage/plugin-permission-common": "npm:^0.9.12" - "@standard-schema/spec": "npm:^1.1.0" - "@types/express": "npm:^4.17.6" - express: "npm:^4.22.0" - express-promise-router: "npm:^4.1.0" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/test-utils": "npm:^1.7.23" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + i18next: "npm:^22.4.15" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.7.2" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@testing-library/react": ^16.0.0 + "@types/jest": "*" + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/jest": + optional: true + "@types/react": + optional: true + checksum: 10/f1039e59852a6495cbb60690c0c7ad9262263d58c8d78a6de8ed9b56c65f9afa53f6f04a9f436d95f954daef89ea65aa0c75dbc47d930169bb25bdc8d1e06681 + languageName: node + linkType: hard + +"@backstage/integration-react@npm:^1.2.23": + version: 1.2.23 + resolution: "@backstage/integration-react@npm:1.2.23" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/integration": "npm:^2.1.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/55a931bf267e19c5b939d6009f7cf820d3276d3cb022d78f02941a994b857c9205478c8fc86d4edbdc1d7036c4a87e4cd4b3ec06854c389182060f56a1481430 + languageName: node + linkType: hard + +"@backstage/integration@npm:^2.1.3": + version: 2.1.3 + resolution: "@backstage/integration@npm:2.1.3" + dependencies: + "@azure/identity": "npm:^4.0.0" + "@azure/storage-blob": "npm:^12.5.0" + "@backstage/config": "npm:^1.3.10" + "@backstage/connections": "npm:^0.4.1" + "@backstage/errors": "npm:^1.3.2" + "@octokit/auth-app": "npm:^4.0.0" + "@octokit/rest": "npm:^19.0.3" + cross-fetch: "npm:^4.0.0" + git-url-parse: "npm:^15.0.0" + lodash: "npm:^4.17.21" + luxon: "npm:^3.0.0" + p-throttle: "npm:^4.1.1" + checksum: 10/0b8e3504a62055f3b07d3ada38d58349053b00440ef55d902f275011c9d2d22e110914859edce82f0fa513a86a539017f7937aeaee3cae1c87389ced1ab189f4 + languageName: node + linkType: hard + +"@backstage/module-federation-common@npm:^0.1.6": + version: 0.1.6 + resolution: "@backstage/module-federation-common@npm:0.1.6" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@module-federation/runtime": "npm:~2.8.2" + peerDependencies: + "@emotion/react": ^11.10.5 + "@material-ui/core": ^4.12.2 + "@material-ui/styles": ^4.10.0 + "@mui/material": ^5.12.2 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router: ^6.30.2 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/983edd8a2a828dea76c724b6e94c296f354f31a282933f793158e978af12c6742ed55ef248b91d67741ea56f210d9d09c5003ae3869c35308db682d97d5e7c25 + languageName: node + linkType: hard + +"@backstage/plugin-app-react@npm:^0.2.8": + version: 0.2.8 + resolution: "@backstage/plugin-app-react@npm:0.2.8" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@material-ui/core": "npm:^4.9.13" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/4883a9c7764a05feec5b7447d29d2a1c9c14a8f25ab5b9870763abc00c160435ac53f8c3aaa33514436a982f85ecda095191bfd86d78bbbca0c38397dbc90597 + languageName: node + linkType: hard + +"@backstage/plugin-app@npm:^0.5.4": + version: 0.5.4 + resolution: "@backstage/plugin-app@npm:0.5.4" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/integration-react": "npm:^1.2.23" + "@backstage/plugin-app-react": "npm:^0.2.8" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.9.13" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:^4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + i18next: "npm:^22.4.15" + lodash: "npm:^4.17.21" + motion: "npm:^12.0.0" + prop-types: "npm:^15.7.2" + react-aria: "npm:~3.53.0" + react-stately: "npm:~3.51.0" + react-use: "npm:^17.2.4" + use-sync-external-store: "npm:^1.4.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/4717abf26b08f90327590c7765683dcae6c9ab5fe7cad1f6fbb679c1ffa1d3405e02c0ccdc77f0a2f3d8fcb876ed3e12e8a97afb7ea171f0e6e02c4889d2d72c + languageName: node + linkType: hard + +"@backstage/plugin-auth-node@npm:^0.7.7": + version: 0.7.7 + resolution: "@backstage/plugin-auth-node@npm:0.7.7" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.11.0" + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/passport": "npm:^1.0.3" + express: "npm:^4.22.0" + jose: "npm:^5.0.0" + lodash: "npm:^4.17.21" + passport: "npm:^0.7.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + zod-validation-error: "npm:^5.0.0" + checksum: 10/f6938bf766a5002096c4d89b40dd76068fc078a1007a5a1096ba624d0eca43d6f0ef57a3353630e21a73cce9b473430f2e26c9297feb66cace181c9a6c53806a + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@npm:^1.2.1": + version: 1.2.1 + resolution: "@backstage/plugin-catalog-common@npm:1.2.1" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/plugin-search-common": "npm:^1.2.26" + checksum: 10/ccf35e7c2d5cdabc1e97e981673631bb58b878b982193238768359929ccfa8efc8d23977cde23e99480e05cbced232256afb082418c78fc6cb900e6b6cf6ad7b + languageName: node + linkType: hard + +"@backstage/plugin-permission-common@npm:^0.9.12": + version: 0.9.12 + resolution: "@backstage/plugin-permission-common@npm:0.9.12" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/types": "npm:^1.2.2" + cross-fetch: "npm:^4.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + checksum: 10/abc9b9ee19c9dd18dad75923b8d81cb63c7fe03bac5045f9e8e5af20479903a292452e6d5f0db0cc4dcff6c9cee4e254c3fa0a7c186c14d9aee1651f34c60a6f + languageName: node + linkType: hard + +"@backstage/plugin-permission-node@npm:^0.11.5": + version: 0.11.5 + resolution: "@backstage/plugin-permission-node@npm:0.11.5" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.11.0" + "@backstage/config": "npm:^1.3.10" + "@backstage/errors": "npm:^1.3.2" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@standard-schema/spec": "npm:^1.1.0" + "@types/express": "npm:^4.17.6" + express: "npm:^4.22.0" + express-promise-router: "npm:^4.1.0" zod: "npm:^3.25.76 || ^4.0.0" zod-to-json-schema: "npm:^3.25.1" checksum: 10/66305f637d79c305795acdc3df2214bad3fd013aa11eb6778d6209c16e452ca5e975294aeb4025d4edfde22d9869cc88d5362cb6681ec8e238e305b9e23a624b languageName: node linkType: hard +"@backstage/plugin-permission-react@npm:^0.5.6": + version: 0.5.6 + resolution: "@backstage/plugin-permission-react@npm:0.5.6" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/plugin-permission-common": "npm:^0.9.12" + dataloader: "npm:^2.0.0" + swr: "npm:^2.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/58e1fbda00174234b99bf83376b6ffd7c9546b8f96a11343c1cd3e04f68fd40adcbaee212062c4c0e50103e1e5986bd266e080d951b6823ce361fd841cf71ba1 + languageName: node + linkType: hard + "@backstage/plugin-search-common@npm:^1.2.26": version: 1.2.26 resolution: "@backstage/plugin-search-common@npm:1.2.26" @@ -945,6 +1625,59 @@ __metadata: languageName: node linkType: hard +"@backstage/test-utils@npm:^1.7.23": + version: 1.7.23 + resolution: "@backstage/test-utils@npm:1.7.23" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/core-app-api": "npm:^1.20.6" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + cross-fetch: "npm:^4.0.0" + i18next: "npm:^22.4.15" + zen-observable: "npm:^0.10.0" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@testing-library/react": ^16.0.0 + "@types/jest": "*" + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/jest": + optional: true + "@types/react": + optional: true + checksum: 10/c1721829e5db158e43366f8303c9bb4bdc26db8e2a2062b128c0cdf916ee4a40c377aee484604013ad0cc576ba92c589b9f9cd58cfa284af68234972e291915e + languageName: node + linkType: hard + +"@backstage/theme@npm:^0.7.3": + version: 0.7.3 + resolution: "@backstage/theme@npm:0.7.3" + dependencies: + "@emotion/react": "npm:^11.10.5" + "@emotion/styled": "npm:^11.10.5" + "@mui/material": "npm:^5.12.2" + peerDependencies: + "@material-ui/core": ^4.12.2 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/78977e885149be43a52b12c9c199afcd7dbf9fead62f7630273ad12841955b802bb02ca23f8516bdc7f0e968407228bb6fee07ccef20603679c0801df7e210f6 + languageName: node + linkType: hard + "@backstage/types@npm:^1.2.2": version: 1.2.2 resolution: "@backstage/types@npm:1.2.2" @@ -952,6 +1685,75 @@ __metadata: languageName: node linkType: hard +"@backstage/ui@npm:^0.17.1": + version: 0.17.1 + resolution: "@backstage/ui@npm:0.17.1" + dependencies: + "@backstage/version-bridge": "npm:^1.0.12" + "@braintree/sanitize-url": "npm:^7.1.2" + "@internationalized/date": "npm:^3.12.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@tanstack/react-table": "npm:^8.21.3" + clsx: "npm:^2.1.1" + marked: "npm:^15.0.12" + react-aria: "npm:~3.48.0" + react-aria-components: "npm:~1.17.0" + react-stately: "npm:~3.46.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/2c9ab1b9dcd85dd957b60235e489ec76fe73ecc0356798935e992a2ab6991580f993214d07b995239cb5cecec28fc485665ccaa683e117dd38a070f14409a4eb + languageName: node + linkType: hard + +"@backstage/ui@npm:^0.19.0": + version: 0.19.0 + resolution: "@backstage/ui@npm:0.19.0" + dependencies: + "@backstage/version-bridge": "npm:^1.0.12" + "@braintree/sanitize-url": "npm:^7.1.2" + "@internationalized/date": "npm:^3.12.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@tanstack/react-table": "npm:^8.21.3" + clsx: "npm:^2.1.1" + marked: "npm:^15.0.12" + react-aria: "npm:~3.53.0" + react-aria-components: "npm:~1.22.0" + react-stately: "npm:~3.51.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/4724e910dda37e20778e38aa3be986aafc77c8c37654f6fd6c51591e9dc3c296e53be50cbcea8763f53787a6d083755a634428904dec3e107740215bdb8a1132 + languageName: node + linkType: hard + +"@backstage/version-bridge@npm:^1.0.12": + version: 1.0.12 + resolution: "@backstage/version-bridge@npm:1.0.12" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a577e272e0c5ca1aa6cd5222faa33b44bd98ee9c777ce05d0c9904cc2d70b002be0a8467d8e4228f74fc0da5a95d08d2c413f091e74d34eb3d658b152338692f + languageName: node + linkType: hard + "@borewit/text-codec@npm:^0.2.1": version: 0.2.2 resolution: "@borewit/text-codec@npm:0.2.2" @@ -959,6 +1761,13 @@ __metadata: languageName: node linkType: hard +"@braintree/sanitize-url@npm:^7.1.2": + version: 7.1.2 + resolution: "@braintree/sanitize-url@npm:7.1.2" + checksum: 10/d9626ff8f8eb5e192cd055e6e743449c21102c76bb59e405b7028fe56230fa080bfcc80dfb1e21850a6876e75adda9f7b3c888cf0685942bb74da4d2866d6ec3 + languageName: node + linkType: hard + "@changesets/apply-release-plan@npm:^7.1.1": version: 7.1.1 resolution: "@changesets/apply-release-plan@npm:7.1.1" @@ -1199,6 +2008,40 @@ __metadata: languageName: node linkType: hard +"@dagrejs/dagre@npm:^1.1.4": + version: 1.1.8 + resolution: "@dagrejs/dagre@npm:1.1.8" + dependencies: + "@dagrejs/graphlib": "npm:2.2.4" + checksum: 10/648f60b8d6c05ec3367d1c7a4f2da32b7c26273e40234ce37bace606cd1e4f882ef7947452a0f0df4b34f1bbbc9f3cbae29f0f6af19fbffb8bc9f5e9b97fc3e8 + languageName: node + linkType: hard + +"@dagrejs/graphlib@npm:2.2.4": + version: 2.2.4 + resolution: "@dagrejs/graphlib@npm:2.2.4" + checksum: 10/1fc5393525a3d666284ca740867d082768bc87ff61f5f181eb5c1a73c1a6e328ad23581f7415c81df2614171b8a4b4a8e6a417eefd7f9fca74a4a625ec3aa848 + languageName: node + linkType: hard + +"@date-io/core@npm:1.x, @date-io/core@npm:^1.3.13": + version: 1.3.13 + resolution: "@date-io/core@npm:1.3.13" + checksum: 10/5a9e9d1de20f0346a3c7d2d5946190caef4bfb0b64d82ba1f4c566657a9192667c94ebe7f438d11d4286d9c190974daad4fb2159294225cd8af4d9a140239879 + languageName: node + linkType: hard + +"@date-io/date-fns@npm:^1.3.13": + version: 1.3.13 + resolution: "@date-io/date-fns@npm:1.3.13" + dependencies: + "@date-io/core": "npm:^1.3.13" + peerDependencies: + date-fns: ^2.0.0 + checksum: 10/0b7ce35b2fcc5502b06671a037c1ca9ba8ede4a0f3d9d46cc58acc687484b40fe753a85ed30252c872fa5de75d23b3337ad6f5fe8f09ad0f8d342a5583446642 + languageName: node + linkType: hard + "@electric-sql/pglite@npm:^0.5.8": version: 0.5.11 resolution: "@electric-sql/pglite@npm:0.5.11" @@ -1262,16 +2105,169 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.28.2": - version: 0.28.2 - resolution: "@esbuild/aix-ppc64@npm:0.28.2" - conditions: os=aix & cpu=ppc64 +"@emotion/babel-plugin@npm:^11.13.5": + version: 11.13.5 + resolution: "@emotion/babel-plugin@npm:11.13.5" + dependencies: + "@babel/helper-module-imports": "npm:^7.16.7" + "@babel/runtime": "npm:^7.18.3" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.3.3" + babel-plugin-macros: "npm:^3.1.0" + convert-source-map: "npm:^1.5.0" + escape-string-regexp: "npm:^4.0.0" + find-root: "npm:^1.1.0" + source-map: "npm:^0.5.7" + stylis: "npm:4.2.0" + checksum: 10/cd310568314d886ca328e504f84c4f7f9c7f092ea34a2b43fdb61f84665bf301ba2ef49e0fd1e7ded3d81363d9bbefbb32674ce88b317cfb64db2b65e5ff423f languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.28.2": - version: 0.28.2 - resolution: "@esbuild/android-arm64@npm:0.28.2" +"@emotion/cache@npm:^11.13.5, @emotion/cache@npm:^11.14.0": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10/52336b28a27b07dde8fcdfd80851cbd1487672bbd4db1e24cca1440c95d8a6a968c57b0453c2b7c88d9b432b717f99554dbecc05b5cdef27933299827e69fd8e + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.8.0": + version: 0.8.0 + resolution: "@emotion/hash@npm:0.8.0" + checksum: 10/4b35d88a97e67275c1d990c96d3b0450451d089d1508619488fc0acb882cb1ac91e93246d471346ebd1b5402215941ef4162efe5b51534859b39d8b3a0e3ffaa + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10/379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^1.3.0": + version: 1.4.0 + resolution: "@emotion/is-prop-valid@npm:1.4.0" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + checksum: 10/6fbec4d5cd90b5b68c85047ec1425bccb1fd332df08fa2aea0c15e430c467f01547363ad9108e452ef0494d805074419a7a45c6c866667c39b797f9223e6311d + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 10/038132359397348e378c593a773b1148cd0cf0a2285ffd067a0f63447b945f5278860d9de718f906a74c7c940ba1783ac2ca18f1c06a307b01cc0e3944e783b1 + languageName: node + linkType: hard + +"@emotion/react@npm:^11.10.5": + version: 11.14.0 + resolution: "@emotion/react@npm:11.14.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/cache": "npm:^11.14.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" + hoist-non-react-statics: "npm:^3.3.1" + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/3356c1d66f37f4e7abf88a2be843f6023b794b286c9c99a0aaf1cd1b2b7c50f8d80a2ef77183da737de70150f638e698ff4a2a38ab2d922f868615f1d5761c37 + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.3.3": + version: 1.3.3 + resolution: "@emotion/serialize@npm:1.3.3" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.2" + csstype: "npm:^3.0.2" + checksum: 10/44a2e06fc52dba177d9cf720f7b2c5d45ee4c0d9c09b78302d9a625e758d728ef3ae26f849237fec6f70e9eeb7d87e45a65028e944dc1f877df97c599f1cdaee + languageName: node + linkType: hard + +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10/8ac6e9bf6b373a648f26ae7f1c24041038524f4c72f436f4f8c4761c665e58880c3229d8d89b1f7a4815dd8e5b49634d03e60187cb6f93097d7f7c1859e869d5 + languageName: node + linkType: hard + +"@emotion/styled@npm:^11.10.5": + version: 11.14.1 + resolution: "@emotion/styled@npm:11.14.1" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/is-prop-valid": "npm:^1.3.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" + "@emotion/utils": "npm:^1.4.2" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b20ffaaac76e16538051da8d417f1da75f47f0974000edf0999f39f309b23ee0a91ba7dc1d5f60c4017d29fadfed48631ae4a8f697e3662a88318c667d072117 + languageName: node + linkType: hard + +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10/6851c16edce01c494305f43b2cad7a26b939a821131b7c354e49b8e3b012c8810024755b0f4a03ef51117750309e55339825a97bd10411fb3687e68904769106 + languageName: node + linkType: hard + +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": + version: 1.2.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10/2374999db8d53ef661d61ed1026c42a849632e4f03826f7eba0314c1d92ae342161d737f5045453aa46dd4008e13ccefeba68d3165b667dfad8e5784fcb0c643 + languageName: node + linkType: hard + +"@emotion/utils@npm:^1.4.2": + version: 1.4.2 + resolution: "@emotion/utils@npm:1.4.2" + checksum: 10/e5f3b8bca066b3361a7ad9064baeb9d01ed1bf51d98416a67359b62cb3affec6bb0249802c4ed11f4f8030f93cc4b67506909420bdb110adec6983d712897208 + languageName: node + linkType: hard + +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10/db5da0e89bd752c78b6bd65a1e56231f0abebe2f71c0bd8fc47dff96408f7065b02e214080f99924f6a3bfe7ee15afc48dad999d76df86b39b16e513f7a94f52 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/aix-ppc64@npm:0.28.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm64@npm:0.28.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -1570,6 +2566,52 @@ __metadata: languageName: node linkType: hard +"@internal/backstage-plugin-guided-tour-react@workspace:^, @internal/backstage-plugin-guided-tour-react@workspace:plugins/guided-tour-react": + version: 0.0.0-use.local + resolution: "@internal/backstage-plugin-guided-tour-react@workspace:plugins/guided-tour-react" + dependencies: + "@backstage/cli": "npm:^0.36.5" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/frontend-test-utils": "npm:^0.6.3" + "@backstage/ui": "npm:^0.17.1" + "@braintree/sanitize-url": "npm:^7.1.2" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + marked: "npm:^15.0.12" + react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-router-dom: "npm:^6.30.2" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + languageName: unknown + linkType: soft + +"@internal/backstage-plugin-guided-tour@workspace:plugins/guided-tour": + version: 0.0.0-use.local + resolution: "@internal/backstage-plugin-guided-tour@workspace:plugins/guided-tour" + dependencies: + "@backstage/cli": "npm:^0.36.5" + "@backstage/frontend-defaults": "npm:^0.5.5" + "@backstage/frontend-dev-utils": "npm:^0.1.5" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/frontend-test-utils": "npm:^0.6.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.1" + "@internal/backstage-plugin-guided-tour-react": "workspace:^" + "@remixicon/react": "npm:^4.6.0" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" + react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-aria-components: "npm:~1.17.0" + react-router-dom: "npm:^6.30.2" + zod: "npm:^4.0.0" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + languageName: unknown + linkType: soft + "@internal/guided-tours@workspace:.": version: 0.0.0-use.local resolution: "@internal/guided-tours@workspace:." @@ -1586,6 +2628,33 @@ __metadata: languageName: unknown linkType: soft +"@internationalized/date@npm:^3.12.0, @internationalized/date@npm:^3.12.1, @internationalized/date@npm:^3.12.4": + version: 3.12.4 + resolution: "@internationalized/date@npm:3.12.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/002c10b4cf93d87fbeef83faa232a957f5e04d7e5a1c967db40abbf78a02ac6b61328ce447ada3d6dfb875fbf31acf146625e90d7586d04a43d88759ebfbcca1 + languageName: node + linkType: hard + +"@internationalized/number@npm:^3.6.6, @internationalized/number@npm:^3.6.9": + version: 3.6.9 + resolution: "@internationalized/number@npm:3.6.9" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/8179a770c4fedc951d660bf5c7673aa88e28fed920a24c586bba71e1a5465015ac8a3beb562a35af51d5aa482ddcc22630b13018d0e149c4d3c401a774891772 + languageName: node + linkType: hard + +"@internationalized/string@npm:^3.2.10, @internationalized/string@npm:^3.2.8": + version: 3.2.10 + resolution: "@internationalized/string@npm:3.2.10" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/98687f3a67c09e567794b5236bd43ca987fc1ffab7b0bda906276bff80ba6ebc565a722f67a57e0dcd16e617a704ce1825dca1fd60b10d12d7fc2500a8c86281 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1675,7 +2744,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.13 resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: @@ -1712,14 +2781,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": version: 1.6.0 resolution: "@jridgewell/sourcemap-codec@npm:1.6.0" checksum: 10/eb53fbf7eb4051302a599d6b91425f381168b2856f321336fb00852cea1e0c1904af2610c157b1535e94a61caa98f0bd068d1d0394dd46adf9e9c45c4e11af91 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.31": +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -2044,6 +3113,192 @@ __metadata: languageName: node linkType: hard +"@material-table/core@npm:^3.1.0": + version: 3.2.5 + resolution: "@material-table/core@npm:3.2.5" + dependencies: + "@babel/runtime": "npm:^7.12.5" + "@date-io/date-fns": "npm:^1.3.13" + "@material-ui/pickers": "npm:^3.2.10" + "@material-ui/styles": "npm:^4.11.4" + classnames: "npm:^2.2.6" + date-fns: "npm:^2.16.1" + debounce: "npm:^1.2.0" + fast-deep-equal: "npm:^3.1.3" + prop-types: "npm:^15.7.2" + react-beautiful-dnd: "npm:^13.0.0" + react-double-scrollbar: "npm:0.0.15" + uuid: "npm:^3.4.0" + peerDependencies: + "@date-io/core": ^1.3.13 + "@material-ui/core": ^4.11.2 + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10/6a636d39145fa2a2389923298b7c461aeaa4f970905e23d52ac71b5c3a39537fca76b987aa60fe0a9206206a57e483a81ac0d99cf4ade1efcecd650293e344d3 + languageName: node + linkType: hard + +"@material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.9.13": + version: 4.12.4 + resolution: "@material-ui/core@npm:4.12.4" + dependencies: + "@babel/runtime": "npm:^7.4.4" + "@material-ui/styles": "npm:^4.11.5" + "@material-ui/system": "npm:^4.12.2" + "@material-ui/types": "npm:5.1.0" + "@material-ui/utils": "npm:^4.11.3" + "@types/react-transition-group": "npm:^4.2.0" + clsx: "npm:^1.0.4" + hoist-non-react-statics: "npm:^3.3.2" + popper.js: "npm:1.16.1-lts" + prop-types: "npm:^15.7.2" + react-is: "npm:^16.8.0 || ^17.0.0" + react-transition-group: "npm:^4.4.0" + peerDependencies: + "@types/react": ^16.8.6 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/14ae257e9ca44e8ddbccdbdbb92a2e84b604ee32fdf6a18c1612222278dd7540d4a25a8877ed8881f5f2458b10226bfef93c9a4b904c0ef664a1cf0ab53226cb + languageName: node + linkType: hard + +"@material-ui/icons@npm:^4.9.1": + version: 4.11.3 + resolution: "@material-ui/icons@npm:4.11.3" + dependencies: + "@babel/runtime": "npm:^7.4.4" + peerDependencies: + "@material-ui/core": ^4.0.0 + "@types/react": ^16.8.6 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/be9bf988a8b23e0885ca0c1dc5a4960f6c28f401079dbc13f840f4bd738ef95965cb4f751d609cb6acc819e1c2f8a7293d0a6f26b3685a711506679e4834ab35 + languageName: node + linkType: hard + +"@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.61": + version: 4.0.0-alpha.61 + resolution: "@material-ui/lab@npm:4.0.0-alpha.61" + dependencies: + "@babel/runtime": "npm:^7.4.4" + "@material-ui/utils": "npm:^4.11.3" + clsx: "npm:^1.0.4" + prop-types: "npm:^15.7.2" + react-is: "npm:^16.8.0 || ^17.0.0" + peerDependencies: + "@material-ui/core": ^4.12.1 + "@types/react": ^16.8.6 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f1c05cec33908c9e3c1c5c89e27f8e8cc747c26028b701a87d6c20e0fd9df7ac7632897f370311fc2b54aed3834903243ffdf303b5d74c4d42a646a6784cca5d + languageName: node + linkType: hard + +"@material-ui/pickers@npm:^3.2.10": + version: 3.3.11 + resolution: "@material-ui/pickers@npm:3.3.11" + dependencies: + "@babel/runtime": "npm:^7.6.0" + "@date-io/core": "npm:1.x" + "@types/styled-jsx": "npm:^2.2.8" + clsx: "npm:^1.0.2" + react-transition-group: "npm:^4.0.0" + rifm: "npm:^0.7.0" + peerDependencies: + "@date-io/core": ^1.3.6 + "@material-ui/core": ^4.0.0 + prop-types: ^15.6.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + checksum: 10/f3c4429ec5be97903473a8d7d4171aa92356887c3c58357fd7404e7a74b002a5aa529818ad946049aebb8a1c2a652ee459f4e5be57bec9872778ca810bc8205f + languageName: node + linkType: hard + +"@material-ui/styles@npm:^4.11.4, @material-ui/styles@npm:^4.11.5": + version: 4.11.5 + resolution: "@material-ui/styles@npm:4.11.5" + dependencies: + "@babel/runtime": "npm:^7.4.4" + "@emotion/hash": "npm:^0.8.0" + "@material-ui/types": "npm:5.1.0" + "@material-ui/utils": "npm:^4.11.3" + clsx: "npm:^1.0.4" + csstype: "npm:^2.5.2" + hoist-non-react-statics: "npm:^3.3.2" + jss: "npm:^10.5.1" + jss-plugin-camel-case: "npm:^10.5.1" + jss-plugin-default-unit: "npm:^10.5.1" + jss-plugin-global: "npm:^10.5.1" + jss-plugin-nested: "npm:^10.5.1" + jss-plugin-props-sort: "npm:^10.5.1" + jss-plugin-rule-value-function: "npm:^10.5.1" + jss-plugin-vendor-prefixer: "npm:^10.5.1" + prop-types: "npm:^15.7.2" + peerDependencies: + "@types/react": ^16.8.6 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/dd6ca6d0a9e82fe098581bcf6d70b6b7e0a7bd21f15c5e66f4ddc4d55d5164b7d979cd0eb8164854b845606f4915210027ceb4dfda4ac1649008539d47d70dc9 + languageName: node + linkType: hard + +"@material-ui/system@npm:^4.12.2": + version: 4.12.2 + resolution: "@material-ui/system@npm:4.12.2" + dependencies: + "@babel/runtime": "npm:^7.4.4" + "@material-ui/utils": "npm:^4.11.3" + csstype: "npm:^2.5.2" + prop-types: "npm:^15.7.2" + peerDependencies: + "@types/react": ^16.8.6 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/e4a64e7ab515689053df2f2ba49a8f18f6b4e750446ad5d8f176e853f0a64e26951755424c2daa4277fd454ba395e5e018a98ee55a9b9de2c4492d5f3090385a + languageName: node + linkType: hard + +"@material-ui/types@npm:5.1.0": + version: 5.1.0 + resolution: "@material-ui/types@npm:5.1.0" + peerDependencies: + "@types/react": "*" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/64ac0938ee6f48011ba596f7422ab0660d9a8d9b4f5f183b39bd63185b1ce724209f65580f0af686d59b524603ffa57418ca2d443b69bec894303f80779c61f8 + languageName: node + linkType: hard + +"@material-ui/utils@npm:^4.11.3": + version: 4.11.3 + resolution: "@material-ui/utils@npm:4.11.3" + dependencies: + "@babel/runtime": "npm:^7.4.4" + prop-types: "npm:^15.7.2" + react-is: "npm:^16.8.0 || ^17.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + checksum: 10/fb31d6914c0cd7919da2bc62b3c03302e26f31f7afe5231c80ff93fcf58e4d71cfcafdc042e37c411418fcb25a5e0a5602a586e904b605d3653c4208df5c69df + languageName: node + linkType: hard + "@microsoft/api-documenter@npm:^7.28.1": version: 7.30.18 resolution: "@microsoft/api-documenter@npm:7.30.18" @@ -2364,6 +3619,145 @@ __metadata: languageName: node linkType: hard +"@mui/core-downloads-tracker@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/core-downloads-tracker@npm:5.18.0" + checksum: 10/065b46739d2bd84b880ad2f6a0a2062d60e3a296ce18ff380cad22ab5b2cb3de396755f322f4bea3a422ffffe1a9244536fc3c9623056ff3873c996e6664b1b9 + languageName: node + linkType: hard + +"@mui/material@npm:^5.12.2": + version: 5.18.0 + resolution: "@mui/material@npm:5.18.0" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@mui/core-downloads-tracker": "npm:^5.18.0" + "@mui/system": "npm:^5.18.0" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" + "@popperjs/core": "npm:^2.11.8" + "@types/react-transition-group": "npm:^4.4.10" + clsx: "npm:^2.1.0" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + react-is: "npm:^19.0.0" + react-transition-group: "npm:^4.4.5" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@types/react": + optional: true + checksum: 10/4b72e07c76c7c4b1076db82ef42a06dfab7d73d73f0d272019b2e0b200fc25c27bb295a8672577e1094168054159bed387cf9af74fec30e98aead7d97fad0a57 + languageName: node + linkType: hard + +"@mui/private-theming@npm:^5.17.1": + version: 5.17.1 + resolution: "@mui/private-theming@npm:5.17.1" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@mui/utils": "npm:^5.17.1" + prop-types: "npm:^15.8.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f8b849f545e8ab29eac959f174f56702e5b72ffda85c3b0621750e294a3f64d15873ebdb792cf478564db1c3cf4b366eabcd4156897d811949f2df079b424c8c + languageName: node + linkType: hard + +"@mui/styled-engine@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/styled-engine@npm:5.18.0" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@emotion/cache": "npm:^11.13.5" + "@emotion/serialize": "npm:^1.3.3" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.4.1 + "@emotion/styled": ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + checksum: 10/8468a82bafb6dba40b7a3add845dd49868bcbcda3e9a0226a08f74b715dcbe2360186944ef94c44b2abe85f79335a470c0634195b9e48ccf6b5439df4bc17a90 + languageName: node + linkType: hard + +"@mui/system@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/system@npm:5.18.0" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@mui/private-theming": "npm:^5.17.1" + "@mui/styled-engine": "npm:^5.18.0" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" + clsx: "npm:^2.1.0" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@types/react": + optional: true + checksum: 10/4584a4d4f62ddaecc8b047f1a3b24ecde2ea4198963b5db3c006fd8109cd16085099862dbf935fad545ee146a3c06f119e0dd9bdc987cf45f900bab611a4afe7 + languageName: node + linkType: hard + +"@mui/types@npm:~7.2.15": + version: 7.2.24 + resolution: "@mui/types@npm:7.2.24" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5ed4f90ec62c7df901e58b53011bf6b377b48e13b07de9eeb15c7a6f3f759310f0682b64685c7762f660fad6edf4c8e05595313c93810fc63c54270b899b4a75 + languageName: node + linkType: hard + +"@mui/utils@npm:^5.17.1": + version: 5.17.1 + resolution: "@mui/utils@npm:5.17.1" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@mui/types": "npm:~7.2.15" + "@types/prop-types": "npm:^15.7.12" + clsx: "npm:^2.1.1" + prop-types: "npm:^15.8.1" + react-is: "npm:^19.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/26efae9a9f84a817b016a93ab3e3c3d08533947f62b19d4a5f8cd67ebf6932b1f68c4e4ae677dc0d3397ecd1bf1cc8cb47ab83a345bcaa9b4f45c401ec9d3926 + languageName: node + linkType: hard + "@napi-rs/lzma-linux-x64-gnu@npm:1.5.1": version: 1.5.1 resolution: "@napi-rs/lzma-linux-x64-gnu@npm:1.5.1" @@ -2462,6 +3856,13 @@ __metadata: languageName: node linkType: hard +"@nodable/entities@npm:^3.0.1": + version: 3.1.0 + resolution: "@nodable/entities@npm:3.1.0" + checksum: 10/b07d97b1dac8e0bc8a124ea52cdb6d6a50a8a750592acf540e47c4740a8b96b5add8d9dcce4dfbe74e08b2ab95303c1a2078cf4ba01a085a6de88a879f45576e + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -2524,58 +3925,281 @@ __metadata: languageName: node linkType: hard -"@octokit/endpoint@npm:^9.0.6": - version: 9.0.6 - resolution: "@octokit/endpoint@npm:9.0.6" +"@octokit/auth-app@npm:^4.0.0": + version: 4.0.13 + resolution: "@octokit/auth-app@npm:4.0.13" dependencies: - "@octokit/types": "npm:^13.1.0" + "@octokit/auth-oauth-app": "npm:^5.0.0" + "@octokit/auth-oauth-user": "npm:^2.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/request-error": "npm:^3.0.0" + "@octokit/types": "npm:^9.0.0" + deprecation: "npm:^2.3.1" + lru-cache: "npm:^9.0.0" + universal-github-app-jwt: "npm:^1.1.1" universal-user-agent: "npm:^6.0.0" - checksum: 10/2bf776423365ee926bf3f722a664e52f1070758eff4a176279fb132103fd0c76e3541f83ace49bbad9a64f9c9b8de453be565ca8d6136989e9514dea65380ecf + checksum: 10/0a1064e3a05ad3dea61666e00d5b846b1cea8ff320113bd7e505fbc04439071e3dc8f03444f267febb294bf94c3328338ab58fa3d6ee9710a1dfa3f7c566b539 languageName: node linkType: hard -"@octokit/openapi-types@npm:^24.2.0": - version: 24.2.0 - resolution: "@octokit/openapi-types@npm:24.2.0" - checksum: 10/000897ebc6e247c2591049d6081e95eb5636f73798dadd695ee6048496772b58065df88823e74a760201828545a7ac601dd3c1bcd2e00079a62a9ee9d389409c +"@octokit/auth-oauth-app@npm:^5.0.0": + version: 5.0.6 + resolution: "@octokit/auth-oauth-app@npm:5.0.6" + dependencies: + "@octokit/auth-oauth-device": "npm:^4.0.0" + "@octokit/auth-oauth-user": "npm:^2.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/types": "npm:^9.0.0" + "@types/btoa-lite": "npm:^1.0.0" + btoa-lite: "npm:^1.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/c02875d816a4273ad3ebe65ec6cf75e3a66e458bcb22f6315f9988b9097631db6e4b40391ea7e76fdd84340b1242378620a589a15121b410ccf3c8815ea28776 languageName: node linkType: hard -"@octokit/request-error@npm:^5.1.1": - version: 5.1.1 - resolution: "@octokit/request-error@npm:5.1.1" +"@octokit/auth-oauth-device@npm:^4.0.0": + version: 4.0.5 + resolution: "@octokit/auth-oauth-device@npm:4.0.5" dependencies: - "@octokit/types": "npm:^13.1.0" - deprecation: "npm:^2.0.0" - once: "npm:^1.4.0" - checksum: 10/6ad98626407ba57bb33fa197611be74bee1dd9abc8d5d845648d6a2a04aa6840c0eb7f4be341d55dfcab5bc19181ad5fd25194869a7aaac6245f74b3a14d9662 + "@octokit/oauth-methods": "npm:^2.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/types": "npm:^9.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/0c19613b85f03a432b1a594b1801e693b60f68bebd0d1b2a9d3c979a6745b61ada36fa7fe882ce7d548df3d554741865806ea9b257868a2ef3e07b24ffa70180 languageName: node linkType: hard -"@octokit/request@npm:^8.0.0": - version: 8.4.1 - resolution: "@octokit/request@npm:8.4.1" +"@octokit/auth-oauth-user@npm:^2.0.0": + version: 2.1.2 + resolution: "@octokit/auth-oauth-user@npm:2.1.2" dependencies: - "@octokit/endpoint": "npm:^9.0.6" - "@octokit/request-error": "npm:^5.1.1" - "@octokit/types": "npm:^13.1.0" + "@octokit/auth-oauth-device": "npm:^4.0.0" + "@octokit/oauth-methods": "npm:^2.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/types": "npm:^9.0.0" + btoa-lite: "npm:^1.0.0" universal-user-agent: "npm:^6.0.0" - checksum: 10/2b2c9131cc9b608baeeef8ce2943768cc9db5fbe36a665f734a099bd921561c760e4391fbdf39d5aefb725db26742db1488c65624940ef7cec522e10863caa5e + checksum: 10/9e02a6d813ae62943fb28022094e44d8c86b0f470195919579f0db6d301a0108b573024b37d2c9b44ca623f2ec0d8afcb47224212d8e657f83624c4babc3dfad languageName: node linkType: hard -"@octokit/types@npm:^13.1.0": - version: 13.10.0 - resolution: "@octokit/types@npm:13.10.0" - dependencies: - "@octokit/openapi-types": "npm:^24.2.0" - checksum: 10/32f8f5010d7faae128b0cdd0c221f0ca8c3781fe44483ecd87162b3da507db667f7369acda81340f6e2c9c374d9a938803409c6085c2c01d98210b6c58efb99a +"@octokit/auth-token@npm:^3.0.0": + version: 3.0.4 + resolution: "@octokit/auth-token@npm:3.0.4" + checksum: 10/8e21e567e38ba307fa30497ad77801135e25c328ce8b363c1622a4afb408a7d3315d54082527b38ecd5b3a5449680d89cfca9cb10c516cacf3dfa01e4c8b7195 languageName: node linkType: hard -"@openapitools/openapi-generator-cli@npm:^2.41.0": - version: 2.42.0 - resolution: "@openapitools/openapi-generator-cli@npm:2.42.0" +"@octokit/core@npm:^4.2.1": + version: 4.2.4 + resolution: "@octokit/core@npm:4.2.4" + dependencies: + "@octokit/auth-token": "npm:^3.0.0" + "@octokit/graphql": "npm:^5.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/request-error": "npm:^3.0.0" + "@octokit/types": "npm:^9.0.0" + before-after-hook: "npm:^2.2.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/53ba8f990ce2c0ea4583d8c142377770c3ac8fb9221b563d82dbca9d642f19be49607b9e9b472767075e4afa16c2203339680d75f3ebf5ad853af2646e8604ca + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^7.0.0": + version: 7.0.6 + resolution: "@octokit/endpoint@npm:7.0.6" + dependencies: + "@octokit/types": "npm:^9.0.0" + is-plain-object: "npm:^5.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/e8b9cc09aa8306d63cb0e5b65ac5d29fc421522c92810a9d70bbfef997bc8750fc339f1f4f60e1604c22db77457ea493c51849b0d61cbfcb8655b0c4f2640e4b + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^9.0.6": + version: 9.0.6 + resolution: "@octokit/endpoint@npm:9.0.6" + dependencies: + "@octokit/types": "npm:^13.1.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/2bf776423365ee926bf3f722a664e52f1070758eff4a176279fb132103fd0c76e3541f83ace49bbad9a64f9c9b8de453be565ca8d6136989e9514dea65380ecf + languageName: node + linkType: hard + +"@octokit/graphql@npm:^5.0.0": + version: 5.0.6 + resolution: "@octokit/graphql@npm:5.0.6" + dependencies: + "@octokit/request": "npm:^6.0.0" + "@octokit/types": "npm:^9.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/6014690d184d7b2bfb56ab9be5ddbe4f5c77aa6031d71ec2caf5f56cbd32f4a5b0601049cef7dce1ca8010b89a9fc8bb07ce7833e6213c5bc77b7a564b1f40b9 + languageName: node + linkType: hard + +"@octokit/oauth-authorization-url@npm:^5.0.0": + version: 5.0.0 + resolution: "@octokit/oauth-authorization-url@npm:5.0.0" + checksum: 10/9a8209874369a7389b4e5b22eba1e719d8c7fde05c999670b8c4ffeb1f3948f790778ca11e882cb2b01689a8ae87f68bf220d53470d686186b8af85a0f6f517e + languageName: node + linkType: hard + +"@octokit/oauth-methods@npm:^2.0.0": + version: 2.0.6 + resolution: "@octokit/oauth-methods@npm:2.0.6" + dependencies: + "@octokit/oauth-authorization-url": "npm:^5.0.0" + "@octokit/request": "npm:^6.2.3" + "@octokit/request-error": "npm:^3.0.3" + "@octokit/types": "npm:^9.0.0" + btoa-lite: "npm:^1.0.0" + checksum: 10/42e305d7138709f9ef93e616f908a74018a4e03c41cebc4d55346a2781c96cc95fb8a44845f0b97b12edaeac5f293e76fac39a90f8d922370c900288bae437a5 + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^18.0.0": + version: 18.1.1 + resolution: "@octokit/openapi-types@npm:18.1.1" + checksum: 10/bd2920a238f74c6ccc1e2ee916bd3e17adeeef3bbb1726f821b8722dceaeff5ea2786b3170cc25dd51775cb9179d3cdf448a3526e70b8a1fc21cdd8aa52e5d4c + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^24.2.0": + version: 24.2.0 + resolution: "@octokit/openapi-types@npm:24.2.0" + checksum: 10/000897ebc6e247c2591049d6081e95eb5636f73798dadd695ee6048496772b58065df88823e74a760201828545a7ac601dd3c1bcd2e00079a62a9ee9d389409c + languageName: node + linkType: hard + +"@octokit/plugin-paginate-rest@npm:^6.1.2": + version: 6.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" + dependencies: + "@octokit/tsconfig": "npm:^1.0.2" + "@octokit/types": "npm:^9.2.3" + peerDependencies: + "@octokit/core": ">=4" + checksum: 10/6d5b97fb44a3ed8ff25196b56ebe7bdac64f4023c165792f77938c77876934c01b46e79b83712e26cd3f2f9e36e0735bd3c292a37e8060a2b259f3a6456116dc + languageName: node + linkType: hard + +"@octokit/plugin-request-log@npm:^1.0.4": + version: 1.0.4 + resolution: "@octokit/plugin-request-log@npm:1.0.4" + peerDependencies: + "@octokit/core": ">=3" + checksum: 10/2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c + languageName: node + linkType: hard + +"@octokit/plugin-rest-endpoint-methods@npm:^7.1.2": + version: 7.2.3 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.2.3" + dependencies: + "@octokit/types": "npm:^10.0.0" + peerDependencies: + "@octokit/core": ">=3" + checksum: 10/59fb4e786ab85a5f3ad701e1b193dd3113833cfd1f2657cb06864e45b80a53a1f9ba6c3c66a855c4bf2593c539299fdfe51db639e3a87dc16ffa7602fe9bb999 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^3.0.0, @octokit/request-error@npm:^3.0.3": + version: 3.0.3 + resolution: "@octokit/request-error@npm:3.0.3" + dependencies: + "@octokit/types": "npm:^9.0.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10/5db0b514732686b627e6ed9ef1ccdbc10501f1b271a9b31f784783f01beee70083d7edcfeb35fbd7e569fa31fdd6762b1ff6b46101700d2d97e7e48e749520d0 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^5.1.1": + version: 5.1.1 + resolution: "@octokit/request-error@npm:5.1.1" + dependencies: + "@octokit/types": "npm:^13.1.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10/6ad98626407ba57bb33fa197611be74bee1dd9abc8d5d845648d6a2a04aa6840c0eb7f4be341d55dfcab5bc19181ad5fd25194869a7aaac6245f74b3a14d9662 + languageName: node + linkType: hard + +"@octokit/request@npm:^6.0.0, @octokit/request@npm:^6.2.3": + version: 6.2.8 + resolution: "@octokit/request@npm:6.2.8" + dependencies: + "@octokit/endpoint": "npm:^7.0.0" + "@octokit/request-error": "npm:^3.0.0" + "@octokit/types": "npm:^9.0.0" + is-plain-object: "npm:^5.0.0" + node-fetch: "npm:^2.6.7" + universal-user-agent: "npm:^6.0.0" + checksum: 10/47188fa08d28e5e9e6a22f84058fc13f108cdcb68aea97686da4718d32d3ddda8fde8a5c9f189057e3d466560b67c2305a2e343d1eed9517b47a13f68cb329e7 + languageName: node + linkType: hard + +"@octokit/request@npm:^8.0.0": + version: 8.4.1 + resolution: "@octokit/request@npm:8.4.1" + dependencies: + "@octokit/endpoint": "npm:^9.0.6" + "@octokit/request-error": "npm:^5.1.1" + "@octokit/types": "npm:^13.1.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/2b2c9131cc9b608baeeef8ce2943768cc9db5fbe36a665f734a099bd921561c760e4391fbdf39d5aefb725db26742db1488c65624940ef7cec522e10863caa5e + languageName: node + linkType: hard + +"@octokit/rest@npm:^19.0.3": + version: 19.0.13 + resolution: "@octokit/rest@npm:19.0.13" + dependencies: + "@octokit/core": "npm:^4.2.1" + "@octokit/plugin-paginate-rest": "npm:^6.1.2" + "@octokit/plugin-request-log": "npm:^1.0.4" + "@octokit/plugin-rest-endpoint-methods": "npm:^7.1.2" + checksum: 10/7fbee09a2f832be6802a026713aa93cbf82dcfc8103d68c585b23214caf0accfced6efe2c49169158d39875d5c5ad3994b83b02e26537b75687ac16d0572c212 + languageName: node + linkType: hard + +"@octokit/tsconfig@npm:^1.0.2": + version: 1.0.2 + resolution: "@octokit/tsconfig@npm:1.0.2" + checksum: 10/74d56f3e9f326a8dd63700e9a51a7c75487180629c7a68bbafee97c612fbf57af8347369bfa6610b9268a3e8b833c19c1e4beb03f26db9a9dce31f6f7a19b5b1 + languageName: node + linkType: hard + +"@octokit/types@npm:^10.0.0": + version: 10.0.0 + resolution: "@octokit/types@npm:10.0.0" + dependencies: + "@octokit/openapi-types": "npm:^18.0.0" + checksum: 10/6345e605d30c99639a0207cfc7bea5bf29d9007e93cdcd78be3f8218830a462a0f0fbb976f5c2d9ebe70ee2aa33d1b72243cdb955478581ee2cead059ac4f030 + languageName: node + linkType: hard + +"@octokit/types@npm:^13.1.0": + version: 13.10.0 + resolution: "@octokit/types@npm:13.10.0" + dependencies: + "@octokit/openapi-types": "npm:^24.2.0" + checksum: 10/32f8f5010d7faae128b0cdd0c221f0ca8c3781fe44483ecd87162b3da507db667f7369acda81340f6e2c9c374d9a938803409c6085c2c01d98210b6c58efb99a + languageName: node + linkType: hard + +"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.3": + version: 9.3.2 + resolution: "@octokit/types@npm:9.3.2" + dependencies: + "@octokit/openapi-types": "npm:^18.0.0" + checksum: 10/4bcd18850d5397e5835f5686be88ad95e5d7c23e7d53f898b82a8ca5fc1f6a7b53816ef6f9f3b7a06799c0b030d259bf2bd50a258a1656df2dc7f3e533e334f8 + languageName: node + linkType: hard + +"@openapitools/openapi-generator-cli@npm:^2.41.0": + version: 2.42.0 + resolution: "@openapitools/openapi-generator-cli@npm:2.42.0" dependencies: "@inquirer/select": "npm:1.3.3" "@nestjs/axios": "npm:4.0.1" @@ -2934,6 +4558,13 @@ __metadata: languageName: node linkType: hard +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10/ddd16090cde777aaf102940f05d0274602079a95ad9805bd20bc55dcc7c3a2ba1b99dd5c73e5cc2753c3d31250ca52a67d58059459d7d27debb983a9f552936c + languageName: node + linkType: hard + "@prettier/sync@npm:^0.6.1": version: 0.6.1 resolution: "@prettier/sync@npm:0.6.1" @@ -2945,6 +4576,63 @@ __metadata: languageName: node linkType: hard +"@react-hookz/deep-equal@npm:^1.0.4": + version: 1.0.4 + resolution: "@react-hookz/deep-equal@npm:1.0.4" + checksum: 10/0923e364d309e32ee54e0850471a86488faf149d7a04ee838552cf5d54f493964623a8d742880ec82410cc1105530123f056e66dfc72b7da235d4cc93fad708f + languageName: node + linkType: hard + +"@react-hookz/web@npm:^24.0.0": + version: 24.0.4 + resolution: "@react-hookz/web@npm:24.0.4" + dependencies: + "@react-hookz/deep-equal": "npm:^1.0.4" + peerDependencies: + js-cookie: ^3.0.5 + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 + peerDependenciesMeta: + js-cookie: + optional: true + checksum: 10/6a841c648edbc54b11fd90de9bb61c3059255598fc4a714c508c269a03c4ca9bbf32cf017d3bd2b3a1bf7cd1d9bf4bb56028f64ad455f796079632f4a7cd4f00 + languageName: node + linkType: hard + +"@react-types/shared@npm:^3.34.0, @react-types/shared@npm:^3.37.0": + version: 3.37.0 + resolution: "@react-types/shared@npm:3.37.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/8068dcf7e5990bf8ab70966ce5807e93769edd220f321cb8c49252c52a05906a3633dd09a9a69851e39a80b0e2c5cb1a0f401330ceadc660b501c90551ecace1 + languageName: node + linkType: hard + +"@remix-run/router@npm:1.23.4": + version: 1.23.4 + resolution: "@remix-run/router@npm:1.23.4" + checksum: 10/1b7dd04465a542a8110ee398195ac4b9ac1de5521312f9953041874f0295bf64ff224a0ff88ff36a91c88004529667f566b95fdf94b35fc26b17b1f0d61f03d8 + languageName: node + linkType: hard + +"@remixicon/react@npm:>=4.6.0 <4.9.0": + version: 4.8.0 + resolution: "@remixicon/react@npm:4.8.0" + peerDependencies: + react: ">=18.2.0" + checksum: 10/10241f2e07826ce7d595cf9687a35c96cc9cf9eb68a9431d7dfa1b9df479dbef302874d28c0502cee2a536cf34722de7c49ed12d10a2b071e4e42ba4a278c516 + languageName: node + linkType: hard + +"@remixicon/react@npm:^4.6.0": + version: 4.9.0 + resolution: "@remixicon/react@npm:4.9.0" + peerDependencies: + react: ">=18.2.0" + checksum: 10/3d8f1d86b2bb20ab5e44d15f18811e928b0886f7710eb7a1516afb9913ba72e46facec5dfee382825139d800bcbb6704c15d0c760d0f977c12257d4af8db3295 + languageName: node + linkType: hard + "@rollup/plugin-commonjs@npm:^26.0.0": version: 26.0.3 resolution: "@rollup/plugin-commonjs@npm:26.0.3" @@ -3949,6 +5637,15 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:^0.5.0": + version: 0.5.23 + resolution: "@swc/helpers@npm:0.5.23" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10/899c9761e827d5bf504bd02067596cfe59ad6c7d6b6f0691a2fb05acf3e6c2954ddece7e15d4a6a81e8d95c81500652e6abec326c6c9bbb50bc3e2141696de43 + languageName: node + linkType: hard + "@swc/jest@npm:^0.2.39": version: 0.2.39 resolution: "@swc/jest@npm:0.2.39" @@ -3971,6 +5668,114 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-table@npm:^8.21.3": + version: 8.21.3 + resolution: "@tanstack/react-table@npm:8.21.3" + dependencies: + "@tanstack/table-core": "npm:8.21.3" + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10/a32217ebe64d24e71dea6a6742bc288dcabf389657b16805a1ab3f347d3dca8262759c45c604a1f65bd97925d5cbdfb66d1be7637100a12eb5b279bdd420962d + languageName: node + linkType: hard + +"@tanstack/table-core@npm:8.21.3": + version: 8.21.3 + resolution: "@tanstack/table-core@npm:8.21.3" + checksum: 10/aa05e5f80110f0f56d66161e950668ea6ef3e2ea4f3a2ccd5d5980b39b4feea987245b20531aee2c6743e6edd12c0361503413b63090c807f88a61b19bfd04f3 + languageName: node + linkType: hard + +"@testing-library/dom@npm:^10.0.0": + version: 10.4.2 + resolution: "@testing-library/dom@npm:10.4.2" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + picocolors: "npm:1.1.1" + pretty-format: "npm:^27.0.2" + checksum: 10/3ac24b320ae0e59f48a560bbe279f80e75539641e260d5e1c0455413babcb73a23f7090e9d80fca13933c5bc319fe3e48f61b9c89fbe6d4194f8f58e8bab44d4 + languageName: node + linkType: hard + +"@testing-library/dom@npm:^9.0.0": + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.1.3" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10/510da752ea76f4a10a0a4e3a77917b0302cf03effe576cd3534cab7e796533ee2b0e9fb6fb11b911a1ebd7c70a0bb6f235bf4f816c9b82b95b8fe0cddfd10975 + languageName: node + linkType: hard + +"@testing-library/jest-dom@npm:^6.0.0": + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" + dependencies: + "@adobe/css-tools": "npm:^4.4.0" + aria-query: "npm:^5.0.0" + css.escape: "npm:^1.5.1" + dom-accessibility-api: "npm:^0.6.3" + picocolors: "npm:^1.1.1" + redent: "npm:^3.0.0" + checksum: 10/409b4f519e4c68f4d31e3b0317338cc19098b9029513fca61aa2af8270086ae3956a1eaedd19bbce2d2c9e2cf9ff27a616c06556be7a26e101c0d529a0062233 + languageName: node + linkType: hard + +"@testing-library/react@npm:^14.0.0": + version: 14.3.1 + resolution: "@testing-library/react@npm:14.3.1" + dependencies: + "@babel/runtime": "npm:^7.12.5" + "@testing-library/dom": "npm:^9.0.0" + "@types/react-dom": "npm:^18.0.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10/83359dcdf9eaf067839f34604e1a181cbc14fc09f3a07672403700fcc6a900c4b8054ad1114fc24b4b9f89d84e2a09e1b7c9afce2306b1d4b4c9e30eb1cb12de + languageName: node + linkType: hard + +"@testing-library/react@npm:^16.0.0": + version: 16.3.3 + resolution: "@testing-library/react@npm:16.3.3" + dependencies: + "@babel/runtime": "npm:^7.12.5" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c330e2d8158fd0f4b059cb1cd30f74265c6e80b204cf7245c9b2c4117582d6deb985d51edb62bd1b94e79ef48a2eaba4d002278d06caf725830a8b0f475e0118 + languageName: node + linkType: hard + +"@testing-library/user-event@npm:^14.0.0": + version: 14.6.8 + resolution: "@testing-library/user-event@npm:14.6.8" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10/674190e5d592d5f1478af26c08c13ee197dbbc03885da3b99312c9cd810e4dc9c0ffbd4df91c51f39d467c1866a0c28f451df56d3fd535a5260d7660c24d9f42 + languageName: node + linkType: hard + "@tokenizer/inflate@npm:^0.4.1": version: 0.4.1 resolution: "@tokenizer/inflate@npm:0.4.1" @@ -4015,6 +5820,13 @@ __metadata: languageName: node linkType: hard +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10/c0084c389dc030daeaf0115a92ce43a3f4d42fc8fef2d0e22112d87a42798d4a15aac413019d4a63f868327d52ad6740ab99609462b442fe6b9286b172d2e82e + languageName: node + linkType: hard + "@types/body-parser@npm:*": version: 1.19.6 resolution: "@types/body-parser@npm:1.19.6" @@ -4034,6 +5846,13 @@ __metadata: languageName: node linkType: hard +"@types/btoa-lite@npm:^1.0.0": + version: 1.0.2 + resolution: "@types/btoa-lite@npm:1.0.2" + checksum: 10/4c46b163c881a75522c7556dd7a7df8a0d4c680a45e8bac34e50864e1c2d9df8dc90b99f75199154c60ef2faff90896b7e5f11df6936c94167a3e5e1c6f4d935 + languageName: node + linkType: hard + "@types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" @@ -4053,6 +5872,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.13 + resolution: "@types/debug@npm:4.1.13" + dependencies: + "@types/ms": "npm:*" + checksum: 10/5091d4ebda85236e6f4a6ecea552860e521e11d1d388d3f6255b40726f5a4a7cf1baa0d09f60853838e4cac6c12a13b14114d5f422ccecaee4d1d07dab349900 + languageName: node + linkType: hard + "@types/es-aggregate-error@npm:^1.0.2": version: 1.0.6 resolution: "@types/es-aggregate-error@npm:1.0.6" @@ -4126,6 +5954,26 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^2.0.0": + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" + dependencies: + "@types/unist": "npm:^2" + checksum: 10/41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 + languageName: node + linkType: hard + +"@types/hoist-non-react-statics@npm:^3.3.0": + version: 3.3.7 + resolution: "@types/hoist-non-react-statics@npm:3.3.7" + dependencies: + hoist-non-react-statics: "npm:^3.3.0" + peerDependencies: + "@types/react": "*" + checksum: 10/13f610572c073970b3f43cc446396974fed786fee6eac2d6fd4b0ca5c985f13e79d4a0de58af4e5b4c68470d808567c3a14108d98edb7d526d4d46c8ec851ed1 + languageName: node + linkType: hard + "@types/html-minifier-terser@npm:^6.0.0": version: 6.1.0 resolution: "@types/html-minifier-terser@npm:6.1.0" @@ -4174,6 +6022,13 @@ __metadata: languageName: node linkType: hard +"@types/js-cookie@npm:^3.0.0": + version: 3.0.6 + resolution: "@types/js-cookie@npm:3.0.6" + checksum: 10/272d551687547445cb210213c73e72e0e5d58ad73e2e444a65d688b8ff9425529779ee0cd6492aaa1f070161916d4254ef2b1a76d64179100437f60749d094ef + languageName: node + linkType: hard + "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -4188,6 +6043,16 @@ __metadata: languageName: node linkType: hard +"@types/jsonwebtoken@npm:^9.0.0": + version: 9.0.10 + resolution: "@types/jsonwebtoken@npm:9.0.10" + dependencies: + "@types/ms": "npm:*" + "@types/node": "npm:*" + checksum: 10/d7960d995ad815511c7f4e7f09d91522dfe16e7e800cdd6226c8b1b624c534e0f3b8f8f3beb60e3189865269f028002f1a490189beca5afd02bc96ef1d68f21f + languageName: node + linkType: hard + "@types/luxon@npm:^3.0.0": version: 3.7.6 resolution: "@types/luxon@npm:3.7.6" @@ -4202,6 +6067,15 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^3.0.0": + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" + dependencies: + "@types/unist": "npm:^2" + checksum: 10/050a5c1383928b2688dd145382a22535e2af87dc3fd592c843abb7851bcc99893a1ee0f63be19fc4e89779387ec26a57486cfb425b016c0b2a98a17fc4a1e8b3 + languageName: node + linkType: hard + "@types/mime@npm:^1": version: 1.3.5 resolution: "@types/mime@npm:1.3.5" @@ -4209,6 +6083,13 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10/532d2ebb91937ccc4a89389715e5b47d4c66e708d15942fe6cc25add6dc37b2be058230a327dd50f43f89b8b6d5d52b74685a9e8f70516edfc9bdd6be910eff4 + languageName: node + linkType: hard + "@types/mute-stream@npm:^0.0.4": version: 0.0.4 resolution: "@types/mute-stream@npm:0.0.4" @@ -4252,6 +6133,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^25.2.0": + version: 25.9.9 + resolution: "@types/node@npm:25.9.9" + dependencies: + undici-types: "npm:>=7.24.0 <7.24.7" + checksum: 10/8accbdd15bc035db3b20bf9353dabce847a5d3dd1f3976c25e67907f4fd287b00b8163f661fe48cd6d644e30a11e1dffd67e2742233209c7b7cbc500d14d394c + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -4259,6 +6149,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.0": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: 10/834d40c9b1a8a99a9574b0b3f6629cf48adcff2eda01a35d701f1de5dcf46ce24223684647890aba9f985d6c801b233f878168683de0ae425940403c383fba8f + languageName: node + linkType: hard + "@types/passport@npm:^1.0.3": version: 1.0.17 resolution: "@types/passport@npm:1.0.17" @@ -4268,6 +6165,13 @@ __metadata: languageName: node linkType: hard +"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.3": + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 10/31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 + languageName: node + linkType: hard + "@types/qs@npm:*": version: 6.15.1 resolution: "@types/qs@npm:6.15.1" @@ -4282,17 +6186,66 @@ __metadata: languageName: node linkType: hard -"@types/resolve@npm:1.20.2": - version: 1.20.2 - resolution: "@types/resolve@npm:1.20.2" - checksum: 10/1bff0d3875e7e1557b6c030c465beca9bf3b1173ebc6937cac547654b0af3bb3ff0f16470e9c4d7c5dc308ad9ac8627c38dbff24ef698b66673ff5bd4ead7f7e +"@types/react-dom@npm:^18": + version: 18.3.7 + resolution: "@types/react-dom@npm:18.3.7" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10/317569219366d487a3103ba1e5e47154e95a002915fdcf73a44162c48fe49c3a57fcf7f57fc6979e70d447112681e6b13c6c3c1df289db8b544df4aab2d318f3 languageName: node linkType: hard -"@types/retry@npm:0.12.2": - version: 0.12.2 - resolution: "@types/retry@npm:0.12.2" - checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a +"@types/react-redux@npm:^7.1.20": + version: 7.1.35 + resolution: "@types/react-redux@npm:7.1.35" + dependencies: + "@types/hoist-non-react-statics": "npm:^3.3.0" + "@types/react": "npm:*" + hoist-non-react-statics: "npm:^3.3.0" + redux: "npm:^4.0.0" + checksum: 10/223a28f70abcefed8d849318f2e0e2a993009f994aaf1292881357ab39feb9a491d28649425d6f669baa9e96508f2419845576b2a73e257e4cefb72ae187380f + languageName: node + linkType: hard + +"@types/react-sparklines@npm:^1.7.0": + version: 1.7.5 + resolution: "@types/react-sparklines@npm:1.7.5" + dependencies: + "@types/react": "npm:*" + checksum: 10/e79755fb1ed504d36ca0b6aec4e7ef54eba30448a27c275ef56b55132c37761c11d693f885e248e2e8ba80f294bf9475e7d0e15ce5f5bb2a2219f07f18488409 + languageName: node + linkType: hard + +"@types/react-transition-group@npm:^4.2.0, @types/react-transition-group@npm:^4.4.10": + version: 4.4.12 + resolution: "@types/react-transition-group@npm:4.4.12" + peerDependencies: + "@types/react": "*" + checksum: 10/ea14bc84f529a3887f9954b753843820ac8a3c49fcdfec7840657ecc6a8800aad98afdbe4b973eb96c7252286bde38476fcf64b1c09527354a9a9366e516d9a2 + languageName: node + linkType: hard + +"@types/react@npm:^18": + version: 18.3.31 + resolution: "@types/react@npm:18.3.31" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.2.2" + checksum: 10/0a5d73b1ba3ce73273b28cc50da78d520b1a8d4253075820dc5cf6c9e286ff6cb339b56bd613d05885fec214fbecd8137bddcbdb475612fdcc46e061d88f00fc + languageName: node + linkType: hard + +"@types/resolve@npm:1.20.2": + version: 1.20.2 + resolution: "@types/resolve@npm:1.20.2" + checksum: 10/1bff0d3875e7e1557b6c030c465beca9bf3b1173ebc6937cac547654b0af3bb3ff0f16470e9c4d7c5dc308ad9ac8627c38dbff24ef698b66673ff5bd4ead7f7e + languageName: node + linkType: hard + +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a languageName: node linkType: hard @@ -4361,6 +6314,22 @@ __metadata: languageName: node linkType: hard +"@types/styled-jsx@npm:^2.2.8": + version: 2.2.9 + resolution: "@types/styled-jsx@npm:2.2.9" + dependencies: + "@types/react": "npm:*" + checksum: 10/0e7e9bce8435116168b2470c7599b3b6ad5775c678d5dc06b64b0bc4fe369c59603c794a7298e2ca4e209aa0135f98df89793a3a0778251c1907b34198c55e9e + languageName: node + linkType: hard + +"@types/unist@npm:^2, @types/unist@npm:^2.0.0": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10/6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e + languageName: node + linkType: hard + "@types/urijs@npm:^1.19.19": version: 1.19.26 resolution: "@types/urijs@npm:1.19.26" @@ -4542,6 +6511,17 @@ __metadata: languageName: node linkType: hard +"@typespec/ts-http-runtime@npm:^0.3.0, @typespec/ts-http-runtime@npm:^0.3.4": + version: 0.3.9 + resolution: "@typespec/ts-http-runtime@npm:0.3.9" + dependencies: + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.0" + tslib: "npm:^2.6.2" + checksum: 10/761491f4c797419e5b63081423f5d921e7bff5e4367150a4ff9fe291da6746f825070cd633c0f3e9cc133279126ca3745d3c5254960755e2ca7b5f4967638b3d + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.4.0 resolution: "@ungap/structured-clone@npm:1.4.0" @@ -4700,6 +6680,13 @@ __metadata: languageName: node linkType: hard +"@xobotyi/scrollbar-width@npm:^1.9.5": + version: 1.9.5 + resolution: "@xobotyi/scrollbar-width@npm:1.9.5" + checksum: 10/026ccd174ec3ce032f42794c7e2ee9dab3cfee4f8f9d6ce4f2b4a2fe50cbf8be7406583fb2e203707c699690c5d40a13ee1611f1f67f6ceb01ac2a543acadc30 + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -4989,7 +6976,7 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.1.0, ansi-regex@npm:^6.2.2": +"ansi-regex@npm:^6.0.1, ansi-regex@npm:^6.1.0, ansi-regex@npm:^6.2.2": version: 6.4.0 resolution: "ansi-regex@npm:6.4.0" checksum: 10/8d0305a47218c994a15348d556d358c9a0b3a7abbd51be1c502447813839fb2b0f12700fca9e842acdd79e5740bb2a2d291880b4d770c1634068732a2a3091e5 @@ -5014,6 +7001,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10/d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + "ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.3 resolution: "ansi-styles@npm:6.2.3" @@ -5045,6 +7039,27 @@ __metadata: languageName: node linkType: hard +"anynum@npm:^1.0.1": + version: 1.0.1 + resolution: "anynum@npm:1.0.1" + checksum: 10/096acef76cc8b9f34d43ec37ae9ba7a3d4e2e8c722a0dd59a78995248a8eb4021713ee91b55de106366ac4eaa47578ceb0fffe9829ef01d78b20f9fd6d412a88 + languageName: node + linkType: hard + +"apache-arrow@npm:^21.1.0": + version: 21.2.0 + resolution: "apache-arrow@npm:21.2.0" + dependencies: + "@types/node": "npm:^25.2.0" + flatbuffers: "npm:^25.1.24" + json-with-bigint: "npm:^3.5.3" + tslib: "npm:^2.6.2" + bin: + arrow2csv: bin/arrow2csv.js + checksum: 10/209850cda893c54e87a65d12548120ee1b0ed071682c6113d75aba8a662a2eddfa3d507e8441658842478d56759de2078da3e6a42b57914d37fd53eed2e977b0 + languageName: node + linkType: hard + "argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -5068,14 +7083,41 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.2": +"aria-hidden@npm:^1.2.3": + version: 1.2.6 + resolution: "aria-hidden@npm:1.2.6" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/1914e5a36225dccdb29f0b88cc891eeca736cdc5b0c905ab1437b90b28b5286263ed3a221c75b7dc788f25b942367be0044b2ac8ccf073a72e07a50b1d964202 + languageName: node + linkType: hard + +"aria-query@npm:5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: 10/e5da608a7c4954bfece2d879342b6c218b6b207e2d9e5af270b5e38ef8418f02d122afdc948b68e32649b849a38377785252059090d66fa8081da95d1609c0d2 + languageName: node + linkType: hard + +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10/c3e1ed127cc6886fea4732e97dd6d3c3938e64180803acfb9df8955517c4943760746ffaf4020ce8f7ffaa7556a3b5f85c3769a1f5ca74a1288e02d042f9ae4e + languageName: node + linkType: hard + +"aria-query@npm:^5.0.0, aria-query@npm:^5.3.2": version: 5.3.2 resolution: "aria-query@npm:5.3.2" checksum: 10/b2fe9bc98bd401bc322ccb99717c1ae2aaf53ea0d468d6e7aebdc02fac736e4a99b46971ee05b783b08ade23c675b2d8b60e4a1222a95f6e27bc4d2a0bfdcc03 languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: @@ -5326,6 +7368,24 @@ __metadata: languageName: node linkType: hard +"babel-plugin-macros@npm:^3.1.0": + version: 3.1.0 + resolution: "babel-plugin-macros@npm:3.1.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + cosmiconfig: "npm:^7.0.0" + resolve: "npm:^1.19.0" + checksum: 10/30be6ca45e9a124c58ca00af9a0753e5410ec0b79a737714fc4722bbbeb693e55d9258f05c437145ef4a867c2d1603e06a1c292d66c243ce1227458c8ea2ca8c + languageName: node + linkType: hard + +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 10/aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -5370,6 +7430,13 @@ __metadata: languageName: node linkType: hard +"before-after-hook@npm:^2.2.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: 10/e676f769dbc4abcf4b3317db2fd2badb4a92c0710e0a7da12cf14b59c3482d4febf835ad7de7874499060fd4e13adf0191628e504728b3c5bb4ec7a878c09940 + languageName: node + linkType: hard + "better-path-resolve@npm:1.0.0": version: 1.0.0 resolution: "better-path-resolve@npm:1.0.0" @@ -5608,6 +7675,20 @@ __metadata: languageName: node linkType: hard +"btoa-lite@npm:^1.0.0": + version: 1.0.0 + resolution: "btoa-lite@npm:1.0.0" + checksum: 10/c2d61993b801f8e35a96f20692a45459c753d9baa29d86d1343e714f8d6bbe7069f1a20a5ae868488f3fb137d5bd0c560f6fbbc90b5a71050919d2d2c97c0475 + languageName: node + linkType: hard + +"buffer-equal-constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 10/80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -5702,7 +7783,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": version: 1.0.9 resolution: "call-bind@npm:1.0.9" dependencies: @@ -5767,6 +7848,13 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 10/48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 + languageName: node + linkType: hard + "chalk@npm:2.4.2, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -5802,6 +7890,34 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^1.0.0": + version: 1.1.4 + resolution: "character-entities-legacy@npm:1.1.4" + checksum: 10/fe03a82c154414da3a0c8ab3188e4237ec68006cbcd681cf23c7cfb9502a0e76cd30ab69a2e50857ca10d984d57de3b307680fff5328ccd427f400e559c3a811 + languageName: node + linkType: hard + +"character-entities@npm:^1.0.0": + version: 1.2.4 + resolution: "character-entities@npm:1.2.4" + checksum: 10/7c11641c48d1891aaba7bc800d4500804d91a28f46d64e88c001c38e6ab2e7eae28873a77ae16e6c55d24cac35ddfbb15efe56c3012b86684a3c4e95c70216b7 + languageName: node + linkType: hard + +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: 10/c8dd1f4bf1a92fccf7d2fad9673660a88b37854557d30f6076c32fedfb92d1420208298829ff1d3b6b4fa1c7012e8326c45e7f5c3ed1e9a09ec177593c521b2f + languageName: node + linkType: hard + +"character-reference-invalid@npm:^1.0.0": + version: 1.1.4 + resolution: "character-reference-invalid@npm:1.1.4" + checksum: 10/812ebc5e6e8d08fd2fa5245ae78c1e1a4bea4692e93749d256a135c4a442daf931ca18e067cc61ff4a58a419eae52677126a0bc4f05a511290427d60d3057805 + languageName: node + linkType: hard + "chardet@npm:^2.1.1": version: 2.2.0 resolution: "chardet@npm:2.2.0" @@ -5890,6 +8006,13 @@ __metadata: languageName: node linkType: hard +"classnames@npm:^2.2.6": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 + languageName: node + linkType: hard + "clean-css@npm:^5.2.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" @@ -5976,6 +8099,13 @@ __metadata: languageName: node linkType: hard +"client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 10/0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + "cliui@npm:7.0.4, cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -6016,6 +8146,20 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^1.0.2, clsx@npm:^1.0.4": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 + languageName: node + linkType: hard + +"clsx@npm:^2.0.0, clsx@npm:^2.1.0, clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 + languageName: node + linkType: hard + "code-block-writer@npm:^13.0.3": version: 13.0.3 resolution: "code-block-writer@npm:13.0.3" @@ -6097,6 +8241,20 @@ __metadata: languageName: node linkType: hard +"comma-separated-tokens@npm:^1.0.0": + version: 1.0.8 + resolution: "comma-separated-tokens@npm:1.0.8" + checksum: 10/0adcb07174fa4d08cf0f5c8e3aec40a36b5ff0c2c720e5e23f50fe02e6789d1d00a67036c80e0c1e1539f41d3e7f0101b074039dd833b4e4a59031b659d6ca0d + languageName: node + linkType: hard + +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: 10/e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d + languageName: node + linkType: hard + "command-exists@npm:^1.2.9": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -6301,6 +8459,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10/dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -6322,6 +8487,15 @@ __metadata: languageName: node linkType: hard +"copy-to-clipboard@npm:^3.3.1": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: "npm:^1.0.6" + checksum: 10/e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + "core-js-pure@npm:^3.23.3": version: 3.51.0 resolution: "core-js-pure@npm:3.51.0" @@ -6349,6 +8523,19 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10/03600bb3870c80ed151b7b706b99a1f6d78df8f4bdad9c95485072ea13358ef294b13dd99f9e7bf4cc0b43bcd3599d40df7e648750d21c2f6817ca2cd687e071 + languageName: node + linkType: hard + "cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -6450,6 +8637,15 @@ __metadata: languageName: node linkType: hard +"css-box-model@npm:^1.2.0": + version: 1.2.1 + resolution: "css-box-model@npm:1.2.1" + dependencies: + tiny-invariant: "npm:^1.0.6" + checksum: 10/54778883733e59058b5de983cf442b9db6c1494543d4d84a3defd05b51b991a1865f59e4ae424e733af2aa1fdb6e0bd905cb73db0e7e548fbd89853859fedc81 + languageName: node + linkType: hard + "css-declaration-sorter@npm:^6.3.1": version: 6.4.1 resolution: "css-declaration-sorter@npm:6.4.1" @@ -6459,6 +8655,15 @@ __metadata: languageName: node linkType: hard +"css-in-js-utils@npm:^3.1.0": + version: 3.1.0 + resolution: "css-in-js-utils@npm:3.1.0" + dependencies: + hyphenate-style-name: "npm:^1.0.3" + checksum: 10/bd2f569f1870389004cfacfd7b798c0f40933d34af1f040c391a08322d097790b9a9524affb2ba4d26122e9cb8f4256afb59edb6077dbe607506944a9c673c67 + languageName: node + linkType: hard + "css-loader@npm:^6.5.1": version: 6.11.0 resolution: "css-loader@npm:6.11.0" @@ -6506,6 +8711,16 @@ __metadata: languageName: node linkType: hard +"css-vendor@npm:^2.0.8": + version: 2.0.8 + resolution: "css-vendor@npm:2.0.8" + dependencies: + "@babel/runtime": "npm:^7.8.3" + is-in-browser: "npm:^1.0.2" + checksum: 10/3868a17c84b01f1ad9f6d8a44ca84a44453594ea63202e58b20aef63ead801cad021ab0b7816ff8815506c9cc6f971173433fe56b9d150fa76cab09da3041a50 + languageName: node + linkType: hard + "css-what@npm:^6.0.1": version: 6.2.2 resolution: "css-what@npm:6.2.2" @@ -6513,6 +8728,13 @@ __metadata: languageName: node linkType: hard +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: 10/f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -6592,6 +8814,20 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^2.5.2": + version: 2.6.21 + resolution: "csstype@npm:2.6.21" + checksum: 10/bf9072344fac1b56dc390fbc410b411bbc2a03fa9c3d243a74ff5687f94777f9da03a5681ac01efc2e68b51055e2c7d6a489185a85a8f01c976a85f9eec3b75e + languageName: node + linkType: hard + +"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f + languageName: node + linkType: hard + "ctrlc-windows@npm:^2.1.0": version: 2.2.0 resolution: "ctrlc-windows@npm:2.2.0" @@ -6599,6 +8835,104 @@ __metadata: languageName: node linkType: hard +"d3-color@npm:1 - 3": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 10/536ba05bfd9f4fcd6fa289b5974f5c846b21d186875684637e22bf6855e6aba93e24a2eb3712985c6af3f502fbbfa03708edb72f58142f626241a8a17258e545 + languageName: node + linkType: hard + +"d3-dispatch@npm:1 - 3": + version: 3.0.1 + resolution: "d3-dispatch@npm:3.0.1" + checksum: 10/2b82f41bf4ef88c2f9033dfe32815b67e2ef1c5754a74137a74c7d44d6f0d6ecfa934ac56ed8afe358f6c1f06462e8aa42ca0a388397b5b77a42721570e80487 + languageName: node + linkType: hard + +"d3-drag@npm:2 - 3": + version: 3.0.0 + resolution: "d3-drag@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-selection: "npm:3" + checksum: 10/80bc689935e5a46ee92b2d7f71e1c792279382affed9fbcf46034bff3ff7d3f50cf61a874da4bdf331037292b9e7dca5c6401a605d4bb699fdcb4e0c87e176ec + languageName: node + linkType: hard + +"d3-ease@npm:1 - 3": + version: 3.0.1 + resolution: "d3-ease@npm:3.0.1" + checksum: 10/985d46e868494e9e6806fedd20bad712a50dcf98f357bf604a843a9f6bc17714a657c83dd762f183173dcde983a3570fa679b2bc40017d40b24163cdc4167796 + languageName: node + linkType: hard + +"d3-interpolate@npm:1 - 3": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + checksum: 10/988d66497ef5c190cf64f8c80cd66e1e9a58c4d1f8932d776a8e3ae59330291795d5a342f5a97602782ccbef21a5df73bc7faf1f0dc46a5145ba6243a82a0f0e + languageName: node + linkType: hard + +"d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 10/8e97a9ab4930a05b18adda64cf4929219bac913a5506cf8585631020253b39309549632a5cbeac778c0077994442ddaaee8316ee3f380e7baf7566321b84e76a + languageName: node + linkType: hard + +"d3-selection@npm:2 - 3, d3-selection@npm:3, d3-selection@npm:^3.0.0": + version: 3.0.0 + resolution: "d3-selection@npm:3.0.0" + checksum: 10/0e5acfd305b31628b7be5009ba7303d84bb34817a88ed4dde9c8bd9c23528573fc5272f89fc04e5be03d2cbf5441a248d7274aaf55a8ef3dad46e16333d72298 + languageName: node + linkType: hard + +"d3-shape@npm:^3.0.0": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: "npm:^3.1.0" + checksum: 10/2e861f4d4781ee8abd85d2b435f848d667479dcf01a4e0db3a06600a5bdeddedb240f88229ec7b3bf7fa300c2b3526faeaf7e75f9a24dbf4396d3cc5358ff39d + languageName: node + linkType: hard + +"d3-timer@npm:1 - 3": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 10/004128602bb187948d72c7dc153f0f063f38ac7a584171de0b45e3a841ad2e17f1e40ad396a4af9cce5551b6ab4a838d5246d23492553843d9da4a4050a911e2 + languageName: node + linkType: hard + +"d3-transition@npm:2 - 3": + version: 3.0.1 + resolution: "d3-transition@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + d3-dispatch: "npm:1 - 3" + d3-ease: "npm:1 - 3" + d3-interpolate: "npm:1 - 3" + d3-timer: "npm:1 - 3" + peerDependencies: + d3-selection: 2 - 3 + checksum: 10/02571636acb82f5532117928a87fe25de68f088c38ab4a8b16e495f0f2d08a3fd2937eaebdefdfcf7f1461545524927d2632d795839b88d2e4c71e387aaaffac + languageName: node + linkType: hard + +"d3-zoom@npm:^3.0.0": + version: 3.0.0 + resolution: "d3-zoom@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-drag: "npm:2 - 3" + d3-interpolate: "npm:1 - 3" + d3-selection: "npm:2 - 3" + d3-transition: "npm:2 - 3" + checksum: 10/0e6e5c14e33c4ecdff311a900dd037dea407734f2dd2818988ed6eae342c1799e8605824523678bd404f81e37824cc588f62dbde46912444c89acc7888036c6b + languageName: node + linkType: hard + "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -6646,6 +8980,29 @@ __metadata: languageName: node linkType: hard +"dataloader@npm:^2.0.0": + version: 2.2.3 + resolution: "dataloader@npm:2.2.3" + checksum: 10/83fe6259abe00ae64c5f48252ef59d8e5fcabda9fd4d26685f14a76eeca596bf6f9500d9f22a0094c50c3ea782a0977728f9367e232dfa0fdb5c9d646de279b2 + languageName: node + linkType: hard + +"date-fns@npm:^2.16.1": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": "npm:^7.21.0" + checksum: 10/70b3e8ea7aaaaeaa2cd80bd889622a4bcb5d8028b4de9162cbcda359db06e16ff6e9309e54eead5341e71031818497f19aaf9839c87d1aba1e27bb4796e758a9 + languageName: node + linkType: hard + +"debounce@npm:^1.2.0": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 10/0b95b2a9d80ed69117d890f8dab8c0f2d6066f8d20edd1d810ae51f8f366a6d4c8b1d56e97dcb9304e93d57de4d5db440d34a03def7dad50403fc3f22bf16808 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.6.0": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -6655,7 +9012,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -6688,6 +9045,15 @@ __metadata: languageName: node linkType: hard +"decode-named-character-reference@npm:^1.0.0": + version: 1.3.0 + resolution: "decode-named-character-reference@npm:1.3.0" + dependencies: + character-entities: "npm:^2.0.0" + checksum: 10/82eb1208abf59d1f1e368285b6880201a3c3f147a4d7ce74e44cd41374ef00c9a376e8595e38002031db63291f91f7f3ff56b9724f715befff8f5566593d6de0 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -6697,6 +9063,32 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:^2.0.5": + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.5" + es-get-iterator: "npm:^1.1.3" + get-intrinsic: "npm:^1.2.2" + is-arguments: "npm:^1.1.1" + is-array-buffer: "npm:^3.0.2" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + isarray: "npm:^2.0.5" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + side-channel: "npm:^1.0.4" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.13" + checksum: 10/1ce49d0b71d0f14d8ef991a742665eccd488dfc9b3cada069d4d7a86291e591c92d2589c832811dea182b4015736b210acaaebce6184be356c1060d176f5a05f + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -6725,7 +9117,7 @@ __metadata: languageName: node linkType: hard -"default-browser@npm:^5.2.1": +"default-browser@npm:^5.2.1, default-browser@npm:^5.5.1": version: 5.5.1 resolution: "default-browser@npm:5.5.1" dependencies: @@ -6821,15 +9213,22 @@ __metadata: languageName: node linkType: hard -"deprecation@npm:^2.0.0": +"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": version: 2.3.1 resolution: "deprecation@npm:2.3.1" checksum: 10/f56a05e182c2c195071385455956b0c4106fe14e36245b00c689ceef8e8ab639235176a96977ba7c74afb173317fac2e0ec6ec7a1c6d1e6eaa401c586c714132 languageName: node linkType: hard -"des.js@npm:^1.0.0": - version: 1.1.0 +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10/6ff05a7561f33603df87c45e389c9ac0a95e3c056be3da1a0c4702149e3a7f6fe5ffbb294478687ba51a9e95f3a60e8b6b9005993acd79c292c7d15f71964b6b + languageName: node + linkType: hard + +"des.js@npm:^1.0.0": + version: 1.1.0 resolution: "des.js@npm:1.1.0" dependencies: inherits: "npm:^2.0.1" @@ -6879,6 +9278,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0": + version: 5.2.2 + resolution: "diff@npm:5.2.2" + checksum: 10/8a885b38113d96138d87f6cb474ee959b7e9ab33c0c4cb1b07dcf019ec544945a2309d53d721532af020de4b3a58fb89f1026f64f42f9421aa9c3ae48a36998b + languageName: node + linkType: hard + "diff@npm:^9.0.0": version: 9.0.0 resolution: "diff@npm:9.0.0" @@ -6940,6 +9346,20 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 10/377b4a7f9eae0a5d72e1068c369c99e0e4ca17fdfd5219f3abd32a73a590749a267475a59d7b03a891f9b673c27429133a818c44b2e47e32fec024b34274e2ca + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: 10/83d3371f8226487fbad36e160d44f1d9017fb26d46faba6a06fcad15f34633fc827b8c3e99d49f71d5f3253d866e2131826866fd0a3c86626f8eccfc361881ff + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -6949,6 +9369,16 @@ __metadata: languageName: node linkType: hard +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: 10/bed2341adf8864bf932b3289c24f35fdd99930af77df46688abf2d753ff291df49a15850c874d686d9be6ec4e1c6835673906e64dbd8b2839d227f117a11fd41 + languageName: node + linkType: hard + "dom-serializer@npm:^1.0.1": version: 1.4.1 resolution: "dom-serializer@npm:1.4.1" @@ -7041,6 +9471,15 @@ __metadata: languageName: node linkType: hard +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/878e1aab8a42773320bc04c6de420bee21aebd71810e40b1799880a8a1c4594bcd6adc3d4213a0fb8147d4c3f529d8f9a618d7f59ad5a9a41b142058aceda23f + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -7300,6 +9739,23 @@ __metadata: languageName: node linkType: hard +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + has-symbols: "npm:^1.0.3" + is-arguments: "npm:^1.1.1" + is-map: "npm:^2.0.2" + is-set: "npm:^2.0.2" + is-string: "npm:^1.0.7" + isarray: "npm:^2.0.5" + stop-iteration-iterator: "npm:^1.0.0" + checksum: 10/bc2194befbe55725f9489098626479deee3c801eda7e83ce0dff2eb266a28dc808edb9b623ff01d31ebc1328f09d661333d86b601036692c2e3c1a6942319433 + languageName: node + linkType: hard + "es-iterator-helpers@npm:^1.2.1": version: 1.4.0 resolution: "es-iterator-helpers@npm:1.4.0" @@ -7513,6 +9969,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10/20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e + languageName: node + linkType: hard + "escodegen@npm:^2.1.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -7891,7 +10354,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.2.0": +"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -7986,7 +10449,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:3.0.2": +"extend@npm:3.0.2, extend@npm:^3.0.0": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -8055,6 +10518,13 @@ __metadata: languageName: node linkType: hard +"fast-shallow-equal@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-shallow-equal@npm:1.0.0" + checksum: 10/ae89318ce43c0c46410d9511ac31520d59cfe675bad3d0b1cb5f900b2d635943d788b8370437178e91ae0d0412decc394229c03e69925ade929a8c02da241610 + languageName: node + linkType: hard + "fast-uri@npm:^3.0.1": version: 3.1.9 resolution: "fast-uri@npm:3.1.9" @@ -8062,6 +10532,39 @@ __metadata: languageName: node linkType: hard +"fast-xml-builder@npm:^1.2.0": + version: 1.3.1 + resolution: "fast-xml-builder@npm:1.3.1" + dependencies: + path-expression-matcher: "npm:^1.6.2" + xml-naming: "npm:^0.3.0" + checksum: 10/6e2774b07a089c325dbf9d193325a1bf78592e7f3877dfdb643f4898d89a154aa17054cea7270b8b3cc4a7a1145988b0d8a5a974c7086f0e28a6af22a536f55f + languageName: node + linkType: hard + +"fast-xml-parser@npm:^5.5.9": + version: 5.11.2 + resolution: "fast-xml-parser@npm:5.11.2" + dependencies: + "@nodable/entities": "npm:^3.0.1" + fast-xml-builder: "npm:^1.2.0" + is-unsafe: "npm:^2.0.0" + path-expression-matcher: "npm:^1.6.2" + strnum: "npm:^2.4.2" + xml-naming: "npm:^0.3.0" + bin: + fxparser: src/cli/cli.js + checksum: 10/aa88bd2af831876b458a51c302a84f83a92bbd747606a1f0a85f7085461e2f3c52cb7438f4ef2dc136fbcb0cb33d450d007178a24b23c148d8a84b5ccfb70c58 + languageName: node + linkType: hard + +"fastest-stable-stringify@npm:^2.0.2": + version: 2.0.2 + resolution: "fastest-stable-stringify@npm:2.0.2" + checksum: 10/41bb381c0eab1419eb353658c0d78cb79a4e99ef8f53ec5d36b131f076e62ff3cdca6d22888640c55ea3382ae2c93d8629a67f5734655442976708448a8c2500 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.20.3 resolution: "fastq@npm:1.20.3" @@ -8071,6 +10574,15 @@ __metadata: languageName: node linkType: hard +"fault@npm:^1.0.0": + version: 1.0.4 + resolution: "fault@npm:1.0.4" + dependencies: + format: "npm:^0.2.0" + checksum: 10/5ac610d8b09424e0f2fa8cf913064372f2ee7140a203a79957f73ed557c0e79b1a3d096064d7f40bde8132a69204c1fe25ec23634c05c6da2da2039cff26c4e7 + languageName: node + linkType: hard + "faye-websocket@npm:^0.11.3": version: 0.11.4 resolution: "faye-websocket@npm:0.11.4" @@ -8162,6 +10674,13 @@ __metadata: languageName: node linkType: hard +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10/caa799c976a14925ba7f31ca1a226fe73d3aa270f4f1b623fcfeb1c6e263111db4beb807d8acd31bd4d48d44c343b93688a9288dfbccca27463c36a0301b0bb9 + languageName: node + linkType: hard + "find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -8202,6 +10721,13 @@ __metadata: languageName: node linkType: hard +"flatbuffers@npm:^25.1.24": + version: 25.9.23 + resolution: "flatbuffers@npm:25.9.23" + checksum: 10/e2086e7f9b04f7932a93f6935347d8cdca0cbdcb582cd23b2b7c55aa1f831c6e33ba595c49bebe25767a945fc4698984840692baa470d61db4484e06aac4df15 + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.4.4 resolution: "flatted@npm:3.4.4" @@ -8305,6 +10831,13 @@ __metadata: languageName: node linkType: hard +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 10/5f878b8fc1a672c8cbefa4f293bdd977c822862577d70d53456a48b4169ec9b51677c0c995bf62c633b4e5cd673624b7c273f57923b28735a6c0c0a72c382a4a + languageName: node + linkType: hard + "formatly@npm:^0.3.0": version: 0.3.0 resolution: "formatly@npm:0.3.0" @@ -8323,6 +10856,28 @@ __metadata: languageName: node linkType: hard +"framer-motion@npm:^12.43.0": + version: 12.43.0 + resolution: "framer-motion@npm:12.43.0" + dependencies: + motion-dom: "npm:^12.43.0" + motion-utils: "npm:^12.39.0" + tslib: "npm:^2.4.0" + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10/c8013cae9f1eec14af4fa769c6589a3af08ad7b4e7e0e9b67010d4a75ca12c347b8c735750ba798f6c5df09251e4c1f60c7650d24fb6fddc6328d022cdd7f11d + languageName: node + linkType: hard + "fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -8447,6 +11002,13 @@ __metadata: languageName: node linkType: hard +"fscreen@npm:^1.0.2": + version: 1.2.0 + resolution: "fscreen@npm:1.2.0" + checksum: 10/ac50f9ac52a157b8fe6aaecdf9efa7c1cfa90b42a76c3bc6b85372fab05c5a9cd72c1b7f4c2e273eba1a0e630e381fd72ae135fcc57acd05a0943d5d0c21b451 + languageName: node + linkType: hard + "fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -8527,7 +11089,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" dependencies: @@ -8603,6 +11165,25 @@ __metadata: languageName: node linkType: hard +"git-up@npm:^7.0.0": + version: 7.0.0 + resolution: "git-up@npm:7.0.0" + dependencies: + is-ssh: "npm:^1.4.0" + parse-url: "npm:^8.1.0" + checksum: 10/003ef38424702ac4cbe6d2817ccfb5811251244c955a8011ca40298d12cf1fb6529529f074d5832b5221e193ec05f4742ecf7806e6c4f41a81a2f2cff65d6bf4 + languageName: node + linkType: hard + +"git-url-parse@npm:^15.0.0": + version: 15.0.0 + resolution: "git-url-parse@npm:15.0.0" + dependencies: + git-up: "npm:^7.0.0" + checksum: 10/b6e54fc58bb4f4c9bfb1060ec93c3d1462880c6bec76926978e32b2bbfac3535001c87efd1ef0dca9cd9ee0ffdaacba2f50dc4f7032ba09ad92d93e9acc9936b + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -8902,6 +11483,112 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "hast-util-from-parse5@npm:7.1.2" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/unist": "npm:^2.0.0" + hastscript: "npm:^7.0.0" + property-information: "npm:^6.0.0" + vfile: "npm:^5.0.0" + vfile-location: "npm:^4.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10/7a90a16430a1482ed1be5c2f8b182e8b12aee8834781245b101700b5a04cea8b569cf40ef08214e1eb333249432e861b17e6fe46d0447b5281827c8798e86f1a + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^2.0.0": + version: 2.2.5 + resolution: "hast-util-parse-selector@npm:2.2.5" + checksum: 10/22ee4afbd11754562144cb3c4f3ec52524dafba4d90ee52512902d17cf11066d83b38f7bdf6ca571bbc2541f07ba30db0d234657b6ecb8ca4631587466459605 + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^3.0.0": + version: 3.1.1 + resolution: "hast-util-parse-selector@npm:3.1.1" + dependencies: + "@types/hast": "npm:^2.0.0" + checksum: 10/511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 + languageName: node + linkType: hard + +"hast-util-raw@npm:^7.2.0": + version: 7.2.3 + resolution: "hast-util-raw@npm:7.2.3" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/parse5": "npm:^6.0.0" + hast-util-from-parse5: "npm:^7.0.0" + hast-util-to-parse5: "npm:^7.0.0" + html-void-elements: "npm:^2.0.0" + parse5: "npm:^6.0.0" + unist-util-position: "npm:^4.0.0" + unist-util-visit: "npm:^4.0.0" + vfile: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/fe39d4b9e68de7131ec61e9abe887cc0579dc7491f738735150c6021565fc998e37c9d096e97fc35c769e986e04b721d4724835ee82fcc22076d778acf6c4832 + languageName: node + linkType: hard + +"hast-util-sanitize@npm:^4.0.0": + version: 4.1.0 + resolution: "hast-util-sanitize@npm:4.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + checksum: 10/8258ba32be9e57e871f894d3c6b3187dd98e0682bf1382cd1306c20045cd5dc209589919817dc079803d9a259b420d9cd88771535088c9fe0eea122028c348eb + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^7.0.0": + version: 7.1.0 + resolution: "hast-util-to-parse5@npm:7.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/695539881431f9713ca4a0be7d06bf3e57ae4d9f930eccba371534c50cff11855d345f8ec30099d04482637ad82e3c70d480269bfa4c109f37993536e8ea690d + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "hast-util-whitespace@npm:2.0.1" + checksum: 10/ad5a61f4e81330413d4182247e158d77408a076994fbe7257574ea6489728bb4138c83e00482051c941973d4ed3049729afb35600debfc6d1d945c40453685f7 + languageName: node + linkType: hard + +"hastscript@npm:^6.0.0": + version: 6.0.0 + resolution: "hastscript@npm:6.0.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^1.0.0" + hast-util-parse-selector: "npm:^2.0.0" + property-information: "npm:^5.0.0" + space-separated-tokens: "npm:^1.0.0" + checksum: 10/78f91b71e50506f7499c8275d67645f9f4f130e6f12b038853261d1fa7393432da4113baf3508c41b79d933f255089d6d593beea9d4cda89dfd34d0a498cf378 + languageName: node + linkType: hard + +"hastscript@npm:^7.0.0": + version: 7.2.0 + resolution: "hastscript@npm:7.2.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^3.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10/98740e0b69b4765a23d0174fb93eb1c1bdcae6a9f1c9e1b07de6aca2d578427a42e1d45ee98eda26463ac58ff73a8ce45af19c4eb8b5f6f768a9c8543964d28f + languageName: node + linkType: hard + "he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -8911,13 +11598,29 @@ __metadata: languageName: node linkType: hard -"highlight.js@npm:^10.7.1": +"highlight.js@npm:^10.4.1, highlight.js@npm:^10.7.1, highlight.js@npm:~10.7.0": version: 10.7.3 resolution: "highlight.js@npm:10.7.3" checksum: 10/db8d10a541936b058e221dbde77869664b2b45bca75d660aa98065be2cd29f3924755fbc7348213f17fd931aefb6e6597448ba6fe82afba6d8313747a91983ee languageName: node linkType: hard +"highlightjs-vue@npm:^1.0.0": + version: 1.0.0 + resolution: "highlightjs-vue@npm:1.0.0" + checksum: 10/44c9187a19fa3c7eac16bf1d327c03cb07c4b444f744624eaf873eb55e4e449a0bb6573b8ba5982006b65743707d6cad39cfc404f3fe5fb8aeb740a57ff6bc24 + languageName: node + linkType: hard + +"history@npm:^5.0.0": + version: 5.3.0 + resolution: "history@npm:5.3.0" + dependencies: + "@babel/runtime": "npm:^7.7.6" + checksum: 10/52ba685b842ca6438ff11ef459951eb13d413ae715866a8dc5f7c3b1ea0cdeb8db6aabf7254551b85f56abc205e6e2d7e1d5afb36b711b401cdaff4f2cf187e9 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -8929,6 +11632,15 @@ __metadata: languageName: node linkType: hard +"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10/1acbe85f33e5a39f90c822ad4d28b24daeb60f71c545279431dc98c312cd28a54f8d64788e477fe21dc502b0e3cf58589ebe5c1ad22af27245370391c2d24ea6 + languageName: node + linkType: hard + "hoopy@npm:^0.1.4": version: 0.1.4 resolution: "hoopy@npm:0.1.4" @@ -8972,6 +11684,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^2.0.0": + version: 2.0.1 + resolution: "html-void-elements@npm:2.0.1" + checksum: 10/06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.6.3": version: 5.6.8 resolution: "html-webpack-plugin@npm:5.6.8" @@ -9130,7 +11849,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -9156,6 +11875,22 @@ __metadata: languageName: node linkType: hard +"hyphenate-style-name@npm:^1.0.3": + version: 1.1.0 + resolution: "hyphenate-style-name@npm:1.1.0" + checksum: 10/b9ed74e29181d96bd58a2d0e62fc4a19879db591dba268275829ff0ae595fcdf11faafaeaa63330a45c3004664d7db1f0fc7cdb372af8ee4615ed8260302c207 + languageName: node + linkType: hard + +"i18next@npm:^22.4.15": + version: 22.5.1 + resolution: "i18next@npm:22.5.1" + dependencies: + "@babel/runtime": "npm:^7.20.6" + checksum: 10/ab1a0adee97911917fc46fb4216b8eb7c4ec0a243966609dda6a384e4b22acd25386a817dc51146328d5272ce1c6133558361788ebc4a36fbca250b8b3e90bd1 + languageName: node + linkType: hard + "iconv-lite@npm:0.7.3, iconv-lite@npm:^0.7.0": version: 0.7.3 resolution: "iconv-lite@npm:0.7.3" @@ -9309,6 +12044,22 @@ __metadata: languageName: node linkType: hard +"inline-style-parser@npm:0.1.1": + version: 0.1.1 + resolution: "inline-style-parser@npm:0.1.1" + checksum: 10/e661f4fb6824a41076c4d23358e8b581fd3410fbfb9baea4cb542a85448b487691c3b9bbb58ad73a95613041ca616f059595f19cadd0c22476a1fffa79842b48 + languageName: node + linkType: hard + +"inline-style-prefixer@npm:^7.0.1": + version: 7.0.1 + resolution: "inline-style-prefixer@npm:7.0.1" + dependencies: + css-in-js-utils: "npm:^3.1.0" + checksum: 10/a430c962693f32a36bcec0124c9798bcf3725bb90468d493108c0242446a9cc92ff1967bdf99b6ce5331e7a9b75e6836bc9ba1b3d4756876b8ef48036acb2509 + languageName: node + linkType: hard + "inquirer@npm:^8.2.0": version: 8.2.7 resolution: "inquirer@npm:8.2.7" @@ -9371,7 +12122,24 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": +"is-alphabetical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphabetical@npm:1.0.4" + checksum: 10/6508cce44fd348f06705d377b260974f4ce68c74000e7da4045f0d919e568226dc3ce9685c5a2af272195384df6930f748ce9213fc9f399b5d31b362c66312cb + languageName: node + linkType: hard + +"is-alphanumerical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphanumerical@npm:1.0.4" + dependencies: + is-alphabetical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + checksum: 10/e2e491acc16fcf5b363f7c726f666a9538dba0a043665740feb45bba1652457a73441e7c5179c6768a638ed396db3437e9905f403644ec7c468fb41f4813d03f + languageName: node + linkType: hard + +"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": version: 1.2.0 resolution: "is-arguments@npm:1.2.0" dependencies: @@ -9381,7 +12149,7 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" dependencies: @@ -9440,6 +12208,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^2.0.0": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 10/3261a8b858edcc6c9566ba1694bf829e126faa88911d1c0a747ea658c5d81b14b6955e3a702d59dabadd58fdd440c01f321aa71d6547105fd21d03f94d0597e7 + languageName: node + linkType: hard + "is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -9467,7 +12242,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.1.0": +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": version: 1.1.0 resolution: "is-date-object@npm:1.1.0" dependencies: @@ -9477,6 +12252,13 @@ __metadata: languageName: node linkType: hard +"is-decimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-decimal@npm:1.0.4" + checksum: 10/ed483a387517856dc395c68403a10201fddcc1b63dc56513fbe2fe86ab38766120090ecdbfed89223d84ca8b1cd28b0641b93cb6597b6e8f4c097a7c24e3fb96 + languageName: node + linkType: hard + "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -9549,6 +12331,27 @@ __metadata: languageName: node linkType: hard +"is-hexadecimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-hexadecimal@npm:1.0.4" + checksum: 10/a452e047587b6069332d83130f54d30da4faf2f2ebaa2ce6d073c27b5703d030d58ed9e0b729c8e4e5b52c6f1dab26781bb77b7bc6c7805f14f320e328ff8cd5 + languageName: node + linkType: hard + +"is-in-browser@npm:^1.0.2, is-in-browser@npm:^1.1.3": + version: 1.1.3 + resolution: "is-in-browser@npm:1.1.3" + checksum: 10/f7411dbea0875ac609a794e28a545d654331e2a51f42a8c1629abbedf21ecb642ca726a4a9c8be28f9854990a764693483652b65612ccf7b5bc68aa4657e9a26 + languageName: node + linkType: hard + +"is-in-ssh@npm:^1.0.0": + version: 1.0.0 + resolution: "is-in-ssh@npm:1.0.0" + checksum: 10/d55cb39afdbca0cdc94cd493da7819c00d35048ea04fc1624aabde6e0c86aa6b91ddb38b2baf73c4b5d53cc8fbf1a8dfbf2e315594a808474b751ffb6b0d3e58 + languageName: node + linkType: hard + "is-inside-container@npm:^1.0.0": version: 1.0.0 resolution: "is-inside-container@npm:1.0.0" @@ -9574,7 +12377,7 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.3": +"is-map@npm:^2.0.2, is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" checksum: 10/8de7b41715b08bcb0e5edb0fb9384b80d2d5bcd10e142188f33247d19ff078abaf8e9b6f858e2302d8d05376a26a55cd23a3c9f8ab93292b02fcd2cc9e4e92bb @@ -9643,6 +12446,20 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10/6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.1.0 + resolution: "is-plain-object@npm:5.1.0" + checksum: 10/100adc3c2a7ef53968957346aecd1ee427053e1cfa5a12a0b6e49466dd86703d9f52440772f0aa296539691ac164deadfdff5c24c7cadb8635c6a00a9fcaf7ba + languageName: node + linkType: hard + "is-promise@npm:^4.0.0": version: 4.0.0 resolution: "is-promise@npm:4.0.0" @@ -9659,7 +12476,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.2.1": +"is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" dependencies: @@ -9678,14 +12495,14 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.3": +"is-set@npm:^2.0.2, is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" checksum: 10/5685df33f0a4a6098a98c72d94d67cad81b2bc72f1fb2091f3d9283c4a1c582123cd709145b02a9745f0ce6b41e3e43f1c944496d1d74d4ea43358be61308669 languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.4": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: @@ -9694,7 +12511,16 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.1.1": +"is-ssh@npm:^1.4.0": + version: 1.4.1 + resolution: "is-ssh@npm:1.4.1" + dependencies: + protocols: "npm:^2.0.1" + checksum: 10/f60910cd83fa94e9874655a672c3849312c12af83c0fe3dbff9945755fe838a73985d8f94e32ebf5626ba4148ee10eef51b7240b0218dbb6e9a43a06899b0529 + languageName: node + linkType: hard + +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" dependencies: @@ -9740,6 +12566,13 @@ __metadata: languageName: node linkType: hard +"is-unsafe@npm:^2.0.0": + version: 2.0.2 + resolution: "is-unsafe@npm:2.0.2" + checksum: 10/ebd5b9abfa1e66b221649c9e7f6ed5f1de51dc9913a5c35b192be81b2aeeccb99ef97ae11535d1aa32817e43f73538fb9271c709148f634173b78cebe2eebd2e + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -9961,6 +12794,13 @@ __metadata: languageName: node linkType: hard +"js-cookie@npm:^3.0.0": + version: 3.0.8 + resolution: "js-cookie@npm:3.0.8" + checksum: 10/6bc10dc1ef0ad4780cd43a0413702d0b8d9d8d167c4fb605ae66c388270dece6b4cad4c8944654cc67b6e0e7639da379a7b48e7b7ad8711a80f60aba6a915548 + languageName: node + linkType: hard + "js-tokens@npm:^10.0.0": version: 10.0.0 resolution: "js-tokens@npm:10.0.0" @@ -10016,6 +12856,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -10071,6 +12920,13 @@ __metadata: languageName: node linkType: hard +"json-with-bigint@npm:^3.5.3": + version: 3.5.12 + resolution: "json-with-bigint@npm:3.5.12" + checksum: 10/096a98e435311ab7cdc645769b949cda0cc723b2f1fd0dd5e86839432a703e804a99136da658536e86b876a85d193a87066352e6723dbcc498439fc6c3c34d5c + languageName: node + linkType: hard + "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -10151,41 +13007,166 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" +"jsonwebtoken@npm:^9.0.0, jsonwebtoken@npm:^9.0.2": + version: 9.0.3 + resolution: "jsonwebtoken@npm:9.0.3" dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flat: "npm:^1.3.1" - object.assign: "npm:^4.1.4" - object.values: "npm:^1.1.6" - checksum: 10/b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc + jws: "npm:^4.0.1" + lodash.includes: "npm:^4.3.0" + lodash.isboolean: "npm:^3.0.3" + lodash.isinteger: "npm:^4.0.4" + lodash.isnumber: "npm:^3.0.3" + lodash.isplainobject: "npm:^4.0.6" + lodash.isstring: "npm:^4.0.1" + lodash.once: "npm:^4.0.0" + ms: "npm:^2.1.1" + semver: "npm:^7.5.4" + checksum: 10/a67a276db41fbfb458ebdc4938d5d7b01d4743e16bda0f25ac01996fe5b5819d66656153f6cfce19b4680b79ae9f9ca185965defc22e77e0abddf443573238d6 languageName: node linkType: hard -"just-diff@npm:^6.0.2": - version: 6.0.2 - resolution: "just-diff@npm:6.0.2" - checksum: 10/4c6b14d6be2a3391b020ea2b3d1a0acf2f4c60fcb16681c7f6f76d4c0f1841fae5b00c1a2e719980992e46320e4b6c55a4713683cb1873dd41a2621f08c9f8e8 +"jss-plugin-camel-case@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-camel-case@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + hyphenate-style-name: "npm:^1.0.3" + jss: "npm:10.10.0" + checksum: 10/b4d68391316d41200881d3923ba771740be091b2feca09440470e5a5dc0260ce9adff8996b11e1f1c860eb20eed2fc89ae0b5813478b40c9d46a4e9142ffed81 languageName: node linkType: hard -"keytar@npm:^7.9.0": - version: 7.9.0 - resolution: "keytar@npm:7.9.0" +"jss-plugin-default-unit@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-default-unit@npm:10.10.0" dependencies: - node-addon-api: "npm:^4.3.0" - node-gyp: "npm:latest" - prebuild-install: "npm:^7.0.1" - checksum: 10/904795bc304f8ad89b80f915c869a941a383312b58584212a199473d18647035cfda92a9c53e6c53bf13ea0fed23037c9597eb418a5c71ee9454f140f026fac9 + "@babel/runtime": "npm:^7.3.1" + jss: "npm:10.10.0" + checksum: 10/7784f8b3668a99e27480b7baa28ec974f721438c67fd11f2a12851f1b0965d7a5116b473f5d34114276b14548fcea673c41467f62e136a3c4018be0bc1582a9c languageName: node linkType: hard -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" +"jss-plugin-global@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-global@npm:10.10.0" dependencies: - json-buffer: "npm:3.0.1" + "@babel/runtime": "npm:^7.3.1" + jss: "npm:10.10.0" + checksum: 10/c0c2653ea340cd4bc2eb38a7d427bab001e6dd0dde1cf934c70ce624bd3e928f63a1917bcea59da714267dee6e424255b9079f6ca4c5e8aa4ccd726f2a53f9ba + languageName: node + linkType: hard + +"jss-plugin-nested@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-nested@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + jss: "npm:10.10.0" + tiny-warning: "npm:^1.0.2" + checksum: 10/834b795330edf1c4bbddfad68703bc436c7678bad3cebe724395c07abc4d0bd9b6f665d4c90819cab122531363024c8f53d61ae210ae1a26de1222da01f200b3 + languageName: node + linkType: hard + +"jss-plugin-props-sort@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-props-sort@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + jss: "npm:10.10.0" + checksum: 10/89eebe2bc4f58e763c3e3e9f96a54df87cc762a3c027b638459100dc880bfd3461092b1893de0946f6938e21b9fd3ffa3357e94ec6dd7c52ea3eefe3a9fbcb65 + languageName: node + linkType: hard + +"jss-plugin-rule-value-function@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-rule-value-function@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + jss: "npm:10.10.0" + tiny-warning: "npm:^1.0.2" + checksum: 10/71cc09090fb1bb2170c8db79aa8844bc7e348f97d0ac6b7937e668d7725c7088da0758bd701997c829e22a5ef291ddb9e5bd19f27ead7f86ecd85601f854bdd6 + languageName: node + linkType: hard + +"jss-plugin-vendor-prefixer@npm:^10.5.1": + version: 10.10.0 + resolution: "jss-plugin-vendor-prefixer@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + css-vendor: "npm:^2.0.8" + jss: "npm:10.10.0" + checksum: 10/c497a32b756652853319cf3f5509688512b01010164145b2748a3f6748291eec9bd414970ef1371a8a41991083f966f0d30f46be6e1283e12c2bedc3923b1755 + languageName: node + linkType: hard + +"jss@npm:10.10.0, jss@npm:^10.5.1": + version: 10.10.0 + resolution: "jss@npm:10.10.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + csstype: "npm:^3.0.2" + is-in-browser: "npm:^1.1.3" + tiny-warning: "npm:^1.0.2" + checksum: 10/a08605d8e023cf0e67a53d00c03c4e52419e314020fcd0b27728986c3bf5c148d85447797980ab2d9a36288d907909fc6939f91fef5341a51976bc5ff11d147b + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10/b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc + languageName: node + linkType: hard + +"just-diff@npm:^6.0.2": + version: 6.0.2 + resolution: "just-diff@npm:6.0.2" + checksum: 10/4c6b14d6be2a3391b020ea2b3d1a0acf2f4c60fcb16681c7f6f76d4c0f1841fae5b00c1a2e719980992e46320e4b6c55a4713683cb1873dd41a2621f08c9f8e8 + languageName: node + linkType: hard + +"jwa@npm:^2.0.1": + version: 2.0.1 + resolution: "jwa@npm:2.0.1" + dependencies: + buffer-equal-constant-time: "npm:^1.0.1" + ecdsa-sig-formatter: "npm:1.0.11" + safe-buffer: "npm:^5.0.1" + checksum: 10/b04312a1de85f912b96aa3a7211717b8336945fab5b4f7cbc7800f4c80934060c0a3111576fad8d76e41ad62887d6da4b21fd4c47e45c174197f8be7dc0c1694 + languageName: node + linkType: hard + +"jws@npm:^4.0.1": + version: 4.0.1 + resolution: "jws@npm:4.0.1" + dependencies: + jwa: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10/75d7b157489fa9a72023712c58a7a7706c7e2b10eec27fabd3bb9cae0c9e492251ab72527d20a8a5f5726196f0508c320c643fddff7076657f6bca16d0ceeeeb + languageName: node + linkType: hard + +"keytar@npm:^7.9.0": + version: 7.9.0 + resolution: "keytar@npm:7.9.0" + dependencies: + node-addon-api: "npm:^4.3.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.0.1" + checksum: 10/904795bc304f8ad89b80f915c869a941a383312b58584212a199473d18647035cfda92a9c53e6c53bf13ea0fed23037c9597eb418a5c71ee9454f140f026fac9 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 languageName: node linkType: hard @@ -10204,6 +13185,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^4.0.3": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10/44d84cc4eedd4311099402ef6d4acd9b2d16e08e499d6ef3bb92389bd4692d7ef09e35248c26e27f98acac532122acb12a1bfee645994ae3af4f0a37996da7df + languageName: node + linkType: hard + "knex-pglite@npm:^0.14.0": version: 0.14.0 resolution: "knex-pglite@npm:0.14.0" @@ -10343,6 +13331,23 @@ __metadata: languageName: node linkType: hard +"linkify-react@npm:4.3.2": + version: 4.3.2 + resolution: "linkify-react@npm:4.3.2" + peerDependencies: + linkifyjs: ^4.0.0 + react: ">= 15.0.0" + checksum: 10/cdf3942af0d291db6dc67adccbce381bbe7ce2eb5c2a06b9ee92a19323f540284e1768ef1df369b7aabc5d6894310addddafb8e53226f50d376b36cd4ddbd598 + languageName: node + linkType: hard + +"linkifyjs@npm:4.3.2": + version: 4.3.2 + resolution: "linkifyjs@npm:4.3.2" + checksum: 10/b03477486658d1e5531bf65ee1fdc0f79423594e689184c67b8a63c75d9f35d1cd0344edd97d5799502cde4f3163d620e2cbd9e72ad718c6a95084177c004386 + languageName: node + linkType: hard + "load-esm@npm:1.0.3": version: 1.0.3 resolution: "load-esm@npm:1.0.3" @@ -10421,6 +13426,48 @@ __metadata: languageName: node linkType: hard +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 10/45e0a7c7838c931732cbfede6327da321b2b10482d5063ed21c020fa72b09ca3a4aa3bda4073906ab3f436cf36eb85a52ea3f08b7bab1e0baca8235b0e08fe51 + languageName: node + linkType: hard + +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: 10/b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 + languageName: node + linkType: hard + +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 10/c971f5a2d67384f429892715550c67bac9f285604a0dd79275fd19fef7717aec7f2a6a33d60769686e436ceb9771fd95fe7fcb68ad030fc907d568d5a3b65f70 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 10/913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 10/29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: 10/eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -10435,6 +13482,13 @@ __metadata: languageName: node linkType: hard +"lodash.once@npm:^4.0.0": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: 10/202f2c8c3d45e401b148a96de228e50ea6951ee5a9315ca5e15733d5a07a6b1a02d9da1e7fdf6950679e17e8ca8f7190ec33cae47beb249b0c50019d753f38f3 + languageName: node + linkType: hard + "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -10473,7 +13527,14 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.4.0": +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 10/d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -10493,6 +13554,16 @@ __metadata: languageName: node linkType: hard +"lowlight@npm:^1.17.0": + version: 1.20.0 + resolution: "lowlight@npm:1.20.0" + dependencies: + fault: "npm:^1.0.0" + highlight.js: "npm:~10.7.0" + checksum: 10/3294677be15bbc256556f097d9b675f23f14309aceeada7880473c57bdbdd7761f200d903fe26d8fa5e82259f70a39465d1d40754c4c049ad2bbd33d77e2c06f + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -10514,6 +13585,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^9.0.0": + version: 9.1.2 + resolution: "lru-cache@npm:9.1.2" + checksum: 10/8830ad333f5202656e712d40df16a4dbd373a489821c1f22d5dc2b3cf49820734cf814e7fd89bbda80ecb32e1bfd716e2dc2d78fae0dd7b55fe65ffd0158edd7 + languageName: node + linkType: hard + "luxon@npm:^3.0.0": version: 3.7.2 resolution: "luxon@npm:3.7.2" @@ -10521,6 +13599,15 @@ __metadata: languageName: node linkType: hard +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 10/e86f0280e99a8d8cd4eef24d8601ddae15ce54e43ac9990dfcb79e1e081c255ad24424a30d78d2ad8e51a8ce82a66a930047fed4b4aa38c6f0b392ff9300edfc + languageName: node + linkType: hard + "magic-string@npm:^0.30.21, magic-string@npm:^0.30.3": version: 0.30.21 resolution: "magic-string@npm:0.30.21" @@ -10564,6 +13651,13 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^3.0.0": + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: 10/bc699819e6a15607e5def0f21aa862aa061cf1f49877baa93b0185574f6ab143591afe0e18b94d9b15ea80c6a693894150dbccfacf4f6767160dc32ae393dfe0 + languageName: node + linkType: hard + "marked-terminal@npm:^7.3.0": version: 7.3.0 resolution: "marked-terminal@npm:7.3.0" @@ -10608,6 +13702,170 @@ __metadata: languageName: node linkType: hard +"mdast-util-definitions@npm:^5.0.0": + version: 5.1.2 + resolution: "mdast-util-definitions@npm:5.1.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + unist-util-visit: "npm:^4.0.0" + checksum: 10/4491b7c551ce1bdeb6c8fb1968cd461acb01ca1584f12c240755541a92d7f02bc5b9c9d6303d50deaed6d959ba58fe9a352a3e676e0f1d954e003de1277f57e4 + languageName: node + linkType: hard + +"mdast-util-find-and-replace@npm:^2.0.0": + version: 2.2.2 + resolution: "mdast-util-find-and-replace@npm:2.2.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + escape-string-regexp: "npm:^5.0.0" + unist-util-is: "npm:^5.0.0" + unist-util-visit-parents: "npm:^5.0.0" + checksum: 10/59e11e853b74d8f6083950327df39e27287b383930ff836298a5100aeda5568282bb45046c27886d2156ea101580bb0689b890c29623cefa5adc74e95d9ca9ff + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^1.0.0": + version: 1.3.1 + resolution: "mdast-util-from-markdown@npm:1.3.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + decode-named-character-reference: "npm:^1.0.0" + mdast-util-to-string: "npm:^3.1.0" + micromark: "npm:^3.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-decode-string: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + unist-util-stringify-position: "npm:^3.0.0" + uvu: "npm:^0.5.0" + checksum: 10/1d334a54ddd6481ec4acf64c2c537b6463bc5113ba5a408f65c228dcc302d46837352814f11307af0f8b51dd7e4a0b887ce692e4d30ff31ff9d578b8ca82810b + languageName: node + linkType: hard + +"mdast-util-gfm-autolink-literal@npm:^1.0.0": + version: 1.0.3 + resolution: "mdast-util-gfm-autolink-literal@npm:1.0.3" + dependencies: + "@types/mdast": "npm:^3.0.0" + ccount: "npm:^2.0.0" + mdast-util-find-and-replace: "npm:^2.0.0" + micromark-util-character: "npm:^1.0.0" + checksum: 10/272d075cdc7937bec0179af4052bd9032a6fbb05608b387b1b075b0491c73ce012f3ff1c718cdb5fb0ed1032c1fa7570d955b59c0ab3c3c72609928754774529 + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^1.0.0": + version: 1.0.2 + resolution: "mdast-util-gfm-footnote@npm:1.0.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-to-markdown: "npm:^1.3.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + checksum: 10/825f207afc98fd1daa0acc8adcb5754d1f0d577ccb1749245289bee7c892557668d8ee3a5ab618f42e710646cf018dcda84f3c0c608ae11718e9014e5bf4f9dc + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^1.0.0": + version: 1.0.3 + resolution: "mdast-util-gfm-strikethrough@npm:1.0.3" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-to-markdown: "npm:^1.3.0" + checksum: 10/a9c2dc3ef46be7952d13b7063a16171bba8aa266bffe6b1e7267df02a60b4fa3734115cca311e9127db8cfcbbcd68fdd92aa26152bcd0c14372c79b254e4df2f + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^1.0.0": + version: 1.0.7 + resolution: "mdast-util-gfm-table@npm:1.0.7" + dependencies: + "@types/mdast": "npm:^3.0.0" + markdown-table: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^1.0.0" + mdast-util-to-markdown: "npm:^1.3.0" + checksum: 10/167f7f7a9dc17ce852f4f9bd155d7be179588e2ccf4ce3c4f23b12c1c9db5de904cdacc6f41b2d635cb84eb09a7ff5a33497585f2664a7f1e6bd6f7ab7e1197a + languageName: node + linkType: hard + +"mdast-util-gfm-task-list-item@npm:^1.0.0": + version: 1.0.2 + resolution: "mdast-util-gfm-task-list-item@npm:1.0.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-to-markdown: "npm:^1.3.0" + checksum: 10/958417a7d7690728b44d65127ab9189c7feaa17aea924dd56a888c781ab3abaa4eb0c209f05c4dbf203da3d0c4df8fdace4c9471b644268bfc7fc792a018a171 + languageName: node + linkType: hard + +"mdast-util-gfm@npm:^2.0.0": + version: 2.0.2 + resolution: "mdast-util-gfm@npm:2.0.2" + dependencies: + mdast-util-from-markdown: "npm:^1.0.0" + mdast-util-gfm-autolink-literal: "npm:^1.0.0" + mdast-util-gfm-footnote: "npm:^1.0.0" + mdast-util-gfm-strikethrough: "npm:^1.0.0" + mdast-util-gfm-table: "npm:^1.0.0" + mdast-util-gfm-task-list-item: "npm:^1.0.0" + mdast-util-to-markdown: "npm:^1.0.0" + checksum: 10/70e6cd32af94181d409f171f984f83fc18b3efe316844c62f31816f5c1612a92517b8ed766340f23e0a6d6cb0f27a8b07d288bab6619cbdbb0c5341006bcdc4d + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + unist-util-is: "npm:^5.0.0" + checksum: 10/c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^12.1.0": + version: 12.3.0 + resolution: "mdast-util-to-hast@npm:12.3.0" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-definitions: "npm:^5.0.0" + micromark-util-sanitize-uri: "npm:^1.1.0" + trim-lines: "npm:^3.0.0" + unist-util-generated: "npm:^2.0.0" + unist-util-position: "npm:^4.0.0" + unist-util-visit: "npm:^4.0.0" + checksum: 10/82b72bf46863f0f5683dbf1c5917186ee2da2e06af1a5f5aaeca51b880f4cb2b3ae0463ebb4fa1a776f5d3c73f5fc6cd542920060cf5040f3d4431607ee73cce + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^1.0.0, mdast-util-to-markdown@npm:^1.3.0": + version: 1.5.0 + resolution: "mdast-util-to-markdown@npm:1.5.0" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^3.0.0" + mdast-util-to-string: "npm:^3.0.0" + micromark-util-decode-string: "npm:^1.0.0" + unist-util-visit: "npm:^4.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/713f674588a01969a2ce524a69985bd57e507377eea2c4ba69800fb305414468b30144ae9b837fbdde8c609877673140e4f56f6cabe9e0e2bc1487291e3c5144 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": + version: 3.2.0 + resolution: "mdast-util-to-string@npm:3.2.0" + dependencies: + "@types/mdast": "npm:^3.0.0" + checksum: 10/fafe201c12a0d412a875fe8540bf70b4360f3775fb7f0d19403ba7b59e50f74f730e3b405c72ad940bc8a3ec1ba311f76dfca61c4ce585dce1ccda2168ec244f + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -10653,6 +13911,13 @@ __metadata: languageName: node linkType: hard +"memoize-one@npm:>=3.1.1 <6, memoize-one@npm:^5.1.1": + version: 5.2.1 + resolution: "memoize-one@npm:5.2.1" + checksum: 10/b7141dc148b5c6fdd51e77ecf0421fd2581681eb8756e0b3dfbd4fe765b5e2b5a6bc90214bb6f19a96b6aed44de17eda3407142a7be9e24ccd0774bbd9874d1b + languageName: node + linkType: hard + "merge-descriptors@npm:1.0.3": version: 1.0.3 resolution: "merge-descriptors@npm:1.0.3" @@ -10674,10 +13939,339 @@ __metadata: languageName: node linkType: hard -"methods@npm:^1.0.0, methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10/a385dd974faa34b5dd021b2bbf78c722881bf6f003bfe6d391d7da3ea1ed625d1ff10ddd13c57531f628b3e785be38d3eed10ad03cebd90b76932413df9a1820 +"methods@npm:^1.0.0, methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10/a385dd974faa34b5dd021b2bbf78c722881bf6f003bfe6d391d7da3ea1ed625d1ff10ddd13c57531f628b3e785be38d3eed10ad03cebd90b76932413df9a1820 + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-core-commonmark@npm:1.1.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-factory-destination: "npm:^1.0.0" + micromark-factory-label: "npm:^1.0.0" + micromark-factory-space: "npm:^1.0.0" + micromark-factory-title: "npm:^1.0.0" + micromark-factory-whitespace: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-chunked: "npm:^1.0.0" + micromark-util-classify-character: "npm:^1.0.0" + micromark-util-html-tag-name: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-resolve-all: "npm:^1.0.0" + micromark-util-subtokenize: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.1" + uvu: "npm:^0.5.0" + checksum: 10/a73694d223ac8baad8ff00597a3c39d61f5b32bfd56fe4bcf295d75b2a4e8e67fb2edbfc7cc287b362b9d7f6d24fce08b6a7e8b5b155d79bcc1e4d9b2756ffb2 + languageName: node + linkType: hard + +"micromark-extension-gfm-autolink-literal@npm:^1.0.0": + version: 1.0.5 + resolution: "micromark-extension-gfm-autolink-literal@npm:1.0.5" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/1e0ccc758baef3cd0478ba84ff86fa1ec2b389042421c7cade9485b775456c1a9c3bd797393002b2c6f6abd9bdf829cb114874557bbcb8e43d16d06a464811c0 + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^1.0.0": + version: 1.1.2 + resolution: "micromark-extension-gfm-footnote@npm:1.1.2" + dependencies: + micromark-core-commonmark: "npm:^1.0.0" + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/8777073fb76d2fd01f6b2405106af6c349c1e25660c4d37cadcc61c187d71c8444870f73cefaaa67f12884d5e45c78ee3c5583561a0b330bd91c6d997113584a + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^1.0.0": + version: 1.0.7 + resolution: "micromark-extension-gfm-strikethrough@npm:1.0.7" + dependencies: + micromark-util-chunked: "npm:^1.0.0" + micromark-util-classify-character: "npm:^1.0.0" + micromark-util-resolve-all: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/8411ef1aa5dc83f662e8b45b085f70ddff29deb3c4259269e8a1ff656397abb755d8ea841a14be23e8585a31d3c0a5de1bd2c05f3453b66670e499d4a0004f5e + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^1.0.0": + version: 1.0.7 + resolution: "micromark-extension-gfm-table@npm:1.0.7" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/f05d86a099c941a2a309d60bf4839d16a00a93cb880cda4ab8faeb831647763fff6e03197ec15b80e1f195002afcca6afe2b95c3622b049b82d7ff8ef1c1c776 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^1.0.0": + version: 1.0.2 + resolution: "micromark-extension-gfm-tagfilter@npm:1.0.2" + dependencies: + micromark-util-types: "npm:^1.0.0" + checksum: 10/55c7d9019d6a39efaaed2c2e40b0aaa137d2c4f9c94cac82e93f509a806c3a775e4c815b5d8e986617450b68861a19776e4b886307e83db452b393f15a837b39 + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^1.0.0": + version: 1.0.5 + resolution: "micromark-extension-gfm-task-list-item@npm:1.0.5" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/46bb1baa10bfb785a2e3e2f975e5509260b9995d5c3aeddf77051957d218ce1af4ea737bcb6a56a930e62d42b05307b20632a400eff25cdb290789ff3170cad5 + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-extension-gfm@npm:2.0.3" + dependencies: + micromark-extension-gfm-autolink-literal: "npm:^1.0.0" + micromark-extension-gfm-footnote: "npm:^1.0.0" + micromark-extension-gfm-strikethrough: "npm:^1.0.0" + micromark-extension-gfm-table: "npm:^1.0.0" + micromark-extension-gfm-tagfilter: "npm:^1.0.0" + micromark-extension-gfm-task-list-item: "npm:^1.0.0" + micromark-util-combine-extensions: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/3ffd06ced4314abd0f0c72ec227f034f38dd47facbb62439ef3216d42f32433f3901d14675cf806e8d73689802a11849958b330bb5b55dd4fd5cdc64ebaf345c + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-destination@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa + languageName: node + linkType: hard + +"micromark-factory-label@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-label@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-title@npm:1.1.0" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-whitespace@npm:1.1.0" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/88cf80f9b4c95266f24814ef587fb4180454668dcc3be4ac829e1227188cf349c8981bfca29e3eab1682f324c2c47544c0b0b799a26fbf9df5f156c6a84c970c + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-chunked@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-classify-character@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-combine-extensions@npm:1.1.0" + dependencies: + micromark-util-chunked: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-string@npm:1.1.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-encode@npm:1.1.0" + checksum: 10/4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-html-tag-name@npm:1.2.0" + checksum: 10/ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-normalize-identifier@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-resolve-all@npm:1.1.0" + dependencies: + micromark-util-types: "npm:^1.0.0" + checksum: 10/1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^1.0.0, micromark-util-sanitize-uri@npm:^1.1.0": + version: 1.2.0 + resolution: "micromark-util-sanitize-uri@npm:1.2.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-encode: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/0d024100d95ffb88bf75f3360e305b545c1eb745430959b8633f7aa93f37ec401fc7094c90c97298409a9e30d94d53b895bae224e1bb966bea114976cfa0fd48 + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-subtokenize@npm:1.1.0" + dependencies: + micromark-util-chunked: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/075a1db6ea586d65827d3eead33dbfc520c4e43659c93fcd8fd82f44a7b75cfe61dcde967a3dfcc2ffd999347440ba5aa6698e65a04f3fc627e13e9f12a1a910 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 10/a26b6b1efd77a715a4d9bbe0a5338eaf3d04ea5e85733e34fee56dfeabf64495c0afc5438fe5220316884cd3a5eae1f17768e0ff4e117827ea4a653897466f86 + languageName: node + linkType: hard + +"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: 10/287ac5de4a3802bb6f6c3842197c294997a488db1c0486e03c7a8e674d9eb7720c17dda1bcb814814b8343b338c4826fcbc0555f3e75463712a60dcdb53a028e + languageName: node + linkType: hard + +"micromark@npm:^3.0.0": + version: 3.2.0 + resolution: "micromark@npm:3.2.0" + dependencies: + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + micromark-core-commonmark: "npm:^1.0.1" + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-chunked: "npm:^1.0.0" + micromark-util-combine-extensions: "npm:^1.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-encode: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-resolve-all: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^1.0.0" + micromark-util-subtokenize: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.1" + uvu: "npm:^0.5.0" + checksum: 10/560a4a501efc3859d622461aaa9345fb95b99a2f34d3d3f2a775ab04de1dd857cb0f642083a6b28ab01bd817f5f0741a1be9857fd702f45e04a3752927a66719 languageName: node linkType: hard @@ -10758,6 +14352,13 @@ __metadata: languageName: node linkType: hard +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + "mini-css-extract-plugin@npm:^2.4.2": version: 2.10.2 resolution: "mini-css-extract-plugin@npm:2.10.2" @@ -10992,7 +14593,44 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": +"motion-dom@npm:^12.43.0": + version: 12.43.0 + resolution: "motion-dom@npm:12.43.0" + dependencies: + motion-utils: "npm:^12.39.0" + checksum: 10/ac5f7164b77e317f265bf1382156e4a106a1091b442dc1c546f9b565c119baa9e139abec2c2c55ad710ad9d69c02c1c8b96a6932b1904726b64137e7c443f82d + languageName: node + linkType: hard + +"motion-utils@npm:^12.39.0": + version: 12.39.0 + resolution: "motion-utils@npm:12.39.0" + checksum: 10/5aa2972bf38c44e44e0a39a70202ce69d585d88d28b37975ca0849756b8614e28d5ebd263ed806e94886b1fe684ce28ee630c4556c465581eaa6dca420249486 + languageName: node + linkType: hard + +"motion@npm:^12.0.0": + version: 12.43.0 + resolution: "motion@npm:12.43.0" + dependencies: + framer-motion: "npm:^12.43.0" + tslib: "npm:^2.4.0" + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10/3c37060bd3dd5ce8ed19adf46990e3fa10c9dd4dd70b1e3d83fd6d382ca33d2912a13ae51a4459410393039794927d07669ad6f1f8da215dfdf6cd31d5e545d1 + languageName: node + linkType: hard + +"mri@npm:^1.1.0, mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc @@ -11057,6 +14695,25 @@ __metadata: languageName: node linkType: hard +"nano-css@npm:^5.6.2": + version: 5.6.2 + resolution: "nano-css@npm:5.6.2" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + css-tree: "npm:^1.1.2" + csstype: "npm:^3.1.2" + fastest-stable-stringify: "npm:^2.0.2" + inline-style-prefixer: "npm:^7.0.1" + rtl-css-js: "npm:^1.16.1" + stacktrace-js: "npm:^2.0.2" + stylis: "npm:^4.3.0" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 10/6ed9f36957b19fc2dcf1644a853030cce70775bec3fed596cab9156063d522d5cb52cb1479117e4390acbe45b69321c9eb33915d96414aabaf09bff40497bb4a + languageName: node + linkType: hard + "nanoid@npm:^3.3.20": version: 3.3.20 resolution: "nanoid@npm:3.3.20" @@ -11186,7 +14843,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0": +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -11519,6 +15176,20 @@ __metadata: languageName: node linkType: hard +"open@npm:^11.0.0": + version: 11.0.4 + resolution: "open@npm:11.0.4" + dependencies: + default-browser: "npm:^5.5.1" + define-lazy-prop: "npm:^3.0.0" + is-in-ssh: "npm:^1.0.0" + is-inside-container: "npm:^1.0.0" + powershell-utils: "npm:^0.2.1" + wsl-utils: "npm:^1.0.0" + checksum: 10/2fa3c00154f4c23a336dac94b52ea351b0bab18072c32c18f1219a1372e05f413065aeaaa06d5cc5ef60501b6903d90fd2bcd3f2f8449d007e93512d031f4434 + languageName: node + linkType: hard + "open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -11767,6 +15438,13 @@ __metadata: languageName: node linkType: hard +"p-throttle@npm:^4.1.1": + version: 4.1.1 + resolution: "p-throttle@npm:4.1.1" + checksum: 10/fe8709f3c3b1da7c033479375c2c302e80c1a5d86449013afa7cd46d1dc210bc824a7e4a9d088e66d31987d00878c2b5491bb2fe76246d4d2fc9a1636f5f8298 + languageName: node + linkType: hard + "p-timeout@npm:^3.2.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" @@ -11866,6 +15544,20 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^2.0.0": + version: 2.0.0 + resolution: "parse-entities@npm:2.0.0" + dependencies: + character-entities: "npm:^1.0.0" + character-entities-legacy: "npm:^1.0.0" + character-reference-invalid: "npm:^1.0.0" + is-alphanumerical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + is-hexadecimal: "npm:^1.0.0" + checksum: 10/feb46b516722474797d72331421f3e62856750cfb4f70ba098b36447bf0b169e819cc4fdee53e022874d5f0c81b605d86e1912b9842a70e59a54de2fee81589d + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -11878,6 +15570,24 @@ __metadata: languageName: node linkType: hard +"parse-path@npm:^7.0.0": + version: 7.1.0 + resolution: "parse-path@npm:7.1.0" + dependencies: + protocols: "npm:^2.0.0" + checksum: 10/6da6c6803fa73bacfee98e694c6c95fa55caae632c765369e4fd917f1043ef71f35ecaae420ef0e39e933bd1f939c4bc1e01522b62145191cdbe72e58d37a8ab + languageName: node + linkType: hard + +"parse-url@npm:^8.1.0": + version: 8.1.0 + resolution: "parse-url@npm:8.1.0" + dependencies: + parse-path: "npm:^7.0.0" + checksum: 10/ceb51dc474568092a50d6d936036dfe438a87aa45bcf20947c8fcdf1544ee9c50255608abae604644e718e91e0b83cfbea4675e8b2fd90bc197432f6d9be263c + languageName: node + linkType: hard + "parse5-htmlparser2-tree-adapter@npm:^6.0.0": version: 6.0.1 resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" @@ -11894,7 +15604,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.1": +"parse5@npm:^6.0.0, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 @@ -11957,6 +15667,13 @@ __metadata: languageName: node linkType: hard +"path-expression-matcher@npm:^1.6.2": + version: 1.6.2 + resolution: "path-expression-matcher@npm:1.6.2" + checksum: 10/d7786b170933dd82ed897144daed7d54dbe2e7b7d8684182ee9bf51a966cc92548788e2f49280922202a0186409008d816aefa37ed4650e4038184181a73c4bd + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -12061,7 +15778,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -12142,6 +15859,13 @@ __metadata: languageName: node linkType: hard +"popper.js@npm:1.16.1-lts": + version: 1.16.1-lts + resolution: "popper.js@npm:1.16.1-lts" + checksum: 10/932c453fce30bd00720413a89e87733b5074359834bd5b3fdc85c8a2e14d44558419ddaa0bf8e32d67899c7a57ab37ee1251588b7eb3a402e77c56edc8c405c8 + languageName: node + linkType: hard + "portfinder@npm:^1.0.32": version: 1.0.38 resolution: "portfinder@npm:1.0.38" @@ -12595,6 +16319,13 @@ __metadata: languageName: node linkType: hard +"powershell-utils@npm:^0.2.0, powershell-utils@npm:^0.2.1": + version: 0.2.1 + resolution: "powershell-utils@npm:0.2.1" + checksum: 10/8a5b5db6af7fbaf61252c0b8627da1fdfc1c9dd111721923557460cc250373cde56cc059b34188ba8012c64a1f34cb0913b10e70bb43e73806b5974af31b1c66 + languageName: node + linkType: hard + "prebuild-install@npm:^7.0.1": version: 7.1.3 resolution: "prebuild-install@npm:7.1.3" @@ -12643,6 +16374,31 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^17.0.1" + checksum: 10/248990cbef9e96fb36a3e1ae6b903c551ca4ddd733f8d0912b9cc5141d3d0b3f9f8dfb4d799fb1c6723382c9c2083ffbfa4ad43ff9a0e7535d32d41fd5f01da6 + languageName: node + linkType: hard + +"prismjs@npm:^1.30.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: 10/6b48a2439a82e5c6882f48ebc1564c3890e16463ba17ac10c3ad4f62d98dea5b5c915b172b63b83023a70ad4f5d7be3e8a60304420db34a161fae69dd4e3e2da + languageName: node + linkType: hard + +"prismjs@npm:~1.27.0": + version: 1.27.0 + resolution: "prismjs@npm:1.27.0" + checksum: 10/dc83e2e09170b53526182f5435fae056fc200b109cac39faa88eb48d992311c7f59b94990318962fa93299190a9b33a404920ed150e5b364ce48c897f2ba1e8e + languageName: node + linkType: hard + "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -12698,7 +16454,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.8.1": +"prop-types@npm:^15.0.0, prop-types@npm:^15.5.10, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -12720,6 +16476,29 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^5.0.0": + version: 5.6.0 + resolution: "property-information@npm:5.6.0" + dependencies: + xtend: "npm:^4.0.0" + checksum: 10/e4f45b100fec5968126b08102f9567f1b5fc3442aecbb5b4cdeca401f1f447672e7638a08c81c05dd3979c62d084e0cc6acbe2d8b053c05280ac5abaaf666a68 + languageName: node + linkType: hard + +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 10/fced94f3a09bf651ad1824d1bdc8980428e3e480e6d01e98df6babe2cc9d45a1c52eee9a7736d2006958f9b394eb5964dedd37e23038086ddc143fc2fd5e426c + languageName: node + linkType: hard + +"protocols@npm:^2.0.0, protocols@npm:^2.0.1": + version: 2.0.2 + resolution: "protocols@npm:2.0.2" + checksum: 10/031cc068eb800468a50eb7c1e1c528bf142fb8314f5df9b9ea3c3f9df1697a19f97b9915b1229cef694d156812393172d9c3051ef7878d26eaa8c6faa5cccec4 + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.8 resolution: "proxy-addr@npm:2.0.8" @@ -12819,7 +16598,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.12.3, qs@npm:~6.16.0": +"qs@npm:^6.12.3, qs@npm:^6.15.2, qs@npm:~6.16.0": version: 6.16.1 resolution: "qs@npm:6.16.1" dependencies: @@ -12857,6 +16636,13 @@ __metadata: languageName: node linkType: hard +"raf-schd@npm:^4.0.2": + version: 4.0.3 + resolution: "raf-schd@npm:4.0.3" + checksum: 10/45514041c5ad31fa96aef3bb3c572a843b92da2f2cd1cb4a47c9ad58e48761d3a4126e18daa32b2bfa0bc2551a42d8f324a0e40e536cb656969929602b4e8b58 + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -12914,6 +16700,33 @@ __metadata: languageName: node linkType: hard +"rc-progress@npm:3.5.1": + version: 3.5.1 + resolution: "rc-progress@npm:3.5.1" + dependencies: + "@babel/runtime": "npm:^7.10.1" + classnames: "npm:^2.2.6" + rc-util: "npm:^5.16.1" + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: 10/e6e34acdec07443ef850ddd12e0678533ff706ea4f7d2fa3d500df76aeafdf08f5297353e902d891f354c464931a69b3d568f4e17204436d3a6d30b37a241bb8 + languageName: node + linkType: hard + +"rc-util@npm:^5.16.1": + version: 5.44.4 + resolution: "rc-util@npm:5.44.4" + dependencies: + "@babel/runtime": "npm:^7.18.3" + react-is: "npm:^18.2.0" + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: 10/c456b9899545625b6d856bef1218ce0ed87af13e2c9c328e302fd255b912ee2e4a0fd81603221736ed9b176ed79507abc2275dc1df488ea465d26b4807f4e99a + languageName: node + linkType: hard + "rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -12928,6 +16741,100 @@ __metadata: languageName: node linkType: hard +"react-aria-components@npm:~1.17.0": + version: 1.17.0 + resolution: "react-aria-components@npm:1.17.0" + dependencies: + "@internationalized/date": "npm:^3.12.1" + "@react-types/shared": "npm:^3.34.0" + "@swc/helpers": "npm:^0.5.0" + client-only: "npm:^0.0.1" + react-aria: "npm:3.48.0" + react-stately: "npm:3.46.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/f2d22aa1ca31da1697c4f364c9fda670c889a959661051a7f1d4f2f96ea4db3ce232fca81613cbf82411eef7d10bd3c05fc628756d9b5ca807729e02e0b12d6b + languageName: node + linkType: hard + +"react-aria-components@npm:~1.22.0": + version: 1.22.1 + resolution: "react-aria-components@npm:1.22.1" + dependencies: + "@internationalized/date": "npm:^3.12.4" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.37.0" + "@swc/helpers": "npm:^0.5.0" + client-only: "npm:^0.0.1" + react-aria: "npm:3.53.1" + react-stately: "npm:3.51.0" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/8ce60fbbf22ffe829ba52c52cbf0f934502144b02a01748852db66131257f4d571bd8e3e45e889cca8b2d1b974317cffdf9dc0a86c8131757dd4e53fa3419c25 + languageName: node + linkType: hard + +"react-aria@npm:3.48.0, react-aria@npm:~3.48.0": + version: 3.48.0 + resolution: "react-aria@npm:3.48.0" + dependencies: + "@internationalized/date": "npm:^3.12.1" + "@internationalized/number": "npm:^3.6.6" + "@internationalized/string": "npm:^3.2.8" + "@react-types/shared": "npm:^3.34.0" + "@swc/helpers": "npm:^0.5.0" + aria-hidden: "npm:^1.2.3" + clsx: "npm:^2.0.0" + react-stately: "npm:3.46.0" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/e70ba3a21f99967daffcb7399e6c4cc33fe9ae0ba4b13216ac3fbc150f37416d882b68ecd52f3c59852b87ef61a1c4b184066083d699d5afda1ad8b38fab8b99 + languageName: node + linkType: hard + +"react-aria@npm:3.53.1, react-aria@npm:~3.53.0": + version: 3.53.1 + resolution: "react-aria@npm:3.53.1" + dependencies: + "@internationalized/date": "npm:^3.12.4" + "@internationalized/number": "npm:^3.6.9" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.37.0" + "@swc/helpers": "npm:^0.5.0" + aria-hidden: "npm:^1.2.3" + clsx: "npm:^2.0.0" + react-stately: "npm:3.51.0" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/90720299dc55e60b5b39a5473fd3bb7409a168325362eb9f2639028aae8a5a5316942cc72a10dac177fd44e17a9f968d789ed9dde780685f35dafb5ff7fa6998 + languageName: node + linkType: hard + +"react-beautiful-dnd@npm:^13.0.0": + version: 13.1.1 + resolution: "react-beautiful-dnd@npm:13.1.1" + dependencies: + "@babel/runtime": "npm:^7.9.2" + css-box-model: "npm:^1.2.0" + memoize-one: "npm:^5.1.1" + raf-schd: "npm:^4.0.2" + react-redux: "npm:^7.2.0" + redux: "npm:^4.0.4" + use-memo-one: "npm:^1.1.1" + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + checksum: 10/2de8162a74f7fc78294e5a928b92d3fff02c579d137a25d53b1ab4313abeb108709bb7281512f7f94d18257de3122b8c85cb5a8375113cb8657088b1a9bda65b + languageName: node + linkType: hard + "react-dev-utils@npm:^12.0.0-next.60": version: 12.0.1 resolution: "react-dev-utils@npm:12.0.1" @@ -12960,6 +16867,15 @@ __metadata: languageName: node linkType: hard +"react-double-scrollbar@npm:0.0.15": + version: 0.0.15 + resolution: "react-double-scrollbar@npm:0.0.15" + peerDependencies: + react: ">= 0.14.7" + checksum: 10/c12f9b51795b6281ed191a1eeadf3e5ab4f109af70c25bee159e0169169b5f31c8bc5706420672c232fb0c0eb665e2e4f9bea8cb086415a7bd19ec98528d024c + languageName: node + linkType: hard + "react-error-overlay@npm:^6.0.11": version: 6.1.0 resolution: "react-error-overlay@npm:6.1.0" @@ -12967,17 +16883,315 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": +"react-fast-compare@npm:^3.1.1": + version: 3.2.2 + resolution: "react-fast-compare@npm:3.2.2" + checksum: 10/a6826180ba75cefba1c8d3ac539735f9b627ca05d3d307fe155487f5d0228d376dac6c9708d04a283a7b9f9aee599b637446635b79c8c8753d0b4eece56c125c + languageName: node + linkType: hard + +"react-full-screen@npm:^1.1.1": + version: 1.1.1 + resolution: "react-full-screen@npm:1.1.1" + dependencies: + fscreen: "npm:^1.0.2" + peerDependencies: + react: ">= 16.8.0" + checksum: 10/70ad927b9d6c485ac46b5bb4b1639ef9a860da28290b3a1c419c42b9c427d78b80e8dba403eb6451458af56838012c81d5e12ef05097395f154defc32fe06c34 + languageName: node + linkType: hard + +"react-helmet@npm:6.1.0": + version: 6.1.0 + resolution: "react-helmet@npm:6.1.0" + dependencies: + object-assign: "npm:^4.1.1" + prop-types: "npm:^15.7.2" + react-fast-compare: "npm:^3.1.1" + react-side-effect: "npm:^2.1.0" + peerDependencies: + react: ">=16.3.0" + checksum: 10/eff25231384bb0a229870a0552839953a59af17f0ff5e8bca1b8c8fdf19a329e4c00c7fa2fcedc8be5d73f5c7bebb30cf9a32ea58efc7c8f726a10dba51f48a2 + languageName: node + linkType: hard + +"react-hook-form@npm:^7.12.2": + version: 7.91.0 + resolution: "react-hook-form@npm:7.91.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17 || ^18 || ^19 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ae6897f95a6a0e0289c44f36230867ad2c9c7380b8d8b8eab2ae0a559e706fdfc96508d2dcc150d70ee00b40c4a7e4b7e2e04b6082cc24d098b5f258cd9b9d50 + languageName: node + linkType: hard + +"react-idle-timer@npm:5.7.3": + version: 5.7.3 + resolution: "react-idle-timer@npm:5.7.3" + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 10/b9ba634d78464954bde864b7c0554a35cfa7f7e76ad21e906525f2543d74a4fc82308dbebc70fb909c1701e83eba34a3517a2f15f5beaa91656fcb3002d5ce38 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf languageName: node linkType: hard -"react-refresh@npm:^0.18.0": - version: 0.18.0 - resolution: "react-refresh@npm:0.18.0" - checksum: 10/504c331c19776bf8320c23bad7f80b3a28de03301ed7523b0dd21d3f02bf2b53bbdd5aa52469b187bc90f358614b2ba303c088a0765c95f4f0a68c43a7d67b1d +"react-is@npm:^16.8.0 || ^17.0.0, react-is@npm:^17.0.1, react-is@npm:^17.0.2": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 10/73b36281e58eeb27c9cc6031301b6ae19ecdc9f18ae2d518bdb39b0ac564e65c5779405d623f1df9abf378a13858b79442480244bd579968afc1faf9a2ce5e05 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0, react-is@npm:^18.2.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 + languageName: node + linkType: hard + +"react-is@npm:^19.0.0": + version: 19.3.1 + resolution: "react-is@npm:19.3.1" + checksum: 10/d763db896daf611bc15456abc356b1d4c5c2fa0a68a60c2c53c0199d39c951e0b6891437c649ee41b1b3614f59932e93075834a42a3a52dfcb0cac22289ab191 + languageName: node + linkType: hard + +"react-markdown@npm:^8.0.0": + version: 8.0.7 + resolution: "react-markdown@npm:8.0.7" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/prop-types": "npm:^15.0.0" + "@types/unist": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-whitespace: "npm:^2.0.0" + prop-types: "npm:^15.0.0" + property-information: "npm:^6.0.0" + react-is: "npm:^18.0.0" + remark-parse: "npm:^10.0.0" + remark-rehype: "npm:^10.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-object: "npm:^0.4.0" + unified: "npm:^10.0.0" + unist-util-visit: "npm:^4.0.0" + vfile: "npm:^5.0.0" + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 10/5702a2ef0b8a8cb0a085bb5101810d7446e818f7b76291238eff73cce5aaea65b95ffa28f9b4127d1fc785b6cfe0790bba261b11c5a69655ff901399d8ea6896 + languageName: node + linkType: hard + +"react-redux@npm:^7.2.0": + version: 7.2.9 + resolution: "react-redux@npm:7.2.9" + dependencies: + "@babel/runtime": "npm:^7.15.4" + "@types/react-redux": "npm:^7.1.20" + hoist-non-react-statics: "npm:^3.3.2" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.7.2" + react-is: "npm:^17.0.2" + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 10/1c3018bd2601e6d18339281867910b583dcbb3d8856403086e08c00abf0dfe467a94c0d1356bafa8cdf107bf1e2c9899a28486e4778e85c8bc4dfed2076b116f + languageName: node + linkType: hard + +"react-refresh@npm:^0.18.0": + version: 0.18.0 + resolution: "react-refresh@npm:0.18.0" + checksum: 10/504c331c19776bf8320c23bad7f80b3a28de03301ed7523b0dd21d3f02bf2b53bbdd5aa52469b187bc90f358614b2ba303c088a0765c95f4f0a68c43a7d67b1d + languageName: node + linkType: hard + +"react-router-dom@npm:^6.30.2": + version: 6.30.6 + resolution: "react-router-dom@npm:6.30.6" + dependencies: + "@remix-run/router": "npm:1.23.4" + react-router: "npm:6.30.6" + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10/6e501c45fd85894b197a84437c12cd0ab6d9c14277af41a7546f965ee0a0861aff1da5d72d56020a1ac2d4d4b1c4ec848a16554372004fdef5cdb1bce75a155e + languageName: node + linkType: hard + +"react-router@npm:6.30.6": + version: 6.30.6 + resolution: "react-router@npm:6.30.6" + dependencies: + "@remix-run/router": "npm:1.23.4" + peerDependencies: + react: ">=16.8" + checksum: 10/df751de74dc460abc9023aecfd09284170939e8ad8892373ec0015aa04187e0b9c66fffcb546bfb0f1ca5c9edb14b67c93a46306a61efcf15a7dc20eca1e16b7 + languageName: node + linkType: hard + +"react-side-effect@npm:^2.1.0": + version: 2.1.2 + resolution: "react-side-effect@npm:2.1.2" + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + checksum: 10/8c31aaec5b383d942ff1775b12c45022239d1250d1a00a238bac3c07e0fe266c71991e2814ae16a5d9b855bcd96ba95817d48ab3f34738f0bb32036ebb1abb1a + languageName: node + linkType: hard + +"react-sparklines@npm:^1.7.0": + version: 1.7.0 + resolution: "react-sparklines@npm:1.7.0" + dependencies: + prop-types: "npm:^15.5.10" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 10/a6e59d94eab4d33306c17c942df9d101bcbf07f95b685f8f23d7fd9546df5ded5b2170e2ea80a13c276460db1e1a56fd74190e28b523263ae82e945a5114e3b6 + languageName: node + linkType: hard + +"react-stately@npm:3.46.0, react-stately@npm:~3.46.0": + version: 3.46.0 + resolution: "react-stately@npm:3.46.0" + dependencies: + "@internationalized/date": "npm:^3.12.1" + "@internationalized/number": "npm:^3.6.6" + "@internationalized/string": "npm:^3.2.8" + "@react-types/shared": "npm:^3.34.0" + "@swc/helpers": "npm:^0.5.0" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/ee2d8b0633c6ba82eb159197ddaaeb0832d318c6ed1304c7e14273d0c3dc3156c48aef0c8cf4207481dbca1cf054c6726c42c089259605213d1f08f35bebf321 + languageName: node + linkType: hard + +"react-stately@npm:3.51.0, react-stately@npm:~3.51.0": + version: 3.51.0 + resolution: "react-stately@npm:3.51.0" + dependencies: + "@internationalized/date": "npm:^3.12.4" + "@internationalized/number": "npm:^3.6.9" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.37.0" + "@swc/helpers": "npm:^0.5.0" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/b5f602df10fa1814b944d8c2d37f83be8a26bd841d349346bad9bc04d89995e8f4dbf4a096e30b2f72f50edaf232d907ff36a08f274f7ea367ce3912d5c93567 + languageName: node + linkType: hard + +"react-syntax-highlighter@npm:^15.4.5": + version: 15.6.6 + resolution: "react-syntax-highlighter@npm:15.6.6" + dependencies: + "@babel/runtime": "npm:^7.3.1" + highlight.js: "npm:^10.4.1" + highlightjs-vue: "npm:^1.0.0" + lowlight: "npm:^1.17.0" + prismjs: "npm:^1.30.0" + refractor: "npm:^3.6.0" + peerDependencies: + react: ">= 0.14.0" + checksum: 10/8b7e60bc7df7218248e17dfc3c44b8f45cd9e363a763477753d5c39242910ff822180db59098e1cc74d0d2ced54ed1ca79a32d67e1afa0c8227ca918a7e0c692 + languageName: node + linkType: hard + +"react-transition-group@npm:^4.0.0, react-transition-group@npm:^4.4.0, react-transition-group@npm:^4.4.5": + version: 4.4.5 + resolution: "react-transition-group@npm:4.4.5" + dependencies: + "@babel/runtime": "npm:^7.5.5" + dom-helpers: "npm:^5.0.1" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.6.2" + peerDependencies: + react: ">=16.6.0" + react-dom: ">=16.6.0" + checksum: 10/ca32d3fd2168c976c5d90a317f25d5f5cd723608b415fb3b9006f9d793c8965c619562d0884503a3e44e4b06efbca4fdd1520f30e58ca3e00a0890e637d55419 + languageName: node + linkType: hard + +"react-universal-interface@npm:^0.6.2": + version: 0.6.2 + resolution: "react-universal-interface@npm:0.6.2" + peerDependencies: + react: "*" + tslib: "*" + checksum: 10/bded7a34f5e44223495a095b6c29fa3ea6c8338a166d0f307d21443c20c9fa54a95bdae11d05ab3e6f61a7fa1eaa027f6fbe7ca064a2fb2af46539653ebcb308 + languageName: node + linkType: hard + +"react-use@npm:^17.2.4, react-use@npm:^17.3.2": + version: 17.6.1 + resolution: "react-use@npm:17.6.1" + dependencies: + "@types/js-cookie": "npm:^3.0.0" + "@xobotyi/scrollbar-width": "npm:^1.9.5" + copy-to-clipboard: "npm:^3.3.1" + fast-deep-equal: "npm:^3.1.3" + fast-shallow-equal: "npm:^1.0.0" + js-cookie: "npm:^3.0.0" + nano-css: "npm:^5.6.2" + react-universal-interface: "npm:^0.6.2" + resize-observer-polyfill: "npm:^1.5.1" + screenfull: "npm:^5.1.0" + set-harmonic-interval: "npm:^1.0.1" + throttle-debounce: "npm:^3.0.1" + ts-easing: "npm:^0.2.0" + tslib: "npm:^2.1.0" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 10/0b3630ac9a02b755cdfa205d0a0dbee0c620a4b0fcfb00b5cceb4f38fdf928fca3c6d924671e210d89b34aafeda222f7500eb4ceb9883baf2b9ce0181f4fcd82 + languageName: node + linkType: hard + +"react-virtualized-auto-sizer@npm:^1.0.11": + version: 1.0.26 + resolution: "react-virtualized-auto-sizer@npm:1.0.26" + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/8f8127369fb3ae1a49987a1e7d2d136f379b71d1b031a4c169389274946eca0248e3fb9130aa8a7ebe82f4ca8aaab58c37252398f8f6220a6eafaa78b8464b6b + languageName: node + linkType: hard + +"react-window@npm:^1.8.6": + version: 1.8.11 + resolution: "react-window@npm:1.8.11" + dependencies: + "@babel/runtime": "npm:^7.0.0" + memoize-one: "npm:>=3.1.1 <6" + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/bdbac2b664c5a799443b97a32b2f60a00cc13cc14ca8a8b1e81e2dc7dd00d8d54f05743113972fe1a641b57ada5d874b59c3cbe7e8a07a88c6713a0fb65d60f6 + languageName: node + linkType: hard + +"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/261137d3f3993eaa2368a83110466fc0e558bc2c7f7ae7ca52d94f03aac945f45146bd85e5f481044db1758a1dbb57879e2fcdd33924e2dde1bdc550ce73f7bf languageName: node linkType: hard @@ -13060,6 +17274,25 @@ __metadata: languageName: node linkType: hard +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10/fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + +"redux@npm:^4.0.0, redux@npm:^4.0.4": + version: 4.2.1 + resolution: "redux@npm:4.2.1" + dependencies: + "@babel/runtime": "npm:^7.9.2" + checksum: 10/371e4833b671193303a7dea7803c8fdc8e0d566740c78f580e0a3b77b4161da25037626900a2205a5d616117fa6ad09a4232e5a110bd437186b5c6355a041750 + languageName: node + linkType: hard + "reflect-metadata@npm:0.2.2, reflect-metadata@npm:^0.2.2": version: 0.2.2 resolution: "reflect-metadata@npm:0.2.2" @@ -13083,7 +17316,18 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.4": +"refractor@npm:^3.6.0": + version: 3.6.0 + resolution: "refractor@npm:3.6.0" + dependencies: + hastscript: "npm:^6.0.0" + parse-entities: "npm:^2.0.0" + prismjs: "npm:~1.27.0" + checksum: 10/671bbcf5ae1b4e207f98b9a3dc2cbae215be30effe9f3bdcfd10f565f45fecfe97334cf38c8e4f52d6cc012ff2ec7fb627d3d5678efc388751c8b1e1f7ca2a6c + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -13097,6 +17341,28 @@ __metadata: languageName: node linkType: hard +"rehype-raw@npm:^6.0.0": + version: 6.1.1 + resolution: "rehype-raw@npm:6.1.1" + dependencies: + "@types/hast": "npm:^2.0.0" + hast-util-raw: "npm:^7.2.0" + unified: "npm:^10.0.0" + checksum: 10/3599d22c45264bea52c93eec2136f50f119282c0bd4e9604aeb2421fe20db84f9c4536caebf64f29158d8c2403b6fd3b3da634211393fdda9cdd500149d00ae4 + languageName: node + linkType: hard + +"rehype-sanitize@npm:^5.0.0": + version: 5.0.1 + resolution: "rehype-sanitize@npm:5.0.1" + dependencies: + "@types/hast": "npm:^2.0.0" + hast-util-sanitize: "npm:^4.0.0" + unified: "npm:^10.0.0" + checksum: 10/b9d9efc0b3c894fe5da84558147148c355c933794c3411dc7c02278b28ea251d241020cd26836e5cc5c979e0e058b45ca51a0eb87824ffdb7241efecd65b6d29 + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -13104,6 +17370,41 @@ __metadata: languageName: node linkType: hard +"remark-gfm@npm:^3.0.1": + version: 3.0.1 + resolution: "remark-gfm@npm:3.0.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-gfm: "npm:^2.0.0" + micromark-extension-gfm: "npm:^2.0.0" + unified: "npm:^10.0.0" + checksum: 10/8ec301f5fb1f52c548b5a6d7ca6a3422d55db73cd703f147c979d16dca003f065181f55404d6f3f49d33f1faca3fe56ae731ed7fe0acc00cd945a8e605f155f2 + languageName: node + linkType: hard + +"remark-parse@npm:^10.0.0": + version: 10.0.2 + resolution: "remark-parse@npm:10.0.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-from-markdown: "npm:^1.0.0" + unified: "npm:^10.0.0" + checksum: 10/184f48956734a58a7e157d83233e532ea289697f5ecebd1fb082cce79e6d9f5b1d3da72462356b2b3b5843643cee890280ffe3d21c9d4ad2d7d5e20bb5de7f14 + languageName: node + linkType: hard + +"remark-rehype@npm:^10.0.0": + version: 10.1.0 + resolution: "remark-rehype@npm:10.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-to-hast: "npm:^12.1.0" + unified: "npm:^10.0.0" + checksum: 10/cf765b639d16872404b50d5945df0ba825d14f1150397dde804e7d9e2e856a7b7343c4dc3796c85e7c18ca84f3c989bd40e476bd194fc00a5a870e8a64ec30d9 + languageName: node + linkType: hard + "renderkid@npm:^3.0.0": version: 3.0.0 resolution: "renderkid@npm:3.0.0" @@ -13151,6 +17452,13 @@ __metadata: languageName: node linkType: hard +"resize-observer-polyfill@npm:^1.5.1": + version: 1.5.1 + resolution: "resize-observer-polyfill@npm:1.5.1" + checksum: 10/e10ee50cd6cf558001de5c6fb03fee15debd011c2f694564b71f81742eef03fb30d6c2596d1d5bf946d9991cb692fcef529b7bd2e4057041377ecc9636c753ce + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -13263,6 +17571,17 @@ __metadata: languageName: node linkType: hard +"rifm@npm:^0.7.0": + version: 0.7.0 + resolution: "rifm@npm:0.7.0" + dependencies: + "@babel/runtime": "npm:^7.3.1" + peerDependencies: + react: ">=16.8" + checksum: 10/09dee6d18f1446e06b55576cc8b984b636f1351fe7af7b85bc1958fb5f1679128ce536308fd229a6e98bee77751afccd204015bd5c9e8adcc42a712e98c60aa6 + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -13447,6 +17766,15 @@ __metadata: languageName: node linkType: hard +"rtl-css-js@npm:^1.16.1": + version: 1.16.1 + resolution: "rtl-css-js@npm:1.16.1" + dependencies: + "@babel/runtime": "npm:^7.1.2" + checksum: 10/fa6a3e1f73e65bf5763b8a051942477a0852ee072d29ebad0999f02556a73715e72374d9a31ddec3fe023b09702b56f8be3a5a0404816e795ab86ea879183e02 + languageName: node + linkType: hard + "run-applescript@npm:^7.0.0": version: 7.1.0 resolution: "run-applescript@npm:7.1.0" @@ -13486,6 +17814,15 @@ __metadata: languageName: node linkType: hard +"sade@npm:^1.7.3": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: "npm:^1.1.0" + checksum: 10/1c67ba03c94083e0ae307ff5564ecb86c2104c0f558042fdaa40ea0054f91a63a9783f14069870f2f784336adabb70f90f22a84dc457b5a25e859aaadefe0910 + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.4 resolution: "safe-array-concat@npm:1.1.4" @@ -13622,6 +17959,13 @@ __metadata: languageName: node linkType: hard +"screenfull@npm:^5.1.0": + version: 5.2.0 + resolution: "screenfull@npm:5.2.0" + checksum: 10/b8b4b8010f48889341ad1981ca9e6e02db1f10dec686244d95bd2bfde47451059f5ba4c744449913b10f021f14f79d374987a873b6086eb488295962ba50381e + languageName: node + linkType: hard + "select-hose@npm:^2.0.0": version: 2.0.0 resolution: "select-hose@npm:2.0.0" @@ -13759,6 +18103,13 @@ __metadata: languageName: node linkType: hard +"set-harmonic-interval@npm:^1.0.1": + version: 1.0.1 + resolution: "set-harmonic-interval@npm:1.0.1" + checksum: 10/14b9ce98625af9e0d80165a5c8ceb76ce1206df641197e020780e570f268f5427961138d3f47591962e2626b498a051a4488eaa646e5473373f843d7e9e468d4 + languageName: node + linkType: hard + "set-proto@npm:^1.0.0": version: 1.0.0 resolution: "set-proto@npm:1.0.0" @@ -13855,7 +18206,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.1.0, side-channel@npm:^1.1.1": +"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0, side-channel@npm:^1.1.1": version: 1.1.1 resolution: "side-channel@npm:1.1.1" dependencies: @@ -13997,6 +18348,20 @@ __metadata: languageName: node linkType: hard +"source-map@npm:0.5.6": + version: 0.5.6 + resolution: "source-map@npm:0.5.6" + checksum: 10/c62fe98e106c762307eea3a982242c1a76a31bc762da10fe2dda12252d423c163e0cd45d313330c8bd040cc5121702511138252308f72b8a9273825e81e4db30 + languageName: node + linkType: hard + +"source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10/9b4ac749ec5b5831cad1f8cc4c19c4298ebc7474b24a0acf293e2f040f03f8eeccb3d01f12aa0f90cf46d555c887e03912b83a042c627f419bda5152d89c5269 + languageName: node + linkType: hard + "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" @@ -14011,6 +18376,20 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^1.0.0": + version: 1.1.5 + resolution: "space-separated-tokens@npm:1.1.5" + checksum: 10/8ef68f1cfa8ccad316b7f8d0df0919d0f1f6d32101e8faeee34ea3a923ce8509c1ad562f57388585ee4951e92d27afa211ed0a077d3d5995b5ba9180331be708 + languageName: node + linkType: hard + +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 10/202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 + languageName: node + linkType: hard + "spawndamnit@npm:^3.0.1": version: 3.0.1 resolution: "spawndamnit@npm:3.0.1" @@ -14071,6 +18450,15 @@ __metadata: languageName: node linkType: hard +"stack-generator@npm:^2.0.5": + version: 2.0.10 + resolution: "stack-generator@npm:2.0.10" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10/4fc3978a934424218a0aa9f398034e1f78153d5ff4f4ff9c62478c672debb47dd58de05b09fc3900530cbb526d72c93a6e6c9353bacc698e3b1c00ca3dda0c47 + languageName: node + linkType: hard + "stackframe@npm:^1.3.4": version: 1.3.4 resolution: "stackframe@npm:1.3.4" @@ -14078,6 +18466,27 @@ __metadata: languageName: node linkType: hard +"stacktrace-gps@npm:^3.0.4": + version: 3.1.2 + resolution: "stacktrace-gps@npm:3.1.2" + dependencies: + source-map: "npm:0.5.6" + stackframe: "npm:^1.3.4" + checksum: 10/21cb60ce0990f7a661e964cf4bdef1e70dda2286fb628fbd0fd1e69e8925138433d08ed84969de2d396b3b91515e15336a502f777c26587db89f3933d6f63f9b + languageName: node + linkType: hard + +"stacktrace-js@npm:^2.0.2": + version: 2.0.2 + resolution: "stacktrace-js@npm:2.0.2" + dependencies: + error-stack-parser: "npm:^2.0.6" + stack-generator: "npm:^2.0.5" + stacktrace-gps: "npm:^3.0.4" + checksum: 10/e5f60a09852687e4a9206927fe1078e24d63e00a71a2dcddd67940e9504a54931a3454439d5b4e3e0e62aeb979be810573e8d3332fbef0dbfa335a8781b4b57c + languageName: node + linkType: hard + "statuses@npm:>= 1.5.0 < 2": version: 1.5.0 resolution: "statuses@npm:1.5.0" @@ -14092,7 +18501,7 @@ __metadata: languageName: node linkType: hard -"stop-iteration-iterator@npm:^1.1.0": +"stop-iteration-iterator@npm:^1.0.0, stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" dependencies: @@ -14304,6 +18713,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 10/18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + "strip-json-comments@npm:5.0.3": version: 5.0.3 resolution: "strip-json-comments@npm:5.0.3" @@ -14325,6 +18743,15 @@ __metadata: languageName: node linkType: hard +"strnum@npm:^2.4.2": + version: 2.5.1 + resolution: "strnum@npm:2.5.1" + dependencies: + anynum: "npm:^1.0.1" + checksum: 10/97918f9e6a30a9a79b4de616e09778e846f8cbce1230ed67c1b68db06e3baaf8c89e4c255ef6eafb2404b26f2bd59627e94647c2389388e5897e5707dbe98178 + languageName: node + linkType: hard + "strtok3@npm:^10.3.4": version: 10.6.2 resolution: "strtok3@npm:10.6.2" @@ -14350,6 +18777,15 @@ __metadata: languageName: node linkType: hard +"style-to-object@npm:^0.4.0": + version: 0.4.4 + resolution: "style-to-object@npm:0.4.4" + dependencies: + inline-style-parser: "npm:0.1.1" + checksum: 10/3101c0de5325e8051c3665125468af73578eba4712b818458b9f7ed732d7800f3b34e088e5c16f60070644db25316fa5a5b8b69e7f3414c879401eb074a2211e + languageName: node + linkType: hard + "stylehacks@npm:^5.1.1": version: 5.1.1 resolution: "stylehacks@npm:5.1.1" @@ -14362,6 +18798,20 @@ __metadata: languageName: node linkType: hard +"stylis@npm:4.2.0": + version: 4.2.0 + resolution: "stylis@npm:4.2.0" + checksum: 10/58359185275ef1f39c339ae94e598168aa6bb789f6cf0d52e726c1e7087a94e9c17f0385a28d34483dec1ffc2c75670ec714dc5603d99c3124ec83bc2b0a0f42 + languageName: node + linkType: hard + +"stylis@npm:^4.3.0": + version: 4.4.0 + resolution: "stylis@npm:4.4.0" + checksum: 10/e5a149b571ea88b801b43deb6f6a9f5a5711b7ce501540ac2be18ca63a4cfb3fab86309c661a2f88491a5b98f27f95ef3eb397d412fba532c50f13964d9a1013 + languageName: node + linkType: hard + "sucrase@npm:^3.20.2": version: 3.35.1 resolution: "sucrase@npm:3.35.1" @@ -14460,6 +18910,18 @@ __metadata: languageName: node linkType: hard +"swr@npm:^2.0.0": + version: 2.5.1 + resolution: "swr@npm:2.5.1" + dependencies: + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.6.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/7ba8d069bfb2a24a76c4c572c7c517b6365182c35ba10f7ed72f16dc2c038e40cf398b6fa889112c421709df38ae26944f027b529aec133dd43ddf3f1dff19e1 + languageName: node + linkType: hard + "tapable@npm:2.3.0": version: 2.3.0 resolution: "tapable@npm:2.3.0" @@ -14602,6 +19064,13 @@ __metadata: languageName: node linkType: hard +"throttle-debounce@npm:^3.0.1": + version: 3.0.1 + resolution: "throttle-debounce@npm:3.0.1" + checksum: 10/c2b591bc881c595d44d5ee82cc607747569a84cd9652e7d9613d92759d84ffd61eab1ca56c6a294316b8c9978ff6d46c2c94ed95de5847f3de4b6c30342cb947 + languageName: node + linkType: hard + "through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -14632,6 +19101,20 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.0.6": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 10/5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe + languageName: node + linkType: hard + +"tiny-warning@npm:^1.0.2": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: 10/da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": version: 0.2.17 resolution: "tinyglobby@npm:0.2.17" @@ -14662,6 +19145,13 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: 10/9a0ed0ecbaac72b4944888dacd79fe0a55eeea76120a4c7e46b3bb3d85b24f086e90560bb22f5a965654a25ab43d79ec47dfdb3f1850ba740b14c5a50abc7040 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -14712,6 +19202,20 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: 10/7a1325e4ce8ff7e9e52007600e9c9862a166d0db1f1cf0c9357e359e410acab1278fcd91cc279dfa5123fc37b69f080de02f471e91dbbc61b155b9ca92597929 + languageName: node + linkType: hard + +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 10/999c1cb3db6ec63e1663f911146a90125065da37f66ba342b031d53edb22a62f56c1f934bbc61a55b2b29dd74207544cfd78875b414665c1ffadcd9a9a009eeb + languageName: node + linkType: hard + "tryer@npm:^1.0.1": version: 1.0.1 resolution: "tryer@npm:1.0.1" @@ -14749,6 +19253,13 @@ __metadata: languageName: node linkType: hard +"ts-easing@npm:^0.2.0": + version: 0.2.0 + resolution: "ts-easing@npm:0.2.0" + checksum: 10/e67ee862acca3b2e2718e736f31999adcef862d0df76d76a0e138588728d8a87dfec9978556044640bd0e90203590ad88ac2fe8746d0e9959b8d399132315150 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -14796,7 +19307,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.1": +"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -15011,6 +19522,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:>=7.24.0 <7.24.7": + version: 7.24.6 + resolution: "undici-types@npm:7.24.6" + checksum: 10/defc9538b952e3c15b8526596c591f7c1f0c7605ad27a2b7feddbea7ef2e3003f3eda2cdb051a3cb1a2185e3893100fd9cb925c799db99d48131ea63b5233d10 + languageName: node + linkType: hard + "undici-types@npm:~6.21.0": version: 6.21.0 resolution: "undici-types@npm:6.21.0" @@ -15046,6 +19564,21 @@ __metadata: languageName: node linkType: hard +"unified@npm:^10.0.0": + version: 10.1.2 + resolution: "unified@npm:10.1.2" + dependencies: + "@types/unist": "npm:^2.0.0" + bail: "npm:^2.0.0" + extend: "npm:^3.0.0" + is-buffer: "npm:^2.0.0" + is-plain-obj: "npm:^4.0.0" + trough: "npm:^2.0.0" + vfile: "npm:^5.0.0" + checksum: 10/6cffebcefc3290be26d25a58ba714cda943142782baf320fddf374ca3a319bdaabb006f96df4be17b8b367f5e6f6e113b1027c52ef66154846a7a110550f6688 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -15064,6 +19597,71 @@ __metadata: languageName: node linkType: hard +"unist-util-generated@npm:^2.0.0": + version: 2.0.1 + resolution: "unist-util-generated@npm:2.0.1" + checksum: 10/0528642918683f1518ab7a50cf8c900df10d8717b58bd2fb05aab29393b1c4050fd2740792f18d477b52f942bfb0e6e00023e985c0a7bd63859d3d836b56e4ce + languageName: node + linkType: hard + +"unist-util-is@npm:^5.0.0": + version: 5.2.1 + resolution: "unist-util-is@npm:5.2.1" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/c10f6c07aad4f4830ffa8ea82b42a2c8d5cd36c7555e27889e5fee953040af321e4e6f4e52c4edb606604de75d7230a5f4bc7b71b8ac3e874a26ab595c2057e4 + languageName: node + linkType: hard + +"unist-util-position@npm:^4.0.0": + version: 4.0.4 + resolution: "unist-util-position@npm:4.0.4" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/aedbc5d112cdab85b752a7dacd8f04233655f00e08948a42f6e49682467c6fc0c531c91acc71188da5ac8acfea9e67d72bc054127d1c4b76b31792cfb5132423 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^3.0.0": + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/07913e4fd77fe57d95f8b2f771354f97a29082229c1ad14ceedce6bbc77b2d784ca8296563335471cdca97915e548204bd6f098ea5b808b822b4b54087662cfb + languageName: node + linkType: hard + +"unist-util-visit-parents@npm:^5.0.0, unist-util-visit-parents@npm:^5.1.1": + version: 5.1.3 + resolution: "unist-util-visit-parents@npm:5.1.3" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-is: "npm:^5.0.0" + checksum: 10/5381fc57a129d478d983b988d86b72a1266d6f91fc608562b00bfa76596128d6e4d1c2b26ced64d96e55eb5d27d620081b4ee9703979bab63e1210789e781372 + languageName: node + linkType: hard + +"unist-util-visit@npm:^4.0.0": + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-is: "npm:^5.0.0" + unist-util-visit-parents: "npm:^5.1.1" + checksum: 10/e3b20c6b1f5ae1b7b40bbf9be49103a342d98fad98bdf958110c20d72e5923bd3f12966b6702459bc61ab832facb5af418a79af87cefa7a8a41b892369678b13 + languageName: node + linkType: hard + +"universal-github-app-jwt@npm:^1.1.1": + version: 1.2.0 + resolution: "universal-github-app-jwt@npm:1.2.0" + dependencies: + "@types/jsonwebtoken": "npm:^9.0.0" + jsonwebtoken: "npm:^9.0.2" + checksum: 10/4375f84e95150c84f4e943eab2d28d7d34c16e8870e98960f513eea23babe74c17a1350dc5206e51c1ede9ac8ea7d8e6441b538fdcd68e94064547084a374cd5 + languageName: node + linkType: hard + "universal-user-agent@npm:^6.0.0": version: 6.0.1 resolution: "universal-user-agent@npm:6.0.1" @@ -15151,6 +19749,24 @@ __metadata: languageName: node linkType: hard +"use-memo-one@npm:^1.1.1": + version: 1.1.3 + resolution: "use-memo-one@npm:1.1.3" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/8f08eba26d69406b61bb4b8dacdd5a92bd6aef5b53d346dfe87954f7330ee10ecabc937cc7854635155d46053828e85c10b5a5aff7a04720e6a97b9f42999bac + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.6.0": + version: 1.7.0 + resolution: "use-sync-external-store@npm:1.7.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/cc102e193d079dda118846627f97ac8d34059ae7e1112188ed6330bd42a6b31c209cbb39923d4d663ddc42e5969913015778397131fcd3249909756c88ba9906 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -15192,6 +19808,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^3.4.0": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 10/4f2b86432b04cc7c73a0dd1bcf11f1fc18349d65d2e4e32dd0fc658909329a1e0cc9244aa93f34c0cccfdd5ae1af60a149251a5f420ec3ac4223a3dab198fb2e + languageName: node + linkType: hard + "uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -15201,6 +19826,20 @@ __metadata: languageName: node linkType: hard +"uvu@npm:^0.5.0": + version: 0.5.6 + resolution: "uvu@npm:0.5.6" + dependencies: + dequal: "npm:^2.0.0" + diff: "npm:^5.0.0" + kleur: "npm:^4.0.3" + sade: "npm:^1.7.3" + bin: + uvu: bin.js + checksum: 10/66ba25afc6732249877f9f4f8b6146f3aaa97538c51cf498f55825d602c33dbb903e02c7e1547cbca6bdfbb609e07eb7ea758b5156002ac2dd5072f00606f8d9 + languageName: node + linkType: hard + "validate.io-array@npm:^1.0.3": version: 1.0.6 resolution: "validate.io-array@npm:1.0.6" @@ -15248,6 +19887,38 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": "npm:^2.0.0" + vfile: "npm:^5.0.0" + checksum: 10/c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 + languageName: node + linkType: hard + +"vfile-message@npm:^3.0.0": + version: 3.1.4 + resolution: "vfile-message@npm:3.1.4" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-stringify-position: "npm:^3.0.0" + checksum: 10/423ca87f4427a403e4688d7ec663a2e6add694eefac47c945746463377428c7553bc613058841f1da83e18b68af886d3dd11cb96d582b5cc3c98e11efb7e55e9 + languageName: node + linkType: hard + +"vfile@npm:^5.0.0": + version: 5.3.7 + resolution: "vfile@npm:5.3.7" + dependencies: + "@types/unist": "npm:^2.0.0" + is-buffer: "npm:^2.0.0" + unist-util-stringify-position: "npm:^3.0.0" + vfile-message: "npm:^3.0.0" + checksum: 10/d8f59b419d4c83b3ed24f500cf02393149b728f8803f88519c18fe0733f62544fa9ab0d8425a8bc7835181d848b9ce29c014168dc45af72f416074bbe475f643 + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -15289,6 +19960,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: 10/b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -15425,7 +20103,7 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": +"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" dependencies: @@ -15459,7 +20137,7 @@ __metadata: languageName: node linkType: hard -"which-collection@npm:^1.0.2": +"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -15471,7 +20149,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": version: 1.1.24 resolution: "which-typed-array@npm:1.1.24" dependencies: @@ -15634,7 +20312,24 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.2": +"wsl-utils@npm:^1.0.0": + version: 1.0.1 + resolution: "wsl-utils@npm:1.0.1" + dependencies: + is-wsl: "npm:^3.1.0" + powershell-utils: "npm:^0.2.0" + checksum: 10/24b4b83795eca684948fdf093165ee34ee775eca33d6fc298cb9f89b6504233f7047b976d1b09bb15c31510d1b40d208ae6c542819f86eb355040fa6bdd7a31e + languageName: node + linkType: hard + +"xml-naming@npm:^0.3.0": + version: 0.3.0 + resolution: "xml-naming@npm:0.3.0" + checksum: 10/1a09c3f14747bf243d4bbcfdb9917c40e9cbb4b6464f2b9fe6927976770dfa38eedfe94190b5b6db470f22429fd4bda688b1831ca36a769a6745ccb9bb595150 + languageName: node + linkType: hard + +"xtend@npm:^4.0.0, xtend@npm:^4.0.2": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: 10/ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a @@ -15677,7 +20372,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.2, yaml@npm:^1.7.2": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.3 resolution: "yaml@npm:1.10.3" checksum: 10/e2ef2feb92c708138f016c69777a0f1e45f6d3c5e7cbcda30807a98a37eda2e008bd4fa57352b043c65245a4c799d0c99d1f9b3425de40e70929e26d2ea38215 @@ -15782,6 +20477,13 @@ __metadata: languageName: node linkType: hard +"zen-observable@npm:^0.10.0": + version: 0.10.0 + resolution: "zen-observable@npm:0.10.0" + checksum: 10/dc960a8e1f4e1277f1eaf79adcbd01e35b9be9fa0abb0595aab3485b0c2d8e57ace79fd08b8cddd83aeb0779ec7d9c0cfca696ac344bfd8f35ac69f3e75faaff + languageName: node + linkType: hard + "zod-to-json-schema@npm:^3.25.1": version: 3.25.2 resolution: "zod-to-json-schema@npm:3.25.2" @@ -15806,3 +20508,10 @@ __metadata: checksum: 10/3ca8b8d6bb401538e59504c543db629ea7beaa775e504c3f22269b406fdffbf1431c856d59a597bf66d8487e4d2be12b03a55d76fc2c63d9f046eae1ca173bca languageName: node linkType: hard + +"zwitch@npm:^2.0.0": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: 10/f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard From 676dd54fefb970673f9c7f36f44b9cded54b2feb Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:17:38 +0200 Subject: [PATCH 04/28] Fix padding and width of centered guided tour steps Centered steps rendered the card straight into the Backstage UI Dialog, which only pads its DialogBody, and the card had a fixed width narrower than the dialog. Wrap centered steps and the loading skeleton in DialogBody, let the card fill its container, and keep the 360px width on the popover variant only. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tour/src/components/overlay/ActiveStep.tsx | 10 ++++++---- .../guided-tour/src/components/overlay/StepCard.tsx | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx index 19c7c97ddf2..c0308e664ca 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { useApi } from '@backstage/frontend-plugin-api'; -import { Dialog, Popover, Skeleton } from '@backstage/ui'; +import { Dialog, DialogBody, Popover, Skeleton } from '@backstage/ui'; import { GuidedTour, guidedTourApiRef, @@ -111,7 +111,9 @@ export function ActiveStep(props: ActiveStepProps) { if (status === 'resolving') { return ( - + + + ); } @@ -133,7 +135,7 @@ export function ActiveStep(props: ActiveStepProps) { > {card} @@ -155,7 +157,7 @@ export function ActiveStep(props: ActiveStepProps) { onOpenChange={open => !open && api.dismiss()} width={420} > - {card} + {card} ); } diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx index 4e5db49991b..f3d7fe45ef0 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx @@ -49,7 +49,7 @@ export function StepCard(props: StepCardProps) { const clickToAdvance = step.advanceOn === 'click'; return ( - + From a3dec388d26fa51be2998a625466bec402b2e656 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:19:06 +0200 Subject: [PATCH 05/28] Keep the Next button on click-through tour steps Steps with advanceOn: 'click' hid the Next button, which left the second step of the example intro tour without an obvious way forward. The button now stays; clicking the highlighted element remains the second way to advance, and the hint text is kept. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../openspec/changes/guided-tour-plugin/design.md | 4 ++-- .../changes/guided-tour-plugin/specs/guided-tour/spec.md | 5 +++++ .../guided-tour/src/components/overlay/StepCard.tsx | 8 +++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md index db70329140c..0a1449f61ec 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md @@ -259,8 +259,8 @@ For the active step the overlay: 5. `advanceOn: 'click'`: the mask hole has `pointer-events: none`, a capture-phase `click` listener on the target calls `next()`. If the click navigates, the next step's `useTargetElement` waits for the new page. The - popover hides its Next button in this mode and shows "Click the - highlighted element to continue". + popover keeps its Next button in this mode (it advances without the + click) and adds the hint "Click the highlighted element to continue". Spotlight = `position: fixed; inset: 0` SVG with a `fill-rule="evenodd"` path (full rect minus rounded target rect, padding 6px). Mask rects are diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md index 66dd0bc1043..177d9f2237d 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md @@ -143,6 +143,11 @@ A step MAY set `route` to navigate before being shown, and MAY set `advanceOn: ' - **WHEN** a step with `route: '/catalog'` becomes active while the user is on `/` - **THEN** the app navigates to `/catalog` and waits for the step target before showing the popover +#### Scenario: Click-through step keeps Next + +- **WHEN** a step has `advanceOn: 'click'` +- **THEN** the popover shows the hint to click the element and still offers the Next button, which advances without the click + #### Scenario: Click-through step - **WHEN** a step has `advanceOn: 'click'` and the user clicks the highlighted element diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx index f3d7fe45ef0..a8683e48014 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx @@ -91,11 +91,9 @@ export function StepCard(props: StepCardProps) { > {t('overlay.previous')} - {!clickToAdvance && ( - - )} + From e478971b91def50a70d3f4c0e450eaa6c86df64f Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:19:48 +0200 Subject: [PATCH 06/28] Move RestartTourAction into the guided tour react library The component now takes a tourId prop (plus optional label and icon) and is exported from @internal/backstage-plugin-guided-tour-react so any plugin can lazy-load it in a PluginHeaderActionBlueprint. The example plugin reuses it for its intro tour. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour-react/README.md | 14 ++++ .../plugins/guided-tour-react/package.json | 1 + .../src/components/RestartTourAction.tsx | 77 +++++++++++++++++++ .../plugins/guided-tour-react/src/index.ts | 1 + workspaces/guided-tours/yarn.lock | 1 + 5 files changed, 94 insertions(+) create mode 100644 workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour-react/README.md b/workspaces/guided-tours/plugins/guided-tour-react/README.md index bd94507cdc7..06e8a82c10b 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/README.md +++ b/workspaces/guided-tours/plugins/guided-tour-react/README.md @@ -45,6 +45,20 @@ Add it to your plugin's `extensions` and mark the targets in your UI:
    ...
    ``` +## Add a "restart tour" button to your plugin header + +```tsx +PluginHeaderActionBlueprint.make({ + name: 'restart-tour', + params: { + loader: () => + import('@internal/backstage-plugin-guided-tour-react').then(m => ( + + )), + }, +}); +``` + ## Start a tour from code ```tsx diff --git a/workspaces/guided-tours/plugins/guided-tour-react/package.json b/workspaces/guided-tours/plugins/guided-tour-react/package.json index b9cf9424eb3..5e515bc6665 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/package.json +++ b/workspaces/guided-tours/plugins/guided-tour-react/package.json @@ -29,6 +29,7 @@ "@backstage/frontend-plugin-api": "^0.18.0", "@backstage/ui": "^0.17.1", "@braintree/sanitize-url": "^7.1.2", + "@remixicon/react": "^4.6.0", "marked": "^15.0.12" }, "peerDependencies": { diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx b/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx new file mode 100644 index 00000000000..ac098f83595 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx @@ -0,0 +1,77 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ButtonIcon, Tooltip, TooltipTrigger } from '@backstage/ui'; +import { RiCompass3Line } from '@remixicon/react'; +import { ReactElement } from 'react'; +import { useGuidedTour } from '../hooks/useGuidedTour'; + +/** + * Props for {@link RestartTourAction}. + * + * @public + */ +export interface RestartTourActionProps { + /** Id of the tour to (re)start, e.g. `example/intro`. */ + tourId: string; + /** Accessible name and tooltip. Default "Restart the tour". */ + label?: string; + /** Icon of the button. Defaults to a compass. */ + icon?: ReactElement; +} + +/** + * An icon button that (re)starts a guided tour from its first step. Meant + * for plugin headers, e.g. through `PluginHeaderActionBlueprint`. Renders + * nothing when the guided tour plugin is not installed or the tour is + * unknown. + * + * @example + * ```tsx + * PluginHeaderActionBlueprint.make({ + * name: 'restart-tour', + * params: { + * loader: () => + * import('@internal/backstage-plugin-guided-tour-react').then(m => ( + * + * )), + * }, + * }); + * ``` + * + * @public + */ +export function RestartTourAction(props: RestartTourActionProps) { + const { + tourId, + label = 'Restart the tour', + icon = , + } = props; + const tour = useGuidedTour(tourId); + if (!tour.available) { + return null; + } + return ( + + tour.start({ force: true })} + /> + {label} + + ); +} diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts index d8d9aeaa60a..d718384d09b 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts @@ -20,3 +20,4 @@ export * from './blueprint'; export * from './hooks/useGuidedTour'; export * from './components/GuidedTourTarget'; export * from './components/MarkdownText'; +export * from './components/RestartTourAction'; diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 9094692c9b1..d0b9a1a5769 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -2575,6 +2575,7 @@ __metadata: "@backstage/frontend-test-utils": "npm:^0.6.3" "@backstage/ui": "npm:^0.17.1" "@braintree/sanitize-url": "npm:^7.1.2" + "@remixicon/react": "npm:^4.6.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" marked: "npm:^15.0.12" From 8dd0146bc9de7bd9b0c2fd72cf3f21f8a1e13c46 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:19:53 +0200 Subject: [PATCH 07/28] Open the catalog, create and settings pages in the welcome tour The sidebar steps of the welcome tour now navigate to their pages (route '/', '/create' and '/settings'). Route matching for steps is prefix based: pages such as the scaffolder redirect '/create' to '/create/templates', which the exact pathname comparison treated as "not on the route" and left the step loading forever. The root route still matches exactly. The same matcher is used by the resume-on-load rule. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../src/components/overlay/ActiveStep.tsx | 3 +- .../components/overlay/GuidedTourOverlay.tsx | 3 +- .../src/components/overlay/isOnRoute.test.ts | 31 +++++++++++++++++++ .../src/components/overlay/isOnRoute.ts | 23 ++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx index c0308e664ca..4b8c2a7784d 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx @@ -23,6 +23,7 @@ import { import { useEffect, useMemo } from 'react'; import { Dialog as AriaDialog } from 'react-aria-components'; import { useLocation, useNavigate } from 'react-router-dom'; +import { isOnRoute } from './isOnRoute'; import { Spotlight } from './Spotlight'; import { StepCard } from './StepCard'; import { useElementRect, useTargetElement } from './useTargetElement'; @@ -43,7 +44,7 @@ export function ActiveStep(props: ActiveStepProps) { const navigate = useNavigate(); const location = useLocation(); - const onRoute = !step.route || location.pathname === step.route; + const onRoute = !step.route || isOnRoute(step.route, location.pathname); useEffect(() => { if (!onRoute && step.route) { navigate(step.route); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx index 4da990821f2..fc9a9036b38 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx @@ -19,6 +19,7 @@ import { useEffect, useRef, useState } from 'react'; import { matchPath, useLocation } from 'react-router-dom'; import { selectLoginTours } from '../../api/DefaultGuidedTourApi'; import { ActiveStep } from './ActiveStep'; +import { isOnRoute } from './isOnRoute'; import { useGuidedTourSnapshot } from './useGuidedTourSnapshot'; /** @@ -61,7 +62,7 @@ export function GuidedTourOverlay() { .filter(t => t.progress?.status === 'in-progress') .filter(t => { const route = t.tour.steps[t.progress?.stepIndex ?? 0]?.route; - return !route || matchPath(route, location.pathname); + return !route || isOnRoute(route, location.pathname); }) .sort((a, b) => (b.progress?.updatedAt ?? '').localeCompare( diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts new file mode 100644 index 00000000000..afc15f1bd0d --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { isOnRoute } from './isOnRoute'; + +describe('isOnRoute', () => { + it('matches the route and its sub paths', () => { + expect(isOnRoute('/create', '/create')).toBe(true); + expect(isOnRoute('/create', '/create/templates')).toBe(true); + expect(isOnRoute('/create/', '/create/templates')).toBe(true); + expect(isOnRoute('/create', '/created')).toBe(false); + expect(isOnRoute('/create', '/settings')).toBe(false); + }); + + it('matches the root route only exactly', () => { + expect(isOnRoute('/', '/')).toBe(true); + expect(isOnRoute('/', '/catalog')).toBe(false); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts new file mode 100644 index 00000000000..f824dc32442 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function isOnRoute(route: string, pathname: string): boolean { + const base = route.replace(/\/+$/, '') || '/'; + if (base === '/') { + return pathname === '/' || pathname === ''; + } + return pathname === base || pathname.startsWith(`${base}/`); +} From 2a43e9513fdd0244a5e1a4e1315a7a036590c7a8 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:19:58 +0200 Subject: [PATCH 08/28] Rename the default RestartTourAction label "Restart the tour" becomes "Restart the guided tour" for the accessible name and tooltip. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tour-react/src/components/RestartTourAction.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx b/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx index ac098f83595..bd08f77801f 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx @@ -26,7 +26,7 @@ import { useGuidedTour } from '../hooks/useGuidedTour'; export interface RestartTourActionProps { /** Id of the tour to (re)start, e.g. `example/intro`. */ tourId: string; - /** Accessible name and tooltip. Default "Restart the tour". */ + /** Accessible name and tooltip. Default "Restart the guided tour". */ label?: string; /** Icon of the button. Defaults to a compass. */ icon?: ReactElement; @@ -56,7 +56,7 @@ export interface RestartTourActionProps { export function RestartTourAction(props: RestartTourActionProps) { const { tourId, - label = 'Restart the tour', + label = 'Restart the guided tour', icon = , } = props; const tour = useGuidedTour(tourId); From 6fb544674ec84ee56c823e1f363d8366c5ffb669 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:06 +0200 Subject: [PATCH 09/28] Restore the route of earlier steps when restarting or resuming a tour A step without a route lives on the page the tour reached before it. The tours page and the resume-on-load rule now use the closest earlier route (routeForStep) instead of only the current step's own route. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../components/overlay/GuidedTourOverlay.tsx | 4 ++-- .../src/components/overlay/isOnRoute.test.ts | 21 ++++++++++++++++++- .../src/components/overlay/isOnRoute.ts | 18 ++++++++++++++++ .../src/components/page/GuidedToursPage.tsx | 4 +++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx index fc9a9036b38..30d721f29d3 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx @@ -19,7 +19,7 @@ import { useEffect, useRef, useState } from 'react'; import { matchPath, useLocation } from 'react-router-dom'; import { selectLoginTours } from '../../api/DefaultGuidedTourApi'; import { ActiveStep } from './ActiveStep'; -import { isOnRoute } from './isOnRoute'; +import { isOnRoute, routeForStep } from './isOnRoute'; import { useGuidedTourSnapshot } from './useGuidedTourSnapshot'; /** @@ -61,7 +61,7 @@ export function GuidedTourOverlay() { .map(t => ({ tour: t, id: t.id, progress: api.getProgress(t.id) })) .filter(t => t.progress?.status === 'in-progress') .filter(t => { - const route = t.tour.steps[t.progress?.stepIndex ?? 0]?.route; + const route = routeForStep(t.tour.steps, t.progress?.stepIndex ?? 0); return !route || isOnRoute(route, location.pathname); }) .sort((a, b) => diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts index afc15f1bd0d..c868d119cf6 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { isOnRoute } from './isOnRoute'; +import { isOnRoute, routeForStep } from './isOnRoute'; describe('isOnRoute', () => { it('matches the route and its sub paths', () => { @@ -29,3 +29,22 @@ describe('isOnRoute', () => { expect(isOnRoute('/', '/catalog')).toBe(false); }); }); + +describe('routeForStep', () => { + const steps = [{}, { route: '/example' }, {}, { route: '/' }, {}]; + + it('returns the route of the step itself', () => { + expect(routeForStep(steps, 1)).toBe('/example'); + expect(routeForStep(steps, 3)).toBe('/'); + }); + + it('falls back to the closest earlier route', () => { + expect(routeForStep(steps, 2)).toBe('/example'); + expect(routeForStep(steps, 4)).toBe('/'); + }); + + it('returns undefined when no step so far set a route', () => { + expect(routeForStep(steps, 0)).toBeUndefined(); + expect(routeForStep([], 0)).toBeUndefined(); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts index f824dc32442..dcbb6ef4c77 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts @@ -21,3 +21,21 @@ export function isOnRoute(route: string, pathname: string): boolean { } return pathname === base || pathname.startsWith(`${base}/`); } + +/** + * The page a step belongs to: its own `route`, or the route of the closest + * earlier step that set one. A step without a route stays on the page the + * tour reached before it. + */ +export function routeForStep( + steps: ReadonlyArray<{ route?: string }>, + stepIndex: number, +): string | undefined { + for (let i = Math.min(stepIndex, steps.length - 1); i >= 0; i--) { + const route = steps[i]?.route; + if (route) { + return route; + } + } + return undefined; +} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx index 345e0262154..8f55a90ac22 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx @@ -35,6 +35,7 @@ import { } from '@internal/backstage-plugin-guided-tour-react'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; +import { routeForStep } from '../overlay/isOnRoute'; import { useGuidedTourSnapshot } from '../overlay/useGuidedTourSnapshot'; import { guidedTourTranslationRef } from '../../translation'; @@ -56,7 +57,8 @@ function TourRow(props: { tour: GuidedTour; progress?: GuidedTourProgress }) { const onStart = () => { const resume = status === 'inProgress'; const stepIndex = resume ? progress?.stepIndex ?? 0 : 0; - const route = tour.steps[stepIndex]?.route; + // the page the step is on, even if an earlier step set the route + const route = routeForStep(tour.steps, stepIndex); if (route) { navigate(route); } From ebb7ee4198a5b125c24d11feb61fbaca653e0922 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:11 +0200 Subject: [PATCH 10/28] Split resetProgress into resetProgress(id) and resetAllProgress() resetProgress now requires a tour id; resetAllProgress clears every tour and the onboarded flag. The tours page uses resetAllProgress for its "Reset all tours" action. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../changes/guided-tour-plugin/design.md | 5 +++-- .../changes/guided-tour-plugin/tasks.md | 2 +- .../plugins/guided-tour-react/src/api.ts | 6 ++++-- .../src/api/DefaultGuidedTourApi.test.ts | 17 ++++++++++++++++- .../guided-tour/src/api/DefaultGuidedTourApi.ts | 12 ++++++------ .../src/components/page/GuidedToursPage.tsx | 2 +- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md index 0a1449f61ec..5d359a28752 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md @@ -156,7 +156,8 @@ export interface GuidedTourApi { getSnapshot(): GuidedTourSnapshot; // { ready, onboarded, state, progress }, immutable subscribe(listener: () => void): () => void; // for useSyncExternalStore getProgress(id: string): GuidedTourProgress | undefined; // undefined when version differs - resetProgress(id?: string): Promise; // undefined = all + onboarded flag + resetProgress(id: string): Promise; // one tour + resetAllProgress(): Promise; // every tour + onboarded flag markOnboarded(): Promise; } export const guidedTourApiRef = createApiRef({ @@ -289,7 +290,7 @@ nothing on normal pages. (or `Card` list on narrow screens) with columns Title, Description, Steps, Status (New / In progress / Completed / Dismissed with BUI `Badge`), and actions Start / Restart. Header actions: "Reset all tours" (confirm with BUI -`Dialog`, then `resetProgress()`), and a note explaining auto-start. +`Dialog`, then `resetAllProgress()`), and a note explaining auto-start. Starting a tour from the page navigates to the first step's `route` if set. Sidebar: `nav.take('page:guided-tour')` inside the Settings group. diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md index 237d850911f..5f787ede8f6 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md @@ -14,7 +14,7 @@ - [x] 2.1 Scaffold `@internal/backstage-plugin-guided-tour` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. - [x] 2.2 Implement `progressStore.ts` over `storageApiRef.forBucket('guided-tour')` (per-tour keys, `onboarded`, serialized writes, `observe$`). -- [x] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `state$`, `progress$`, `resetProgress`), with table-driven unit tests using `MockStorageApi`. +- [x] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `getSnapshot`, `subscribe`, `resetProgress`, `resetAllProgress`), with table-driven unit tests using `MockStorageApi`. - [x] 2.4 Add `api:guided-tour` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. - [x] 2.5 Add `translation.ts` with all user-facing strings. diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts index e59bfe0a387..dddb298e004 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts @@ -101,8 +101,10 @@ export interface GuidedTourApi { * or it belongs to an older version of the tour. */ getProgress(id: string): GuidedTourProgress | undefined; - /** Clears progress for one tour, or for all tours and the onboarded flag. */ - resetProgress(id?: string): Promise; + /** Clears the progress of one tour; stops it if it is running. */ + resetProgress(id: string): Promise; + /** Clears the progress of every tour and the onboarded flag; stops any running tour. */ + resetAllProgress(): Promise; /** Marks the login sequence as handled for this user. */ markOnboarded(): Promise; } diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts index bc2ae42e2b3..d3c334449eb 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts @@ -140,10 +140,25 @@ describe('DefaultGuidedTourApi', () => { api.dismiss(); await flush(); expect(api.getSnapshot().onboarded).toBe(true); - await api.resetProgress(); + await api.resetAllProgress(); expect(api.getSnapshot().onboarded).toBe(false); expect(api.getProgress('a')).toBeUndefined(); }); + + it('resets a single tour and stops it when it is running', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a'), tour('b')], + storageApi: mockApis.storage(), + }); + api.start('b'); + api.dismiss(); + api.start('a'); + api.next(); + await api.resetProgress('a'); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + expect(api.getProgress('a')).toBeUndefined(); + expect(api.getProgress('b')).toMatchObject({ status: 'dismissed' }); + }); }); describe('selectLoginTours', () => { diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts index 744801ae70e..a3f9145b60d 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts @@ -198,18 +198,18 @@ export class DefaultGuidedTourApi implements GuidedTourApi { this.finishRun(); } - async resetProgress(id?: string): Promise { - if (id === undefined) { - this.setState(IDLE); - await this.store.clearAll(); - return; - } + async resetProgress(id: string): Promise { if (this.state.activeTourId === id) { this.setState(IDLE); } await this.store.clearProgress(id); } + async resetAllProgress(): Promise { + this.setState(IDLE); + await this.store.clearAll(); + } + markOnboarded(): Promise { return this.store.setOnboarded(true); } diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx index 8f55a90ac22..ab8383ce9b4 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx @@ -166,7 +166,7 @@ export function GuidedToursPage() { variant="primary" destructive onPress={async () => { - await api.resetProgress(); + await api.resetAllProgress(); setConfirmOpen(false); }} > From 6e1eccdd1bbff039fe2b8d667307213bd5fb3050 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:23 +0200 Subject: [PATCH 11/28] Turn the guided tour dev app into a portal-like demo The standalone dev app now loads the home, catalog, scaffolder, notifications and user settings plugins next to the guided tour plugin. Catalog, scaffolder and notifications APIs are replaced by in-memory mocks (dev/mockApis.tsx, dev/mockData.ts) so no backend is needed. The dev app gets its own config (dev/app-config.yaml) instead of the repository's app-config.yaml: a default home page layout, the random joke widget disabled, and the catalog at its default path. New in the demo: an "Explore the portal" tour across all those pages, the RestartTourAction header button, a markdown-heavy first step, and a home page widget pointing to the tours page. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/app-config.yaml | 40 + .../plugins/guided-tour/dev/index.tsx | 137 +- .../plugins/guided-tour/dev/mockApis.tsx | 184 +++ .../plugins/guided-tour/dev/mockData.ts | 155 +++ .../plugins/guided-tour/package.json | 12 +- workspaces/guided-tours/yarn.lock | 1231 ++++++++++++++++- 6 files changed, 1711 insertions(+), 48 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml b/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml new file mode 100644 index 00000000000..478435cc5f2 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml @@ -0,0 +1,40 @@ +# Config for the standalone dev app (`yarn start` in this package). It is +# loaded instead of the repository's app-config.yaml so the dev app does not +# inherit app-specific overrides such as the catalog being mounted at /. +app: + title: Guided tour dev app + baseUrl: http://localhost:3000 + extensions: + # fetches an external API that is blocked by CORS in local development + - home-page-widget:home/random-joke: false + # a default home page layout, otherwise the home page starts empty + - home-page-widget:home/toolkit: + config: + tools: + - url: /guided-tours + label: Guided tours + icon: docs + - url: https://backstage.io/docs/frontend-system/ + label: Frontend system docs + icon: docs + - page:home: + config: + defaultConfig: + - component: GuidedTourWelcome + column: 0 + row: 0 + width: 6 + height: 5 + - component: HomePageStarredEntities + column: 6 + row: 0 + width: 6 + height: 4 + - component: HomePageToolkit + column: 6 + row: 4 + width: 6 + height: 4 + +backend: + baseUrl: http://localhost:7007 diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx index 862c7ee007e..b5ee1f2b510 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -17,14 +17,28 @@ import { createDevApp } from '@backstage/frontend-dev-utils'; import { createFrontendModule, PageBlueprint, + PluginHeaderActionBlueprint, } from '@backstage/frontend-plugin-api'; +import catalogPlugin from '@backstage/plugin-catalog/alpha'; +import homePlugin from '@backstage/plugin-home/alpha'; +import { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha'; +import notificationsPlugin from '@backstage/plugin-notifications/alpha'; +import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; +import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; import { Button, Container, Flex, Header, Text } from '@backstage/ui'; import { GuidedTourBlueprint, + MarkdownText, + RestartTourAction, useGuidedTour, } from '@internal/backstage-plugin-guided-tour-react'; import { Link } from 'react-router-dom'; import plugin from '../src'; +import { + catalogMockModule, + notificationsMockModule, + scaffolderMockModule, +} from './mockApis'; const DemoPage = () => { const replay = useGuidedTour('guided-tour/demo-login'); @@ -32,7 +46,7 @@ const DemoPage = () => { <>
    - + This paragraph is the first target. @@ -42,6 +56,13 @@ const DemoPage = () => { + @@ -52,9 +73,12 @@ const SecondPage = () => ( <>
    - - You arrived on the second page. - + + + You arrived on the second page. + + Back to the demo page + ); @@ -64,6 +88,8 @@ const demoModule = createFrontendModule({ extensions: [ PageBlueprint.make({ name: 'demo', + // no routeRef: route refs can only be declared by the plugin itself, so + // the demo pages get no sidebar entry and are linked from the pages params: { path: '/', title: 'Demo', loader: async () => }, }), PageBlueprint.make({ @@ -74,6 +100,15 @@ const demoModule = createFrontendModule({ loader: async () => , }, }), + // the header action from the react library, shown on all guided-tour pages + PluginHeaderActionBlueprint.make({ + name: 'restart-demo-tour', + params: { + loader: async () => ( + + ), + }, + }), GuidedTourBlueprint.make({ name: 'demo-login', params: { @@ -84,8 +119,12 @@ const demoModule = createFrontendModule({ steps: [ { id: 'intro', + route: '/', target: 'demo.intro', - content: 'This is the **first** target.', + content: + 'This is the **first** target. Markdown works here:\n\n' + + '- bullet lists\n- `inline code`\n- [links](/guided-tours)\n\n' + + '1. and numbered lists', }, { id: 'link', @@ -113,6 +152,7 @@ const demoModule = createFrontendModule({ steps: [ { id: 'text', + route: '/second', target: 'second.text', placement: 'top', content: 'Starts on first visit of `/second`.', @@ -120,7 +160,92 @@ const demoModule = createFrontendModule({ ], }, }), + GuidedTourBlueprint.make({ + name: 'explore', + params: { + title: 'Explore the portal', + description: + 'A manual tour across the home, catalog, create, notifications and settings pages.', + order: 2, + steps: [ + { + id: 'home', + title: 'Home', + route: '/home', + content: 'The home page collects widgets from many plugins.', + }, + { + id: 'catalog', + title: 'The catalog', + route: '/catalog', + target: { selector: '[data-testid="user-picker-all"]' }, + placement: 'right', + content: + 'Filter the catalog by _kind_, _owner_ or _tags_. This dev app uses an in-memory catalog.', + }, + { + id: 'create', + title: 'Create', + route: '/create', + content: + 'Software templates live here. The example template comes from the mock catalog.', + }, + { + id: 'notifications', + title: 'Notifications', + route: '/notifications', + content: + 'Two of the mock notifications are unread. Mark them as read to see the counter change.', + }, + { + id: 'settings', + title: 'Settings', + route: '/settings', + content: + 'Theme, identity and feature flags. That is the end of this tour.', + }, + ], + }, + }), + ], +}); + +const homeModule = createFrontendModule({ + pluginId: 'home', + extensions: [ + HomePageWidgetBlueprint.make({ + name: 'welcome', + params: { + name: 'GuidedTourWelcome', + title: 'Guided tour demo', + description: 'Where to find things in this dev app', + components: async () => ({ + Content: () => ( + + ), + }), + }, + }), ], }); -createDevApp({ features: [plugin, demoModule] }); +createDevApp({ + features: [ + plugin, + demoModule, + homePlugin, + homeModule, + catalogPlugin, + catalogMockModule, + scaffolderPlugin, + scaffolderMockModule, + notificationsPlugin, + notificationsMockModule, + userSettingsPlugin, + ], +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx new file mode 100644 index 00000000000..712e4bf3c5a --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx @@ -0,0 +1,184 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + ApiBlueprint, + createFrontendModule, +} from '@backstage/frontend-plugin-api'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; +import { + GetNotificationsOptions, + NotificationsApi, + notificationsApiRef, + UpdateNotificationsOptions, +} from '@backstage/plugin-notifications'; +import { + Notification, + NotificationSettings, + NotificationStatus, +} from '@backstage/plugin-notifications-common'; +import { + ScaffolderApi, + scaffolderApiRef, +} from '@backstage/plugin-scaffolder-react'; +import { mockEntities, mockNotifications } from './mockData'; + +/** Replaces `api:catalog` with an in-memory catalog. */ +export const catalogMockModule = createFrontendModule({ + pluginId: 'catalog', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams(catalogApiMock.factory({ entities: mockEntities })), + }), + ], +}); + +/** Enough of the scaffolder API for the template list and the task list. */ +const scaffolderMock = { + listTasks: async () => ({ tasks: [], totalTasks: 0 }), + listActions: async () => [], + listTemplatingExtensions: async () => ({ + filters: {}, + globals: { functions: {}, values: {} }, + }), + getIntegrationsList: async () => ({ integrations: [] }), + getTemplateParameterSchema: async () => { + const template = mockEntities.find(e => e.kind === 'Template'); + const spec = template?.spec as { parameters?: object[] } | undefined; + return { + title: template?.metadata.title ?? 'Template', + description: template?.metadata.description, + steps: (spec?.parameters ?? []).map(schema => ({ + title: (schema as { title?: string }).title ?? 'Step', + schema, + })), + }; + }, + scaffold: async () => { + throw new Error('Scaffolding is not available in the guided tour dev app'); + }, + getTask: async () => { + throw new Error('No tasks in the guided tour dev app'); + }, + autocomplete: async () => ({ results: [] }), +} as unknown as ScaffolderApi; + +/** Replaces `api:scaffolder` with the mock above. */ +export const scaffolderMockModule = createFrontendModule({ + pluginId: 'scaffolder', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: scaffolderApiRef, + deps: {}, + factory: () => scaffolderMock, + }), + }), + ], +}); + +/** `undefined` keeps the current date, true stamps now, false clears it. */ +const toggle = ( + current: Date | undefined, + flag: boolean | undefined, + now: Date, +) => { + if (flag === undefined) return current; + return flag ? now : undefined; +}; + +/** In-memory notifications with working read/saved toggles. */ +class MockNotificationsApi implements NotificationsApi { + private notifications: Notification[] = [...mockNotifications]; + + async getNotifications(options: GetNotificationsOptions = {}) { + const { read, saved, search, offset = 0, limit = 20 } = options; + const matches = this.notifications + .filter(n => read === undefined || !!n.read === read) + .filter(n => saved === undefined || !!n.saved === saved) + .filter( + n => + !search || + `${n.payload.title} ${n.payload.description ?? ''}` + .toLowerCase() + .includes(search.toLowerCase()), + ) + .sort((a, b) => b.created.getTime() - a.created.getTime()); + return { + notifications: matches.slice(offset, offset + limit), + totalCount: matches.length, + }; + } + + async getNotification(id: string) { + const found = this.notifications.find(n => n.id === id); + if (!found) { + throw new Error(`Notification ${id} not found`); + } + return found; + } + + async getStatus(): Promise { + const unread = this.notifications.filter(n => !n.read).length; + return { unread, read: this.notifications.length - unread }; + } + + async updateNotifications(options: UpdateNotificationsOptions) { + const now = new Date(); + this.notifications = this.notifications.map(n => { + if (!options.ids.includes(n.id)) return n; + return { + ...n, + read: toggle(n.read, options.read, now), + saved: toggle(n.saved, options.saved, now), + updated: now, + }; + }); + return this.notifications.filter(n => options.ids.includes(n.id)); + } + + async getNotificationSettings(): Promise { + return { channels: [] }; + } + + async updateNotificationSettings(settings: NotificationSettings) { + return settings; + } + + async getTopics() { + return { + topics: [ + ...new Set(this.notifications.map(n => n.payload.topic ?? '')), + ].filter(Boolean), + }; + } +} + +/** Replaces `api:notifications` with the in-memory implementation. */ +export const notificationsMockModule = createFrontendModule({ + pluginId: 'notifications', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: notificationsApiRef, + deps: {}, + factory: () => new MockNotificationsApi(), + }), + }), + ], +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts b/workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts new file mode 100644 index 00000000000..d90f0e3c892 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts @@ -0,0 +1,155 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity } from '@backstage/catalog-model'; +import { Notification } from '@backstage/plugin-notifications-common'; +import { JsonObject } from '@backstage/types'; + +const entity = ( + kind: string, + name: string, + spec: JsonObject, + extra: Partial = {}, +): Entity => ({ + apiVersion: + kind === 'Template' + ? 'scaffolder.backstage.io/v1beta3' + : 'backstage.io/v1alpha1', + kind, + metadata: { name, namespace: 'default', ...extra }, + spec, +}); + +/** A small catalog: the examples from `examples/` plus a few extras. */ +export const mockEntities: Entity[] = [ + entity( + 'Group', + 'guests', + { type: 'team', children: [] }, + { title: 'Guests' }, + ), + entity('User', 'guest', { memberOf: ['guests'] }, { title: 'Guest' }), + entity('System', 'examples', { owner: 'guests' }), + entity( + 'Component', + 'example-website', + { + type: 'website', + lifecycle: 'experimental', + owner: 'guests', + system: 'examples', + providesApis: ['example-grpc-api'], + }, + { description: 'The example website', tags: ['frontend', 'react'] }, + ), + entity( + 'Component', + 'payments-service', + { + type: 'service', + lifecycle: 'production', + owner: 'guests', + system: 'examples', + }, + { description: 'Handles payments', tags: ['backend', 'go'] }, + ), + entity( + 'API', + 'example-grpc-api', + { + type: 'grpc', + lifecycle: 'experimental', + owner: 'guests', + system: 'examples', + definition: 'syntax = "proto3";', + }, + { description: 'The example gRPC API' }, + ), + entity( + 'Template', + 'example-nodejs-template', + { + owner: 'user:guest', + type: 'service', + parameters: [ + { + title: 'Fill in some steps', + required: ['name'], + properties: { + name: { + title: 'Name', + type: 'string', + description: 'Unique name of the component', + }, + }, + }, + ], + steps: [ + { id: 'fetch-base', name: 'Fetch Base', action: 'fetch:template' }, + ], + }, + { + title: 'Example Node.js Template', + description: 'An example template that creates a simple Node.js service', + tags: ['recommended', 'nodejs'], + }, + ), +]; + +const minutesAgo = (minutes: number) => new Date(Date.now() - minutes * 60_000); + +/** A few notifications for the guest user, two of them unread. */ +export const mockNotifications: Notification[] = [ + { + id: '1', + user: 'user:default/guest', + created: minutesAgo(5), + origin: 'plugin-scaffolder', + payload: { + title: 'Your "payments-service" template run finished', + description: 'All 4 steps completed without errors.', + link: '/create/tasks', + severity: 'normal', + topic: 'scaffolder', + }, + }, + { + id: '2', + user: 'user:default/guest', + created: minutesAgo(90), + origin: 'plugin-catalog', + payload: { + title: 'example-website has a new owner', + description: 'The component is now owned by group:default/guests.', + link: '/catalog/default/component/example-website', + severity: 'low', + topic: 'catalog', + }, + }, + { + id: '3', + user: 'user:default/guest', + created: minutesAgo(60 * 26), + read: minutesAgo(60 * 20), + origin: 'plugin-guided-tour', + payload: { + title: 'Welcome to the guided tour demo', + description: 'Replay any tour from the Guided tours page.', + link: '/guided-tours', + severity: 'normal', + topic: 'guided-tour', + }, + }, +]; diff --git a/workspaces/guided-tours/plugins/guided-tour/package.json b/workspaces/guided-tours/plugins/guided-tour/package.json index 58ff5c19bf1..3ff7cb0e5e7 100644 --- a/workspaces/guided-tours/plugins/guided-tour/package.json +++ b/workspaces/guided-tours/plugins/guided-tour/package.json @@ -17,7 +17,7 @@ }, "sideEffects": false, "scripts": { - "start": "backstage-cli package start", + "start": "backstage-cli package start --config dev/app-config.yaml", "build": "backstage-cli package build", "lint": "backstage-cli package lint", "test": "backstage-cli package test", @@ -39,10 +39,20 @@ "react-router-dom": "^6.30.2" }, "devDependencies": { + "@backstage/catalog-model": "^1.10.0", "@backstage/cli": "^0.36.5", "@backstage/frontend-defaults": "^0.5.5", "@backstage/frontend-dev-utils": "^0.1.5", "@backstage/frontend-test-utils": "^0.6.3", + "@backstage/plugin-catalog": "^2.0.8", + "@backstage/plugin-catalog-react": "^3.2.2", + "@backstage/plugin-home": "^0.9.9", + "@backstage/plugin-home-react": "^0.1.41", + "@backstage/plugin-notifications": "^0.5.20", + "@backstage/plugin-notifications-common": "^0.2.3", + "@backstage/plugin-scaffolder": "^1.38.2", + "@backstage/plugin-scaffolder-react": "^2.0.3", + "@backstage/plugin-user-settings": "^0.9.6", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.0.0", diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index d0b9a1a5769..9474074d63c 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -400,7 +400,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.29.10 resolution: "@babel/runtime@npm:7.29.10" checksum: 10/883bb39a09f4773cf46cdd7ba0080ef6b30ff996a4ed21f8d34511ec0836122e697716533da5efc9b5016f763110b19aa07e81cec6e2036fe72cb26aad556af2 @@ -480,7 +480,7 @@ __metadata: languageName: node linkType: hard -"@backstage/catalog-model@npm:^1.10.2": +"@backstage/catalog-model@npm:^1.10.0, @backstage/catalog-model@npm:^1.10.2": version: 1.10.2 resolution: "@backstage/catalog-model@npm:1.10.2" dependencies: @@ -1066,7 +1066,33 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:^0.18.15": +"@backstage/core-compat-api@npm:^0.5.16": + version: 0.5.16 + resolution: "@backstage/core-compat-api@npm:0.5.16" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-app-react": "npm:^0.2.8" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.7.2" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5fae4efb447978f2ae93e8251753c77b0fd4cd9f66a0b7a505d5a277f8e4fb436692fde548902377571ec409b800fff78df8366bbbce7c925153fd54d5b75e85 + languageName: node + linkType: hard + +"@backstage/core-components@npm:^0.18.13, @backstage/core-components@npm:^0.18.15": version: 0.18.15 resolution: "@backstage/core-components@npm:0.18.15" dependencies: @@ -1126,7 +1152,7 @@ __metadata: languageName: node linkType: hard -"@backstage/core-plugin-api@npm:^1.12.11": +"@backstage/core-plugin-api@npm:^1.12.11, @backstage/core-plugin-api@npm:^1.12.9": version: 1.12.11 resolution: "@backstage/core-plugin-api@npm:1.12.11" dependencies: @@ -1164,7 +1190,7 @@ __metadata: languageName: node linkType: hard -"@backstage/errors@npm:^1.3.2": +"@backstage/errors@npm:^1.3.1, @backstage/errors@npm:^1.3.2": version: 1.3.2 resolution: "@backstage/errors@npm:1.3.2" dependencies: @@ -1490,6 +1516,207 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-catalog-react@npm:^3.2.2, @backstage/plugin-catalog-react@npm:^3.3.0": + version: 3.3.0 + resolution: "@backstage/plugin-catalog-react@npm:3.3.0" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/core-compat-api": "npm:^0.5.16" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/integration-react": "npm:^1.2.23" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@mui/material": "npm:^5.12.2" + "@react-hookz/web": "npm:^24.0.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + classnames: "npm:^2.2.6" + lodash: "npm:^4.17.21" + material-ui-popup-state: "npm:^5.3.6" + qs: "npm:^6.15.2" + react-use: "npm:^17.2.4" + react-window: "npm:^1.8.10" + yaml: "npm:^2.0.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@backstage/frontend-test-utils": ^0.6.5 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@backstage/frontend-test-utils": + optional: true + "@types/react": + optional: true + checksum: 10/cfec8de7c86579bfdeb63d74f0ca5333ae66cbc5257940d00969e3f3e544ed3349ee68e94f88722b2539e1e6359c14b74cd1949e88e180ec3152f0f2c9b0551e + languageName: node + linkType: hard + +"@backstage/plugin-catalog@npm:^2.0.8": + version: 2.0.10 + resolution: "@backstage/plugin-catalog@npm:2.0.10" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/core-compat-api": "npm:^0.5.16" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/integration-react": "npm:^1.2.23" + "@backstage/plugin-catalog-common": "npm:^1.2.1" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/plugin-scaffolder-common": "npm:^2.3.1" + "@backstage/plugin-search-common": "npm:^1.2.26" + "@backstage/plugin-search-react": "npm:^1.11.9" + "@backstage/plugin-techdocs-common": "npm:^0.1.2" + "@backstage/plugin-techdocs-react": "npm:^1.4.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@mui/utils": "npm:^5.14.15" + "@remixicon/react": "npm:^4.6.0" + classnames: "npm:^2.3.1" + csv-stringify: "npm:^5.6.5" + dataloader: "npm:^2.0.0" + lodash: "npm:^4.17.21" + pluralize: "npm:^8.0.0" + react-helmet: "npm:6.1.0" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/16a17b5f152da1c60ccf546d6a18afad04ea337599639e062567b98a7f4e5b63a3fa675a664e44b532b9485b7c905e2308ac7cad1b54307c0ae65ffbd1634edd + languageName: node + linkType: hard + +"@backstage/plugin-home-react@npm:^0.1.41, @backstage/plugin-home-react@npm:^0.1.43": + version: 0.1.43 + resolution: "@backstage/plugin-home-react@npm:0.1.43" + dependencies: + "@backstage/core-compat-api": "npm:^0.5.16" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@rjsf/utils": "npm:5.24.13" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/d1e87c88f5bfb18215d62ec03f18809a61fd30b15c96f46a8aa03bd16acfc80e1a6f88a25bac699413507e439b72e1b5d91dcf390a84dac38500a1b0a2a408d7 + languageName: node + linkType: hard + +"@backstage/plugin-home@npm:^0.9.9": + version: 0.9.11 + resolution: "@backstage/plugin-home@npm:0.9.11" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/core-app-api": "npm:^1.20.6" + "@backstage/core-compat-api": "npm:^0.5.16" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/plugin-home-react": "npm:^0.1.43" + "@backstage/theme": "npm:^0.7.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + lodash: "npm:^4.17.21" + luxon: "npm:^3.4.3" + react-grid-layout: "npm:1.3.4" + react-resizable: "npm:^3.0.4" + react-use: "npm:^17.2.4" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/fd7f11632954d57a7222816f32386bb3e828de625fbb80182f1b9389f4def06e2ad1ec024205f32a4fcfbde50b41f6241cd39d16e6b06f5fbdfa3de04895e73c + languageName: node + linkType: hard + +"@backstage/plugin-notifications-common@npm:^0.2.3": + version: 0.2.5 + resolution: "@backstage/plugin-notifications-common@npm:0.2.5" + dependencies: + "@backstage/config": "npm:^1.3.10" + "@backstage/types": "npm:^1.2.2" + checksum: 10/00541b23a88f3fd1bdcd27b815474b5d3acfc1ca42015a79fe01c49f43a08032c74456ebee3b99b3f60817b17937c9851b835ddd698121222cc37daf52a1d450 + languageName: node + linkType: hard + +"@backstage/plugin-notifications@npm:^0.5.20": + version: 0.5.20 + resolution: "@backstage/plugin-notifications@npm:0.5.20" + dependencies: + "@backstage/core-components": "npm:^0.18.13" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/plugin-notifications-common": "npm:^0.2.3" + "@backstage/plugin-signals-react": "npm:^0.0.25" + "@backstage/theme": "npm:^0.7.3" + "@backstage/ui": "npm:^0.17.1" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + lodash: "npm:^4.17.21" + notistack: "npm:^3.0.1" + react-aria-components: "npm:~1.17.0" + react-relative-time: "npm:^0.0.9" + react-use: "npm:^17.2.4" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/e14e9749ad4405b546daa303ddfcbcdb0375b71b59d06a9151ce2cbf02b7d6f15b5b51b3596a83e20f14cfa3940bfaf83fb358bc2d95fdbd3f1d64be2c8f7107 + languageName: node + linkType: hard + "@backstage/plugin-permission-common@npm:^0.9.12": version: 0.9.12 resolution: "@backstage/plugin-permission-common@npm:0.9.12" @@ -1542,6 +1769,148 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-scaffolder-common@npm:^2.3.1": + version: 2.3.1 + resolution: "@backstage/plugin-scaffolder-common@npm:2.3.1" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/errors": "npm:^1.3.2" + "@backstage/integration": "npm:^2.1.3" + "@backstage/plugin-permission-common": "npm:^0.9.12" + "@backstage/types": "npm:^1.2.2" + "@microsoft/fetch-event-source": "npm:^2.0.1" + "@types/json-schema": "npm:^7.0.9" + cross-fetch: "npm:^4.0.0" + uri-template: "npm:^2.0.0" + zen-observable: "npm:^0.10.0" + checksum: 10/4aef37d8bf583843138a86bb56dca671918b6b42820af6b3b50e9930acd1438342e1a68cdb4362ad33b0d245f36c285addf1f5472644c31c12f8f619e11ac8ba + languageName: node + linkType: hard + +"@backstage/plugin-scaffolder-react@npm:^2.0.3, @backstage/plugin-scaffolder-react@npm:^2.1.1": + version: 2.1.1 + resolution: "@backstage/plugin-scaffolder-react@npm:2.1.1" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/plugin-scaffolder-common": "npm:^2.3.1" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@remixicon/react": "npm:^4.6.0" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.0.1" + ajv-errors: "npm:^3.0.0" + classnames: "npm:^2.2.6" + flatted: "npm:^3.4.2" + humanize-duration: "npm:^3.25.1" + immer: "npm:^9.0.6" + json-schema-library: "npm:^9.0.0" + lodash: "npm:^4.17.21" + luxon: "npm:^3.0.0" + qs: "npm:^6.15.2" + react-aria-components: "npm:^1.14.0" + react-use: "npm:^17.2.4" + use-immer: "npm:^0.11.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + peerDependencies: + "@backstage/frontend-test-utils": ^0.6.5 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router: ^6.30.3 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@backstage/frontend-test-utils": + optional: true + "@types/react": + optional: true + checksum: 10/1d71ee0b1ea33863efe6bc0e97d183b713609ea3a271ed894c3062a53d35327e6c16893bc680432c303b2f0cca1ce5f3ddd10101d362050dfe0012124458007c + languageName: node + linkType: hard + +"@backstage/plugin-scaffolder@npm:^1.38.2": + version: 1.40.0 + resolution: "@backstage/plugin-scaffolder@npm:1.40.0" + dependencies: + "@backstage/catalog-client": "npm:^1.16.3" + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/filter-predicates": "npm:^0.2.0" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/integration": "npm:^2.1.3" + "@backstage/integration-react": "npm:^1.2.23" + "@backstage/plugin-catalog-common": "npm:^1.2.1" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/plugin-home-react": "npm:^0.1.43" + "@backstage/plugin-permission-react": "npm:^0.5.6" + "@backstage/plugin-scaffolder-common": "npm:^2.3.1" + "@backstage/plugin-scaffolder-react": "npm:^2.1.1" + "@backstage/plugin-techdocs-common": "npm:^0.1.2" + "@backstage/plugin-techdocs-react": "npm:^1.4.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@codemirror/language": "npm:^6.0.0" + "@codemirror/legacy-modes": "npm:^6.1.0" + "@codemirror/view": "npm:^6.0.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + "@uiw/react-codemirror": "npm:^4.9.3" + classnames: "npm:^2.2.6" + git-url-parse: "npm:^15.0.0" + humanize-duration: "npm:^3.25.1" + idb-keyval: "npm:5.1.5" + json-schema-library: "npm:^9.0.0" + jszip: "npm:^3.10.1" + lodash: "npm:^4.17.21" + luxon: "npm:^3.0.0" + qs: "npm:^6.15.2" + react-aria-components: "npm:^1.14.0" + react-intersection-observer: "npm:^9.5.3" + react-resizable: "npm:^3.0.5" + react-resizable-panels: "npm:^3.0.4" + react-use: "npm:^17.2.4" + react-window: "npm:^1.8.10" + yaml: "npm:^2.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/d95aac25683f98982ffa183cfedc6f8a2cc03dfe4a5ef3eb1a484c7fa1caa1a20e1e2333c4280d9282ac36faa658934441c152551332f8c75ef766629652bc1a + languageName: node + linkType: hard + "@backstage/plugin-search-common@npm:^1.2.26": version: 1.2.26 resolution: "@backstage/plugin-search-common@npm:1.2.26" @@ -1552,6 +1921,154 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-search-react@npm:^1.11.9": + version: 1.11.9 + resolution: "@backstage/plugin-search-react@npm:1.11.9" + dependencies: + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-search-common": "npm:^1.2.26" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + lodash: "npm:^4.17.21" + qs: "npm:^6.15.2" + react-use: "npm:^17.3.2" + zod: "npm:^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ad8d4a296e1171e85a30b85c5918fcc36a9579dcf747ac450fe4df9db4798405c0b6eeb4584484082930cd562699407562e8557f1551eac7c235596dd625db0d + languageName: node + linkType: hard + +"@backstage/plugin-signals-react@npm:^0.0.25": + version: 0.0.25 + resolution: "@backstage/plugin-signals-react@npm:0.0.25" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/types": "npm:^1.2.2" + "@material-ui/core": "npm:^4.12.4" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/da43e36a5152c1a103f5daaa023678f3efd000b6d98662a8efe52229ec2de00c58a5ab5dc2c692f6b5b4c0a408dba4bacd6bca4341b6f2660f6a6c3b5135645d + languageName: node + linkType: hard + +"@backstage/plugin-signals-react@npm:^0.0.27": + version: 0.0.27 + resolution: "@backstage/plugin-signals-react@npm:0.0.27" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/types": "npm:^1.2.2" + "@material-ui/core": "npm:^4.12.4" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/afcd1429809cddd4815727c0dc8ac513647e5bd96c7ecf15b60b42bc746160c314be760caa36fbb30ad6736af0ba20601a1db27306011d878ebf853304ffd96b + languageName: node + linkType: hard + +"@backstage/plugin-techdocs-common@npm:^0.1.2": + version: 0.1.2 + resolution: "@backstage/plugin-techdocs-common@npm:0.1.2" + dependencies: + "@backstage/plugin-permission-common": "npm:^0.9.12" + checksum: 10/b099c4e5532be6743791498724507035ff87792761820491b129f1249c9efc917123fcdadaffb6a021bebec2e5f21bca2c3e36906b79f611b875d35e00b1ff29 + languageName: node + linkType: hard + +"@backstage/plugin-techdocs-react@npm:^1.4.0": + version: 1.4.0 + resolution: "@backstage/plugin-techdocs-react@npm:1.4.0" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/config": "npm:^1.3.10" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-techdocs-common": "npm:^0.1.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/styles": "npm:^4.11.0" + jss: "npm:~10.10.0" + lodash: "npm:^4.17.21" + react-use: "npm:^17.2.4" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/1271a4d15c538097ecb8f3819e8b3f6314831e0fa572301ef45d6a1ffbfd19fbd0e759435488353dfc6bd57f6c791ec7d3dfd06ea06360a1df39cfdfb2fbf804 + languageName: node + linkType: hard + +"@backstage/plugin-user-settings-common@npm:^0.1.0": + version: 0.1.0 + resolution: "@backstage/plugin-user-settings-common@npm:0.1.0" + dependencies: + "@backstage/types": "npm:^1.2.2" + checksum: 10/69c2a79b7bb1386d19b4c7f15a5e9965531f1dc63105fce4fbcdefad0ff6824a39b4b37f7f93baf5330dc51c6b386c02edbb5a4678393f4b033832764687d646 + languageName: node + linkType: hard + +"@backstage/plugin-user-settings@npm:^0.9.6": + version: 0.9.8 + resolution: "@backstage/plugin-user-settings@npm:0.9.8" + dependencies: + "@backstage/catalog-model": "npm:^1.10.2" + "@backstage/core-app-api": "npm:^1.20.6" + "@backstage/core-components": "npm:^0.18.15" + "@backstage/core-plugin-api": "npm:^1.12.11" + "@backstage/errors": "npm:^1.3.2" + "@backstage/frontend-plugin-api": "npm:^0.18.2" + "@backstage/plugin-catalog-react": "npm:^3.3.0" + "@backstage/plugin-signals-react": "npm:^0.0.27" + "@backstage/plugin-user-settings-common": "npm:^0.1.0" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.19.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + dataloader: "npm:^2.0.0" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/83409eaa8276efdf5769b498ab3cc09ad1870a9e5b3c412640b3579cb1874ebb005f8e8ccc8c6b47d290d1db6c7d418de650a8971a9b39b33c600c20cad7b63e + languageName: node + linkType: hard + "@backstage/release-manifests@npm:^0.0.15": version: 0.0.15 resolution: "@backstage/release-manifests@npm:0.0.15" @@ -2001,6 +2518,116 @@ __metadata: languageName: node linkType: hard +"@codemirror/autocomplete@npm:^6.0.0": + version: 6.20.4 + resolution: "@codemirror/autocomplete@npm:6.20.4" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.17.0" + "@lezer/common": "npm:^1.0.0" + checksum: 10/54b1175a055615555be7e5cd8b769a83a0fb868156315822bb71eea9a5e89c21d983b5f1c596e0efe007259fae58c7f6e4e11963358493a4789291a0b4b14e9f + languageName: node + linkType: hard + +"@codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.1.0": + version: 6.11.1 + resolution: "@codemirror/commands@npm:6.11.1" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.7.0" + "@codemirror/view": "npm:^6.27.0" + "@lezer/common": "npm:^1.1.0" + checksum: 10/4eba3c678e3e58a0d0bdd83a1a0040dae7d38f64a7c6b357b81d458db2e8815fb5e7e3bb5fa59257d93e74fa460ad07cd4eb25d3986670d90c7ee263fe6ab46a + languageName: node + linkType: hard + +"@codemirror/language@npm:^6.0.0": + version: 6.13.1 + resolution: "@codemirror/language@npm:6.13.1" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/streamparser": "npm:^6.0.0" + "@codemirror/view": "npm:^6.23.0" + "@lezer/common": "npm:^1.5.0" + "@lezer/highlight": "npm:^1.0.0" + "@lezer/lr": "npm:^1.0.0" + style-mod: "npm:^4.0.0" + checksum: 10/54b57fdc202cd05d1cbd6c93718dbbc405de8205ab6cdccf402faa3b68340adb54e970773ba46909fe811f6aaaf8bab489708a73de00f36dc8cebfbe474689aa + languageName: node + linkType: hard + +"@codemirror/legacy-modes@npm:^6.1.0": + version: 6.5.5 + resolution: "@codemirror/legacy-modes@npm:6.5.5" + dependencies: + "@codemirror/streamparser": "npm:^6.0.0" + checksum: 10/f61a213e0d9221590422dcd0f3fad4826f885f1ff473dfc6788d0c62c60b56ca78f5484bd61b2ec8a058af427fb3195ecd3e3ae9498b57a4e4ff1669c622172c + languageName: node + linkType: hard + +"@codemirror/lint@npm:^6.0.0": + version: 6.9.7 + resolution: "@codemirror/lint@npm:6.9.7" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.42.0" + crelt: "npm:^1.0.5" + checksum: 10/f1af8295e1741a8d0c155cd7552c35d21c859d8848571fa084f5a6f2a50cac51ed25f04e423cab0f094e11b4828a54de4383a97b6b8cf6a242c5941034bffa04 + languageName: node + linkType: hard + +"@codemirror/search@npm:^6.0.0": + version: 6.7.2 + resolution: "@codemirror/search@npm:6.7.2" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.37.0" + crelt: "npm:^1.0.5" + checksum: 10/33a9d050b0e816bdbcdf7d53b37ebacdbfbeb4337cfbec9e1fec3ef99e79b782ec5df9cfcf1fe543572c9eb0d8ce8d923dce5044f37c5446b489518daa58dce3 + languageName: node + linkType: hard + +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.7.0": + version: 6.7.6 + resolution: "@codemirror/state@npm:6.7.6" + dependencies: + "@marijn/find-cluster-break": "npm:^1.0.0" + checksum: 10/700b582d4dae6ee71b1fef99eae39025192bbfcd73e3ae65000b1b471ecf0f0d34e1d28c0983af7c374df527a9302ba6e0b63cb45a6d71bda4beec1abb4ca170 + languageName: node + linkType: hard + +"@codemirror/streamparser@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/streamparser@npm:6.0.0" + checksum: 10/cb53674d779d9c5b5d39e6866c10228307684e40a14983078cb4adf8167a510f16fa226fe022cbe30d7fe345dd872bdbdcc2b47cc19b7a2a189efa4b77b4af61 + languageName: node + linkType: hard + +"@codemirror/theme-one-dark@npm:^6.0.0": + version: 6.1.3 + resolution: "@codemirror/theme-one-dark@npm:6.1.3" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + "@lezer/highlight": "npm:^1.0.0" + checksum: 10/f62c2393aad715626a1fe3a766c87f3f835bfdae7c56f738601cdee56f02417d56b203cfbbaffbd601887865ce0b1a662c1473296a107616adb311d63fc81146 + languageName: node + linkType: hard + +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.37.0, @codemirror/view@npm:^6.42.0": + version: 6.43.15 + resolution: "@codemirror/view@npm:6.43.15" + dependencies: + "@codemirror/state": "npm:^6.7.0" + crelt: "npm:^1.0.6" + style-mod: "npm:^4.1.0" + w3c-keyname: "npm:^2.2.4" + checksum: 10/9385747b04f514249f948334aaa02d8a2465bb13d042e6ac61fbeb41eba85f247bff32db465dbf73ae18fa9ec77d5791eef97de16a35e07fbba09d1f7eb08f99 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -2591,11 +3218,21 @@ __metadata: version: 0.0.0-use.local resolution: "@internal/backstage-plugin-guided-tour@workspace:plugins/guided-tour" dependencies: + "@backstage/catalog-model": "npm:^1.10.0" "@backstage/cli": "npm:^0.36.5" "@backstage/frontend-defaults": "npm:^0.5.5" "@backstage/frontend-dev-utils": "npm:^0.1.5" "@backstage/frontend-plugin-api": "npm:^0.18.0" "@backstage/frontend-test-utils": "npm:^0.6.3" + "@backstage/plugin-catalog": "npm:^2.0.8" + "@backstage/plugin-catalog-react": "npm:^3.2.2" + "@backstage/plugin-home": "npm:^0.9.9" + "@backstage/plugin-home-react": "npm:^0.1.41" + "@backstage/plugin-notifications": "npm:^0.5.20" + "@backstage/plugin-notifications-common": "npm:^0.2.3" + "@backstage/plugin-scaffolder": "npm:^1.38.2" + "@backstage/plugin-scaffolder-react": "npm:^2.0.3" + "@backstage/plugin-user-settings": "npm:^0.9.6" "@backstage/types": "npm:^1.2.2" "@backstage/ui": "npm:^0.17.1" "@internal/backstage-plugin-guided-tour-react": "workspace:^" @@ -3081,6 +3718,31 @@ __metadata: languageName: node linkType: hard +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.3.0, @lezer/common@npm:^1.5.0": + version: 1.5.4 + resolution: "@lezer/common@npm:1.5.4" + checksum: 10/69ea890d82d77506a61d7e25c88332c2424bd99ceacf5fa7880e151414c1908b07a39ab95b8262b0912ed965618b20ea3087f002c1328e6b5fa052b51d924f3c + languageName: node + linkType: hard + +"@lezer/highlight@npm:^1.0.0": + version: 1.2.5 + resolution: "@lezer/highlight@npm:1.2.5" + dependencies: + "@lezer/common": "npm:^1.3.0" + checksum: 10/57a492dee8a613d51a4a076b0e15e2de378a50d4a2ccc546003f4742d4e1151c86b77bac22a3d9b1c5416dc6802ab51d1f44426a455b38779fbe9d733bc424a5 + languageName: node + linkType: hard + +"@lezer/lr@npm:^1.0.0": + version: 1.4.11 + resolution: "@lezer/lr@npm:1.4.11" + dependencies: + "@lezer/common": "npm:^1.0.0" + checksum: 10/1d010cd7598a9219ccacf9009c5e67d1ac4649741972f709a8899b3c1668cfd6b07563a05bc99d11349f0e989588ae6e2e4739323ba34bf9091eacc04ba5fe06 + languageName: node + linkType: hard + "@lukeed/csprng@npm:^1.0.0": version: 1.1.0 resolution: "@lukeed/csprng@npm:1.1.0" @@ -3114,6 +3776,13 @@ __metadata: languageName: node linkType: hard +"@marijn/find-cluster-break@npm:^1.0.0": + version: 1.0.4 + resolution: "@marijn/find-cluster-break@npm:1.0.4" + checksum: 10/baacaa9face43ddd76e323d48baf73bd0aa14d97cf45e729dc284baf0673f3563677a8f468413bd356790dae4f76745bfb7850cd767e0eef871f452a6a53d0fe + languageName: node + linkType: hard + "@material-table/core@npm:^3.1.0": version: 3.2.5 resolution: "@material-table/core@npm:3.2.5" @@ -3139,7 +3808,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.9.13": +"@material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.12.4, @material-ui/core@npm:^4.9.13": version: 4.12.4 resolution: "@material-ui/core@npm:4.12.4" dependencies: @@ -3224,7 +3893,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/styles@npm:^4.11.4, @material-ui/styles@npm:^4.11.5": +"@material-ui/styles@npm:^4.11.0, @material-ui/styles@npm:^4.11.4, @material-ui/styles@npm:^4.11.5": version: 4.11.5 resolution: "@material-ui/styles@npm:4.11.5" dependencies: @@ -3351,6 +4020,13 @@ __metadata: languageName: node linkType: hard +"@microsoft/fetch-event-source@npm:^2.0.1": + version: 2.0.1 + resolution: "@microsoft/fetch-event-source@npm:2.0.1" + checksum: 10/c147055fafe83801efb9834136ba4b7944406a0bba3517afcea6ceeb56714b5ef78c2e89544bd9c1426ad1d2f964a087e3a719169ae04855836a23fb53269f8d + languageName: node + linkType: hard + "@microsoft/tsdoc-config@npm:~0.18.2": version: 0.18.3 resolution: "@microsoft/tsdoc-config@npm:0.18.3" @@ -3739,7 +4415,7 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.17.1": +"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.17.1": version: 5.17.1 resolution: "@mui/utils@npm:5.17.1" dependencies: @@ -4634,6 +5310,63 @@ __metadata: languageName: node linkType: hard +"@rjsf/core@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/core@npm:5.24.13" + dependencies: + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + markdown-to-jsx: "npm:^7.4.1" + prop-types: "npm:^15.8.1" + peerDependencies: + "@rjsf/utils": ^5.24.x + react: ^16.14.0 || >=17 + checksum: 10/80defb9ccbb563722dc0a613358122e86c775d10af04d1298e416e7069fa30cddf71823c82444fb1b5ab2f8e4706ff09f2606259fdd8ea59865373eb9493eb5e + languageName: node + linkType: hard + +"@rjsf/material-ui@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/material-ui@npm:5.24.13" + peerDependencies: + "@material-ui/core": ^4.12.3 + "@material-ui/icons": ^4.11.2 + "@rjsf/core": ^5.24.x + "@rjsf/utils": ^5.24.x + react: ^16.14.0 || >=17 + checksum: 10/b52e35973e81670cf57d8d3bda10b2b1bc57dfb5b6ab7be6176e6d5c384d40b86171bb30e7712e0d5971428e1553a70de08935fa680ef6877b0e97ad4c192059 + languageName: node + linkType: hard + +"@rjsf/utils@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/utils@npm:5.24.13" + dependencies: + json-schema-merge-allof: "npm:^0.8.1" + jsonpointer: "npm:^5.0.1" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + react-is: "npm:^18.2.0" + peerDependencies: + react: ^16.14.0 || >=17 + checksum: 10/4bd6788c4d12c147bd26c67568267ce34d15f618c1f38f964e6981d202bf78e2101ab0d286987659840455115bd8f183aa133308bf0f8468ca44153723e3c6d0 + languageName: node + linkType: hard + +"@rjsf/validator-ajv8@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/validator-ajv8@npm:5.24.13" + dependencies: + ajv: "npm:^8.12.0" + ajv-formats: "npm:^2.1.1" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + peerDependencies: + "@rjsf/utils": ^5.24.x + checksum: 10/a684862ded27792c8f40cfcf26436fa91f0666c6b95aa7281bb6448221a85cffb6a178fd99d172758aae2c41c58033047d902743962b7f3a2b46204ebdb0009d + languageName: node + linkType: hard + "@rollup/plugin-commonjs@npm:^26.0.0": version: 26.0.3 resolution: "@rollup/plugin-commonjs@npm:26.0.3" @@ -5164,6 +5897,23 @@ __metadata: languageName: node linkType: hard +"@sagold/json-pointer@npm:^5.1.2": + version: 5.1.2 + resolution: "@sagold/json-pointer@npm:5.1.2" + checksum: 10/4c173d6cf63932aa6f6ea0b2729ccc1935ff4ff32b6b5df9ee6254ff290fef638dab20bcdb9650e95c7caf13dba7724a1e1ec8d6d23205b5794eb930bdce58d4 + languageName: node + linkType: hard + +"@sagold/json-query@npm:^6.1.3": + version: 6.2.0 + resolution: "@sagold/json-query@npm:6.2.0" + dependencies: + "@sagold/json-pointer": "npm:^5.1.2" + ebnf: "npm:^1.9.1" + checksum: 10/8b0b6b24140fc00c5798710181c48ce858fdc864bf4440f8091f64a45e62bb550fb0153c93793b2ff3f8c1239a3882262b784b429f349ebe12243c4658d117a7 + languageName: node + linkType: hard + "@scarf/scarf@npm:^1.4.0": version: 1.4.0 resolution: "@scarf/scarf@npm:1.4.0" @@ -6523,6 +7273,51 @@ __metadata: languageName: node linkType: hard +"@uiw/codemirror-extensions-basic-setup@npm:4.25.12": + version: 4.25.12 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.25.12" + dependencies: + "@codemirror/autocomplete": "npm:^6.0.0" + "@codemirror/commands": "npm:^6.0.0" + "@codemirror/language": "npm:^6.0.0" + "@codemirror/lint": "npm:^6.0.0" + "@codemirror/search": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + peerDependencies: + "@codemirror/autocomplete": ">=6.0.0" + "@codemirror/commands": ">=6.0.0" + "@codemirror/language": ">=6.0.0" + "@codemirror/lint": ">=6.0.0" + "@codemirror/search": ">=6.0.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + checksum: 10/5dab2c03bfd5c6e706c0d96a82ec30694da3d5440a01a378d42335083728055d89dd0902be6bd8f7b54812690dfa1232f730e5faa21c11ad028a075c2b127955 + languageName: node + linkType: hard + +"@uiw/react-codemirror@npm:^4.9.3": + version: 4.25.12 + resolution: "@uiw/react-codemirror@npm:4.25.12" + dependencies: + "@babel/runtime": "npm:^7.18.6" + "@codemirror/commands": "npm:^6.1.0" + "@codemirror/state": "npm:^6.1.1" + "@codemirror/theme-one-dark": "npm:^6.0.0" + "@uiw/codemirror-extensions-basic-setup": "npm:4.25.12" + codemirror: "npm:^6.0.0" + peerDependencies: + "@babel/runtime": ">=7.11.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/theme-one-dark": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + codemirror: ">=6.0.0" + react: ">=17.0.0" + react-dom: ">=17.0.0" + checksum: 10/b325b23c082f3254ddbaeb5d1fa4acdda4d15481abca78061e6147a310cb5bcba171b9eef4e354a0ad4a2d72207acfe848d4906b1ffe5a221c2f56f3fc3e092f + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.4.0 resolution: "@ungap/structured-clone@npm:1.4.0" @@ -6898,7 +7693,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.17.1, ajv@npm:^8.18.0, ajv@npm:^8.20.0, ajv@npm:^8.9.0, ajv@npm:~8.20.0": +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.10.0, ajv@npm:^8.12.0, ajv@npm:^8.17.1, ajv@npm:^8.18.0, ajv@npm:^8.20.0, ajv@npm:^8.9.0, ajv@npm:~8.20.0": version: 8.20.0 resolution: "ajv@npm:8.20.0" dependencies: @@ -8007,7 +8802,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:^2.2.6": +"classnames@npm:^2.2.6, classnames@npm:^2.3.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 @@ -8147,7 +8942,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.0.2, clsx@npm:^1.0.4": +"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.0, clsx@npm:^1.1.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 @@ -8168,6 +8963,21 @@ __metadata: languageName: node linkType: hard +"codemirror@npm:^6.0.0": + version: 6.0.2 + resolution: "codemirror@npm:6.0.2" + dependencies: + "@codemirror/autocomplete": "npm:^6.0.0" + "@codemirror/commands": "npm:^6.0.0" + "@codemirror/language": "npm:^6.0.0" + "@codemirror/lint": "npm:^6.0.0" + "@codemirror/search": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + checksum: 10/bd73c9ebbd8cb709a697fa4e2484c188c44aafce4b4d2a342807a5648c6be5bd5876f0caac47db0c1181f1ec8d86e38bd2b6efe51b971bf240fd3382bef0b371 + languageName: node + linkType: hard + "codeowners-utils@npm:^1.0.2": version: 1.0.2 resolution: "codeowners-utils@npm:1.0.2" @@ -8291,7 +9101,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.0": +"commander@npm:^2.19.0, commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b @@ -8598,6 +9408,13 @@ __metadata: languageName: node linkType: hard +"crelt@npm:^1.0.5, crelt@npm:^1.0.6": + version: 1.0.7 + resolution: "crelt@npm:1.0.7" + checksum: 10/eb0f98bfd3f0bc934a2d45bb14f62bc956c790dcb071c179ab9c3968e5d899d7747cadd18d3eee99302838f185017919321cbb4acfb3c055ffe82793c186dc2b + languageName: node + linkType: hard + "cross-fetch@npm:^4.0.0": version: 4.1.0 resolution: "cross-fetch@npm:4.1.0" @@ -8822,13 +9639,20 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": +"csstype@npm:^3.0.10, csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f languageName: node linkType: hard +"csv-stringify@npm:^5.6.5": + version: 5.6.5 + resolution: "csv-stringify@npm:5.6.5" + checksum: 10/efed94869b8426e6a983f2237bd74eff15953e2e27affee9c1324f66a67dabe948573c4c21a8661a79aa20b58efbcafcf11c34e80bdd532a43f35e9cde5985b9 + languageName: node + linkType: hard + "ctrlc-windows@npm:^2.1.0": version: 2.2.0 resolution: "ctrlc-windows@npm:2.2.0" @@ -9104,7 +9928,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 @@ -9320,6 +10144,13 @@ __metadata: languageName: node linkType: hard +"discontinuous-range@npm:1.0.0": + version: 1.0.0 + resolution: "discontinuous-range@npm:1.0.0" + checksum: 10/3c1716c6f107e80082600ac57648b49baa9aa60f71a442dadbaf66179610e239ed95ba96ff6080bc7845ea027ffe9176e22e94a04ff275a7dd5c30e2aece4cba + languageName: node + linkType: hard + "dns-packet@npm:^5.2.2": version: 5.6.1 resolution: "dns-packet@npm:5.6.1" @@ -9472,6 +10303,15 @@ __metadata: languageName: node linkType: hard +"ebnf@npm:^1.9.1": + version: 1.9.1 + resolution: "ebnf@npm:1.9.1" + bin: + ebnf: dist/bin.js + checksum: 10/d23fff8d070b6f5a70cf64d7a84a0b8d6cdaaa85599fa401be2036acc47612626ed997a1106399d85d57888769db446dc330b3c8f7bdc255ec5836df19826425 + languageName: node + linkType: hard + "ecdsa-sig-formatter@npm:1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -10464,6 +11304,13 @@ __metadata: languageName: node linkType: hard +"fast-copy@npm:^3.0.2": + version: 3.1.0 + resolution: "fast-copy@npm:3.1.0" + checksum: 10/759ff1568a29902f4315aa17a6ec1a9cb77c400bf97df122e3408a9c95bcb8c6ebc1f0fa21da958efbd0d04371f000bfc48e8108be27d66cd86e1921838be2f8 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -10729,7 +11576,7 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.9": +"flatted@npm:^3.2.9, flatted@npm:^3.4.2": version: 3.4.4 resolution: "flatted@npm:3.4.4" checksum: 10/5a6682ab87ed15e125419c61352c4bef26f310adceece03eae5f22c119d64ed47bfc0ee1948a77d0122559eaa86395ea06ef45b59bfe3db4fb13fb4cdff876de @@ -11326,6 +12173,15 @@ __metadata: languageName: node linkType: hard +"goober@npm:^2.0.33": + version: 2.1.19 + resolution: "goober@npm:2.1.19" + peerDependencies: + csstype: ^3.0.10 + checksum: 10/1390b08f6e2468d63e463e74e50d734b9cfd2280bf1ecf04878c666f48b8a5aac2d5c4b517b4d15fc46d32a98948f386b5fcde60799f8884351b01dc7658465f + languageName: node + linkType: hard + "gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -11869,6 +12725,13 @@ __metadata: languageName: node linkType: hard +"humanize-duration@npm:^3.25.1": + version: 3.35.0 + resolution: "humanize-duration@npm:3.35.0" + checksum: 10/e670c665c825818a14aa3ba2d839e43b6765622898aa7976e51c186dd95a844c4b8ebc3d9c79df9cd6badbb1fcb66d9e660ab330623c0e262b3a9db0702c1c07 + languageName: node + linkType: hard + "hyperdyperid@npm:^1.2.0": version: 1.2.0 resolution: "hyperdyperid@npm:1.2.0" @@ -11926,6 +12789,15 @@ __metadata: languageName: node linkType: hard +"idb-keyval@npm:5.1.5": + version: 5.1.5 + resolution: "idb-keyval@npm:5.1.5" + dependencies: + safari-14-idb-fix: "npm:^1.0.6" + checksum: 10/ea171bf45788b1d0d6923b3b661609c434684bb860e638f76320f35b838a4f800dcfb835e4f3f3d39bf8864a68d76facc6b7800819704e720c94948c2f94b197 + languageName: node + linkType: hard + "identity-obj-proxy@npm:3.0.0": version: 3.0.0 resolution: "identity-obj-proxy@npm:3.0.0" @@ -11965,6 +12837,13 @@ __metadata: languageName: node linkType: hard +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: 10/f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 + languageName: node + linkType: hard + "immer@npm:^9.0.6, immer@npm:^9.0.7": version: 9.0.21 resolution: "immer@npm:9.0.21" @@ -12889,6 +13768,21 @@ __metadata: languageName: node linkType: hard +"json-schema-library@npm:^9.0.0": + version: 9.3.5 + resolution: "json-schema-library@npm:9.3.5" + dependencies: + "@sagold/json-pointer": "npm:^5.1.2" + "@sagold/json-query": "npm:^6.1.3" + deepmerge: "npm:^4.3.1" + fast-copy: "npm:^3.0.2" + fast-deep-equal: "npm:^3.1.3" + smtp-address-parser: "npm:1.0.10" + valid-url: "npm:^1.0.9" + checksum: 10/c78e0fb2a925767ff900081e3ff604b070d0a214be2388f241d43737b613af64ecddf0476f0752a10c10c3b56644e5062f3dac34507c6a17b4d8ae9fbf6fa823 + languageName: node + linkType: hard + "json-schema-merge-allof@npm:^0.8.1": version: 0.8.1 resolution: "json-schema-merge-allof@npm:0.8.1" @@ -13001,7 +13895,7 @@ __metadata: languageName: node linkType: hard -"jsonpointer@npm:^5.0.0": +"jsonpointer@npm:^5.0.0, jsonpointer@npm:^5.0.1": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" checksum: 10/0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c @@ -13100,7 +13994,7 @@ __metadata: languageName: node linkType: hard -"jss@npm:10.10.0, jss@npm:^10.5.1": +"jss@npm:10.10.0, jss@npm:^10.5.1, jss@npm:~10.10.0": version: 10.10.0 resolution: "jss@npm:10.10.0" dependencies: @@ -13124,6 +14018,18 @@ __metadata: languageName: node linkType: hard +"jszip@npm:^3.10.1": + version: 3.10.2 + resolution: "jszip@npm:3.10.2" + dependencies: + lie: "npm:~3.3.0" + pako: "npm:~1.0.2" + readable-stream: "npm:~2.3.6" + setimmediate: "npm:^1.0.5" + checksum: 10/86666f57397df56a29968e5cbf25a6b50a4812ab7258e1165ae907e6d3b442e84290cd5eefa9cdd4298653009ebe4599dae17f3de30050e4bf4a5e54462fdfd6 + languageName: node + linkType: hard + "just-diff@npm:^6.0.2": version: 6.0.2 resolution: "just-diff@npm:6.0.2" @@ -13318,6 +14224,15 @@ __metadata: languageName: node linkType: hard +"lie@npm:~3.3.0": + version: 3.3.0 + resolution: "lie@npm:3.3.0" + dependencies: + immediate: "npm:~3.0.5" + checksum: 10/f335ce67fe221af496185d7ce39c8321304adb701e122942c495f4f72dcee8803f9315ee572f5f8e8b08b9e8d7195da91b9fad776e8864746ba8b5e910adf76e + languageName: node + linkType: hard + "lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -13413,6 +14328,13 @@ __metadata: languageName: node linkType: hard +"lodash-es@npm:^4.17.21": + version: 4.18.1 + resolution: "lodash-es@npm:4.18.1" + checksum: 10/8bfad225ef09ef42b04283cdaf7830efcc2ba29ae41b56501c74422155ee1ccaa1f0f6e8319def3451a1fe54dec501c8e4bee622bae2b2d98ac993731e0a5cce + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -13441,6 +14363,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:^4.0.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10/82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 + languageName: node + linkType: hard + "lodash.isinteger@npm:^4.0.4": version: 4.0.4 resolution: "lodash.isinteger@npm:4.0.4" @@ -13593,7 +14522,7 @@ __metadata: languageName: node linkType: hard -"luxon@npm:^3.0.0": +"luxon@npm:^3.0.0, luxon@npm:^3.4.3": version: 3.7.2 resolution: "luxon@npm:3.7.2" checksum: 10/b24cd205ed306ce7415991687897dcc4027921ae413c9116590bc33a95f93b86ce52cf74ba72b4f5c5ab1c10090517f54ac8edfb127c049e0bf55b90dc2260be @@ -13659,6 +14588,18 @@ __metadata: languageName: node linkType: hard +"markdown-to-jsx@npm:^7.4.1": + version: 7.7.17 + resolution: "markdown-to-jsx@npm:7.7.17" + peerDependencies: + react: ">= 0.14.0" + peerDependenciesMeta: + react: + optional: true + checksum: 10/690a37a343d8b5a1b0fd4d4fa017b71f6df39aea782643541197a8d9ee6c1b2470fdfd2db2ba6c5adebbc890226e64000922ae826c9d3ba840bd24456eca6f69 + languageName: node + linkType: hard + "marked-terminal@npm:^7.3.0": version: 7.3.0 resolution: "marked-terminal@npm:7.3.0" @@ -13685,6 +14626,25 @@ __metadata: languageName: node linkType: hard +"material-ui-popup-state@npm:^5.3.6": + version: 5.3.7 + resolution: "material-ui-popup-state@npm:5.3.7" + dependencies: + "@babel/runtime": "npm:^7.26.0" + "@types/prop-types": "npm:^15.7.3" + classnames: "npm:^2.2.6" + prop-types: "npm:^15.7.2" + peerDependencies: + "@mui/material": ">=5 <10" + "@types/react": ^16.8.0 || ^17 || ^18 || ^19 + react: ">=16.8.0 <20" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/059a3bc399c921222d051df3aa37cde326f82a52dce9add1f841d12e42ae8179582dd4bdca59812ab0efa417ee043fa37dc1d74fcb749cc661b8d83b286eade0 + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -14594,6 +15554,13 @@ __metadata: languageName: node linkType: hard +"moo@npm:^0.5.0": + version: 0.5.3 + resolution: "moo@npm:0.5.3" + checksum: 10/ce4a2e5ccab15bbe1b1ade5b8f821eea7d03cecda2898c2b343bd2c84f357c04ada2bdbc9bef9201cd1e4ddd7f2be7d365c2e058bb4862734790e0fa77740d81 + languageName: node + linkType: hard + "motion-dom@npm:^12.43.0": version: 12.43.0 resolution: "motion-dom@npm:12.43.0" @@ -14738,6 +15705,23 @@ __metadata: languageName: node linkType: hard +"nearley@npm:^2.20.1": + version: 2.20.1 + resolution: "nearley@npm:2.20.1" + dependencies: + commander: "npm:^2.19.0" + moo: "npm:^0.5.0" + railroad-diagrams: "npm:^1.0.0" + randexp: "npm:0.4.6" + bin: + nearley-railroad: bin/nearley-railroad.js + nearley-test: bin/nearley-test.js + nearley-unparse: bin/nearley-unparse.js + nearleyc: bin/nearleyc.js + checksum: 10/b327a07d0fee967ec2b74205fee97c3ff13aeb6c91342443e5f0f00ed11e3fb8ce7e71e21de6a74f094206ebdb571e93c79a58f1fe5414714c97b0e55cd57cb2 + languageName: node + linkType: hard + "negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -14993,6 +15977,19 @@ __metadata: languageName: node linkType: hard +"notistack@npm:^3.0.1": + version: 3.0.2 + resolution: "notistack@npm:3.0.2" + dependencies: + clsx: "npm:^1.1.0" + goober: "npm:^2.0.33" + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/aa27fd7de830d0424c6a7b7966e00dee1e4a2a6894e30b17ead09c2f0f6fd51b96a6bc127985e8cc6d1c2b2d46461706f8cc33ad507dfd64a5058f2c73077d9e + languageName: node + linkType: hard + "npm-bundled@npm:^2.0.0": version: 2.0.1 resolution: "npm-bundled@npm:2.0.1" @@ -15506,7 +16503,7 @@ __metadata: languageName: node linkType: hard -"pako@npm:~1.0.5": +"pako@npm:~1.0.2, pako@npm:~1.0.5": version: 1.0.11 resolution: "pako@npm:1.0.11" checksum: 10/1ad07210e894472685564c4d39a08717e84c2a68a70d3c1d9e657d32394ef1670e22972a433cbfe48976cb98b154ba06855dcd3fcfba77f60f1777634bec48c0 @@ -15853,6 +16850,13 @@ __metadata: languageName: node linkType: hard +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10/17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec + languageName: node + linkType: hard + "pony-cause@npm:^1.1.1": version: 1.1.1 resolution: "pony-cause@npm:1.1.1" @@ -16455,7 +17459,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.0.0, prop-types@npm:^15.5.10, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:15.x, prop-types@npm:^15.0.0, prop-types@npm:^15.5.10, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -16644,6 +17648,23 @@ __metadata: languageName: node linkType: hard +"railroad-diagrams@npm:^1.0.0": + version: 1.0.0 + resolution: "railroad-diagrams@npm:1.0.0" + checksum: 10/5349cf7a27f28c2cd152b525964624e0d0a795ab062d01682084381570fbb07ab877035771bcfb27cd5b6a7ee9f8371ecc34ccc8c3bde3443676230a59a7a85e + languageName: node + linkType: hard + +"randexp@npm:0.4.6": + version: 0.4.6 + resolution: "randexp@npm:0.4.6" + dependencies: + discontinuous-range: "npm:1.0.0" + ret: "npm:~0.1.10" + checksum: 10/ae6d213ec8018b2d22960d2b73ee7a4e25f85050a11dc485b6d3a06ace318ca567353b1d75d8d11f529b7ed6bdeb52644b789307ef42812bf5da2ade4f85e113 + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -16742,24 +17763,7 @@ __metadata: languageName: node linkType: hard -"react-aria-components@npm:~1.17.0": - version: 1.17.0 - resolution: "react-aria-components@npm:1.17.0" - dependencies: - "@internationalized/date": "npm:^3.12.1" - "@react-types/shared": "npm:^3.34.0" - "@swc/helpers": "npm:^0.5.0" - client-only: "npm:^0.0.1" - react-aria: "npm:3.48.0" - react-stately: "npm:3.46.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - checksum: 10/f2d22aa1ca31da1697c4f364c9fda670c889a959661051a7f1d4f2f96ea4db3ce232fca81613cbf82411eef7d10bd3c05fc628756d9b5ca807729e02e0b12d6b - languageName: node - linkType: hard - -"react-aria-components@npm:~1.22.0": +"react-aria-components@npm:^1.14.0, react-aria-components@npm:~1.22.0": version: 1.22.1 resolution: "react-aria-components@npm:1.22.1" dependencies: @@ -16778,6 +17782,23 @@ __metadata: languageName: node linkType: hard +"react-aria-components@npm:~1.17.0": + version: 1.17.0 + resolution: "react-aria-components@npm:1.17.0" + dependencies: + "@internationalized/date": "npm:^3.12.1" + "@react-types/shared": "npm:^3.34.0" + "@swc/helpers": "npm:^0.5.0" + client-only: "npm:^0.0.1" + react-aria: "npm:3.48.0" + react-stately: "npm:3.46.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 10/f2d22aa1ca31da1697c4f364c9fda670c889a959661051a7f1d4f2f96ea4db3ce232fca81613cbf82411eef7d10bd3c05fc628756d9b5ca807729e02e0b12d6b + languageName: node + linkType: hard + "react-aria@npm:3.48.0, react-aria@npm:~3.48.0": version: 3.48.0 resolution: "react-aria@npm:3.48.0" @@ -16877,6 +17898,19 @@ __metadata: languageName: node linkType: hard +"react-draggable@npm:^4.0.0, react-draggable@npm:^4.5.0": + version: 4.7.2 + resolution: "react-draggable@npm:4.7.2" + dependencies: + clsx: "npm:^2.1.1" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ">= 16.3.0" + react-dom: ">= 16.3.0" + checksum: 10/d0913851384f840dc1cd8d447653ac73d0d6e29046368f7ff72ef34b08f0af7a6988cad6ab5c774abb428dcec8d73283754e53ce99d289914d783ad00ff85caa + languageName: node + linkType: hard + "react-error-overlay@npm:^6.0.11": version: 6.1.0 resolution: "react-error-overlay@npm:6.1.0" @@ -16902,6 +17936,22 @@ __metadata: languageName: node linkType: hard +"react-grid-layout@npm:1.3.4": + version: 1.3.4 + resolution: "react-grid-layout@npm:1.3.4" + dependencies: + clsx: "npm:^1.1.1" + lodash.isequal: "npm:^4.0.0" + prop-types: "npm:^15.8.1" + react-draggable: "npm:^4.0.0" + react-resizable: "npm:^3.0.4" + peerDependencies: + react: ">= 16.3.0" + react-dom: ">= 16.3.0" + checksum: 10/944ab133e59bfaa5633625f57be9f69133b5cec2de0232d9581e2c988e257ebafe010ee9bbbff6c2754f9d7d8bb0053072bac103f20fc232be2a58e15d14fc64 + languageName: node + linkType: hard + "react-helmet@npm:6.1.0": version: 6.1.0 resolution: "react-helmet@npm:6.1.0" @@ -16939,6 +17989,19 @@ __metadata: languageName: node linkType: hard +"react-intersection-observer@npm:^9.5.3": + version: 9.16.0 + resolution: "react-intersection-observer@npm:9.16.0" + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + checksum: 10/ded14524d9311cfb9dd9e65eb04748d07a1868f8c40dd628bec8a8474d43ee2373604fdc1e6a7d468a8e2e680638e41b91048ab9669555d50217c5c0c51247e0 + languageName: node + linkType: hard + "react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -17021,6 +18084,38 @@ __metadata: languageName: node linkType: hard +"react-relative-time@npm:^0.0.9": + version: 0.0.9 + resolution: "react-relative-time@npm:0.0.9" + peerDependencies: + react: ">=0.13.0" + checksum: 10/226b817e306b1e6db1b14c6dc8b5151ffeb2c8394d55b7c819f15f9fe127dcfdbae97956a80170f3fc4634b7f9f1b63c7ced5fad66110d9b67c758d03d6a50d7 + languageName: node + linkType: hard + +"react-resizable-panels@npm:^3.0.4": + version: 3.0.6 + resolution: "react-resizable-panels@npm:3.0.6" + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 10/cacd2a0a63e4ecca193ceb2c8369d760946987c6386e38be39c7f98f909db923f161dbfd5187c289f5093c035c4a7757c4bd30b0d792bd8b45f2bc64183fe47f + languageName: node + linkType: hard + +"react-resizable@npm:^3.0.4, react-resizable@npm:^3.0.5": + version: 3.2.0 + resolution: "react-resizable@npm:3.2.0" + dependencies: + prop-types: "npm:15.x" + react-draggable: "npm:^4.5.0" + peerDependencies: + react: ">= 16.3" + react-dom: ">= 16.3" + checksum: 10/fb0a7de795107f2d0e854c7ceb53a666ff85bf98cc75735a21f931aa52684740aabf55cf30085ac000f816173d076c69d611858e4d4577d001a56796ec0e7e32 + languageName: node + linkType: hard + "react-router-dom@npm:^6.30.2": version: 6.30.6 resolution: "react-router-dom@npm:6.30.6" @@ -17174,7 +18269,7 @@ __metadata: languageName: node linkType: hard -"react-window@npm:^1.8.6": +"react-window@npm:^1.8.10, react-window@npm:^1.8.6": version: 1.8.11 resolution: "react-window@npm:1.8.11" dependencies: @@ -17215,7 +18310,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8": +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -17551,6 +18646,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.1.10": + version: 0.1.15 + resolution: "ret@npm:0.1.15" + checksum: 10/07c9e7619b4c86053fa57689bf7606b5a40fc1231fc87682424d0b3e296641cc19c218c3b8a8917305fbcca3bfc43038a5b6a63f54755c1bbca2f91857253b03 + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -17824,6 +18926,13 @@ __metadata: languageName: node linkType: hard +"safari-14-idb-fix@npm:^1.0.6": + version: 1.0.6 + resolution: "safari-14-idb-fix@npm:1.0.6" + checksum: 10/90ea958b47209d689f65852c378dbb0c27e5eaeae77284bcfc4edb636b74da56adecf0435e4827b552944510ac65021a4457ec0bb9fdf1e348248a5e00bfe65b + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.4 resolution: "safe-array-concat@npm:1.1.4" @@ -18122,7 +19231,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.4": +"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: 10/76e3f5d7f4b581b6100ff819761f04a984fa3f3990e72a6554b57188ded53efce2d3d6c0932c10f810b7c59414f85e2ab3c11521877d1dea1ce0b56dc906f485 @@ -18289,6 +19398,15 @@ __metadata: languageName: node linkType: hard +"smtp-address-parser@npm:1.0.10": + version: 1.0.10 + resolution: "smtp-address-parser@npm:1.0.10" + dependencies: + nearley: "npm:^2.20.1" + checksum: 10/73d49712450ccd2b77ec3642e26f73fb7b3ed5b46c416d60714e2b9821e3378c3cf6b44767371d8be42286cfeae63e4c369384ef5bb3eeb42568264cbb330626 + languageName: node + linkType: hard + "sockjs@npm:^0.3.24": version: 0.3.24 resolution: "sockjs@npm:0.3.24" @@ -18778,6 +19896,13 @@ __metadata: languageName: node linkType: hard +"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": + version: 4.1.4 + resolution: "style-mod@npm:4.1.4" + checksum: 10/17d31878c98bda3082b2bffdd0b0478789686fb83fe57fca8a02db1675460b293f0fd45af8d31a7daa6d7608c8ace24f9cb68be60fcee5265f62770793e4e25e + languageName: node + linkType: hard + "style-to-object@npm:^0.4.0": version: 0.4.4 resolution: "style-to-object@npm:0.4.4" @@ -19750,6 +20875,16 @@ __metadata: languageName: node linkType: hard +"use-immer@npm:^0.11.0": + version: 0.11.0 + resolution: "use-immer@npm:0.11.0" + peerDependencies: + immer: ">=8.0.0" + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 + checksum: 10/09ddbddec5bd5a939dc462de4c9d1ce47989bc60daa712c5235664650b132e246b8e61b6bd3dc8179649445b7cf389065373c75f23829a676dbda6b5d2428928 + languageName: node + linkType: hard + "use-memo-one@npm:^1.1.1": version: 1.1.3 resolution: "use-memo-one@npm:1.1.3" @@ -19841,6 +20976,13 @@ __metadata: languageName: node linkType: hard +"valid-url@npm:^1.0.9": + version: 1.0.9 + resolution: "valid-url@npm:1.0.9" + checksum: 10/343dfaf85eb3691dc8eb93f7bc007be1ee6091e6c6d1a68bf633cb85e4bf2930e34ca9214fb2c3330de5b652510b257a8ee1ff0a0a37df0925e9dabf93ee512d + languageName: node + linkType: hard + "validate.io-array@npm:^1.0.3": version: 1.0.6 resolution: "validate.io-array@npm:1.0.6" @@ -19927,6 +21069,13 @@ __metadata: languageName: node linkType: hard +"w3c-keyname@npm:^2.2.4": + version: 2.2.8 + resolution: "w3c-keyname@npm:2.2.8" + checksum: 10/95bafa4c04fa2f685a86ca1000069c1ec43ace1f8776c10f226a73296caeddd83f893db885c2c220ebeb6c52d424e3b54d7c0c1e963bbf204038ff1a944fbb07 + languageName: node + linkType: hard + "walk-up-path@npm:^4.0.0": version: 4.0.0 resolution: "walk-up-path@npm:4.0.0" From b612056853fba6d9e0c9d479fe0227799128ec1c Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:30 +0200 Subject: [PATCH 12/28] Split the dev app tours into files and add page tours Each tour of the dev app now lives in dev/tours/. New tours start on the first visit of the catalog, create, notifications and settings pages and spotlight real elements there. The welcome tour of packages/app is carried over, targeting the default sidebar links by href. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/index.tsx | 101 +----------------- .../guided-tour/dev/tours/catalogTour.ts | 65 +++++++++++ .../guided-tour/dev/tours/demoLoginTour.ts | 53 +++++++++ .../guided-tour/dev/tours/demoRouteTour.ts | 34 ++++++ .../guided-tour/dev/tours/exploreTour.ts | 65 +++++++++++ .../plugins/guided-tour/dev/tours/index.ts | 35 ++++++ .../dev/tours/notificationsTour.ts | 56 ++++++++++ .../guided-tour/dev/tours/scaffolderTour.ts | 72 +++++++++++++ .../guided-tour/dev/tours/settingsTour.ts | 66 ++++++++++++ .../guided-tour/dev/tours/welcomeTour.ts | 82 ++++++++++++++ 10 files changed, 530 insertions(+), 99 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx index b5ee1f2b510..61940bc210f 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -27,7 +27,6 @@ import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; import { Button, Container, Flex, Header, Text } from '@backstage/ui'; import { - GuidedTourBlueprint, MarkdownText, RestartTourAction, useGuidedTour, @@ -39,6 +38,7 @@ import { notificationsMockModule, scaffolderMockModule, } from './mockApis'; +import { devTours } from './tours'; const DemoPage = () => { const replay = useGuidedTour('guided-tour/demo-login'); @@ -109,104 +109,7 @@ const demoModule = createFrontendModule({ ), }, }), - GuidedTourBlueprint.make({ - name: 'demo-login', - params: { - title: 'Welcome to the demo', - description: 'Starts on login and crosses pages.', - autoStart: 'login', - order: 1, - steps: [ - { - id: 'intro', - route: '/', - target: 'demo.intro', - content: - 'This is the **first** target. Markdown works here:\n\n' + - '- bullet lists\n- `inline code`\n- [links](/guided-tours)\n\n' + - '1. and numbered lists', - }, - { - id: 'link', - target: 'demo.link', - advanceOn: 'click', - content: 'Click this link to continue on the next page.', - }, - { - id: 'second', - target: 'second.text', - content: 'You made it across pages!', - }, - { - id: 'done', - content: 'Done. Replay it from [Guided tours](/guided-tours).', - }, - ], - }, - }), - GuidedTourBlueprint.make({ - name: 'demo-route', - params: { - title: 'Second page tour', - autoStart: { route: '/second' }, - steps: [ - { - id: 'text', - route: '/second', - target: 'second.text', - placement: 'top', - content: 'Starts on first visit of `/second`.', - }, - ], - }, - }), - GuidedTourBlueprint.make({ - name: 'explore', - params: { - title: 'Explore the portal', - description: - 'A manual tour across the home, catalog, create, notifications and settings pages.', - order: 2, - steps: [ - { - id: 'home', - title: 'Home', - route: '/home', - content: 'The home page collects widgets from many plugins.', - }, - { - id: 'catalog', - title: 'The catalog', - route: '/catalog', - target: { selector: '[data-testid="user-picker-all"]' }, - placement: 'right', - content: - 'Filter the catalog by _kind_, _owner_ or _tags_. This dev app uses an in-memory catalog.', - }, - { - id: 'create', - title: 'Create', - route: '/create', - content: - 'Software templates live here. The example template comes from the mock catalog.', - }, - { - id: 'notifications', - title: 'Notifications', - route: '/notifications', - content: - 'Two of the mock notifications are unread. Mark them as read to see the counter change.', - }, - { - id: 'settings', - title: 'Settings', - route: '/settings', - content: - 'Theme, identity and feature flags. That is the end of this tour.', - }, - ], - }, - }), + ...devTours, ], }); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts new file mode 100644 index 00000000000..34ee05e2e5c --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on the first visit of the catalog. */ +export const catalogTour = GuidedTourBlueprint.make({ + name: 'catalog', + params: { + title: 'The software catalog', + description: 'Filters, the entity table and search on the catalog page.', + autoStart: { route: '/catalog' }, + order: 10, + steps: [ + { + id: 'kind', + title: 'Pick a kind', + route: '/catalog', + target: { selector: '[data-testid="select"]' }, + placement: 'right', + content: + 'The catalog holds more than components: switch the **kind** to see ' + + 'APIs, systems, users, groups or templates.', + }, + { + id: 'personal', + title: 'Yours, starred, or everything', + target: { selector: '[data-testid="user-picker-all"]' }, + placement: 'right', + content: + '_Owned_ shows what your groups own, _Starred_ your favourites and ' + + '_All_ the whole company.', + }, + { + id: 'tags', + title: 'More filters', + target: { selector: '[data-testid="tags-picker-expand"]' }, + placement: 'right', + content: + 'Narrow the list down by owner, lifecycle, tags or processing status.', + }, + { + id: 'table', + title: 'The entity table', + target: { selector: 'table' }, + placement: 'top', + content: + 'Each row is an entity. Click a name to open its page, or star it ' + + 'with the icon in front of the name.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts new file mode 100644 index 00000000000..c0bd37dd592 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts @@ -0,0 +1,53 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on login, shows markdown, a click-through step and a page change. */ +export const demoLoginTour = GuidedTourBlueprint.make({ + name: 'demo-login', + params: { + title: 'Welcome to the demo', + description: 'Starts on login and crosses pages.', + autoStart: 'login', + order: 1, + steps: [ + { + id: 'intro', + route: '/', + target: 'demo.intro', + content: + 'This is the **first** target. Markdown works here:\n\n' + + '- bullet lists\n- `inline code`\n- [links](/guided-tours)\n\n' + + '1. and numbered lists', + }, + { + id: 'link', + target: 'demo.link', + advanceOn: 'click', + content: 'Click this link to continue on the next page.', + }, + { + id: 'second', + target: 'second.text', + content: 'You made it across pages!', + }, + { + id: 'done', + content: 'Done. Replay it from [Guided tours](/guided-tours).', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts new file mode 100644 index 00000000000..0478be0cf29 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on the first visit of /second. */ +export const demoRouteTour = GuidedTourBlueprint.make({ + name: 'demo-route', + params: { + title: 'Second page tour', + autoStart: { route: '/second' }, + steps: [ + { + id: 'text', + route: '/second', + target: 'second.text', + placement: 'top', + content: 'Starts on first visit of `/second`.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts new file mode 100644 index 00000000000..547f8ef1ba0 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** A manual tour that only changes pages; started from the tours page. */ +export const exploreTour = GuidedTourBlueprint.make({ + name: 'explore', + params: { + title: 'Explore the portal', + description: + 'A manual tour across the home, catalog, create, notifications and settings pages.', + order: 3, + steps: [ + { + id: 'home', + title: 'Home', + route: '/home', + content: 'The home page collects widgets from many plugins.', + }, + { + id: 'catalog', + title: 'The catalog', + route: '/catalog', + target: { selector: '[data-testid="user-picker-all"]' }, + placement: 'right', + content: + 'Filter the catalog by _kind_, _owner_ or _tags_. This dev app uses an in-memory catalog.', + }, + { + id: 'create', + title: 'Create', + route: '/create', + content: + 'Software templates live here. The example template comes from the mock catalog.', + }, + { + id: 'notifications', + title: 'Notifications', + route: '/notifications', + content: + 'Two of the mock notifications are unread. Mark them as read to see the counter change.', + }, + { + id: 'settings', + title: 'Settings', + route: '/settings', + content: + 'Theme, identity and feature flags. That is the end of this tour.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts new file mode 100644 index 00000000000..dcd9ad8957b --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts @@ -0,0 +1,35 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { catalogTour } from './catalogTour'; +import { demoLoginTour } from './demoLoginTour'; +import { demoRouteTour } from './demoRouteTour'; +import { exploreTour } from './exploreTour'; +import { notificationsTour } from './notificationsTour'; +import { scaffolderTour } from './scaffolderTour'; +import { settingsTour } from './settingsTour'; +import { welcomeTour } from './welcomeTour'; + +/** All tours of the dev app. */ +export const devTours = [ + demoLoginTour, + welcomeTour, + exploreTour, + demoRouteTour, + catalogTour, + scaffolderTour, + notificationsTour, + settingsTour, +]; diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts new file mode 100644 index 00000000000..b61839a4c47 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on the first visit of the notifications page. */ +export const notificationsTour = GuidedTourBlueprint.make({ + name: 'notifications', + params: { + title: 'Your notifications', + description: 'Reading, filtering and clearing notifications.', + autoStart: { route: '/notifications' }, + order: 12, + steps: [ + { + id: 'list', + title: 'Unread first', + route: '/notifications', + target: { selector: 'table' }, + placement: 'top', + content: + 'New notifications land here. Click a title to open what it points ' + + 'to, or use the icons on the right to save or mark a single one as read.', + }, + { + id: 'view', + title: 'Read, saved, all', + target: { selector: '.bui-SelectTrigger' }, + placement: 'right', + content: + 'Switch the view between unread, read, saved and all notifications. ' + + 'The other filters limit by time, severity and topic.', + }, + { + id: 'mark-all', + title: 'Inbox zero', + target: { selector: 'button[aria-label="Mark all read"]' }, + placement: 'bottom', + onMissingTarget: 'center', + content: 'One click marks everything in the current view as read.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts new file mode 100644 index 00000000000..19640afdb18 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts @@ -0,0 +1,72 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on the first visit of /create and clicks through to a template. */ +export const scaffolderTour = GuidedTourBlueprint.make({ + name: 'scaffolder', + params: { + title: 'Create from a template', + description: 'Finding a template, starting it and following its tasks.', + autoStart: { route: '/create' }, + order: 11, + steps: [ + { + id: 'search', + title: 'Find a template', + route: '/create', + target: { selector: 'input[placeholder="Search"]' }, + placement: 'bottom', + content: + 'Search templates by name, or filter them by category and owner.', + }, + { + id: 'card', + title: 'A template', + target: { selector: '[data-testid="template-card-content"]' }, + placement: 'right', + content: + 'Each card is a template from the catalog with its type, tags and owner.', + }, + { + id: 'choose', + title: 'Start it', + target: { selector: '[data-testid="template-card-actions--create"]' }, + advanceOn: 'click', + content: 'Click **Choose** to open the template form.', + }, + { + id: 'form', + title: 'Fill in the form', + route: '/create/templates/default/example-nodejs-template', + target: { selector: 'form' }, + placement: 'top', + onMissingTarget: 'center', + content: + 'The form is generated from the template parameters. Running it ' + + 'needs a backend, which this dev app does not have.', + }, + { + id: 'tasks', + title: 'Follow your runs', + route: '/create/tasks', + content: + 'Every template run becomes a task with live logs. ' + + 'This list is empty in the dev app.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts new file mode 100644 index 00000000000..96f9b8f2c2e --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts @@ -0,0 +1,66 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** Starts on the first visit of the settings page. */ +export const settingsTour = GuidedTourBlueprint.make({ + name: 'settings', + params: { + title: 'Your settings', + description: 'Profile, theme and the sidebar.', + autoStart: { route: '/settings' }, + order: 13, + steps: [ + { + id: 'profile', + title: 'Who you are', + route: '/settings', + target: { selector: '[data-testid="user-settings-menu"]' }, + placement: 'left', + content: + 'Your profile comes from the identity you signed in with. The menu ' + + 'behind this button lets you sign out.', + }, + { + id: 'theme', + title: 'Light or dark', + target: { selector: 'button[value="dark"]' }, + placement: 'bottom', + content: + 'Pick a theme, or leave it on _Auto_ to follow your operating system.', + }, + { + id: 'sidebar', + title: 'Pin the sidebar', + target: { selector: 'input[name="pin"]' }, + placement: 'left', + onMissingTarget: 'center', + content: + 'Unpin the sidebar to collapse it and gain some room on small screens.', + }, + { + id: 'tabs', + title: 'More settings', + target: { selector: 'a[href="/settings/feature-flags"]' }, + placement: 'bottom', + onMissingTarget: 'center', + content: + 'Authentication providers and feature flags live in the other tabs. ' + + 'That is the end of this tour.', + }, + ], + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts new file mode 100644 index 00000000000..75900afb7bc --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; + +/** + * The welcome tour of `packages/app`, adapted to the dev app: the sidebar + * here is the default one without `data-guided-tour` ids, so the steps + * target the sidebar links by href. + */ +export const welcomeTour = GuidedTourBlueprint.make({ + name: 'welcome', + params: { + title: 'Welcome to Backstage', + description: + 'A quick walk through the catalog, templates and your settings.', + autoStart: 'login', + order: 2, + steps: [ + { + id: 'intro', + title: 'Welcome 👋', + content: + 'Backstage is your developer portal: **one place** for all your software, ' + + 'services and documentation. This short tour shows you around.', + }, + { + id: 'catalog-nav', + title: 'The software catalog', + route: '/catalog', + target: { selector: 'nav a[href="/catalog"]' }, + placement: 'right', + content: + 'Everything your organization owns is listed in the catalog: ' + + 'components, APIs, systems and the people behind them.', + }, + { + id: 'catalog-page', + title: 'Browse and filter', + route: '/catalog', + target: { selector: '[data-testid="user-picker-all"]' }, + placement: 'right', + onMissingTarget: 'center', + content: + 'Filter by _kind_, _type_, _owner_ or _tags_. Star the entities you ' + + 'care about to find them again quickly.', + }, + { + id: 'create-nav', + title: 'Create something new', + route: '/create', + target: { selector: 'nav a[href="/create"]' }, + placement: 'right', + content: + 'Software templates scaffold a new project in minutes, following ' + + "your organization's best practices.", + }, + { + id: 'settings-nav', + title: 'Your settings', + route: '/settings', + target: { selector: 'nav a[href="/settings"]' }, + placement: 'right', + content: + 'Switch themes, manage your identity and more. ' + + 'Replay any tour from [Guided tours](/guided-tours) at any time.', + }, + ], + }, +}); From 258100de07660190aa0896de9d9ff42d9562f0c5 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:37 +0200 Subject: [PATCH 13/28] Tune the dev app tours Remove the "Explore the portal" tour. The catalog tour spotlights the whole Personal/Company filter block and drops the "More filters" step. The scaffolder tour spotlights the complete template card. The settings tour highlights the display name and email, adds a "Logout" step on the menu button, highlights the whole theme button group and drops the "More settings" step. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/index.tsx | 2 +- .../guided-tour/dev/tours/catalogTour.ts | 11 +--- .../guided-tour/dev/tours/exploreTour.ts | 65 ------------------- .../plugins/guided-tour/dev/tours/index.ts | 2 - .../guided-tour/dev/tours/scaffolderTour.ts | 5 +- .../guided-tour/dev/tours/settingsTour.ts | 29 +++++---- 6 files changed, 22 insertions(+), 92 deletions(-) delete mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx index 61940bc210f..f9b3a5ff613 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -127,7 +127,7 @@ const homeModule = createFrontendModule({ ), diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts index 34ee05e2e5c..660133530a8 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts @@ -37,20 +37,13 @@ export const catalogTour = GuidedTourBlueprint.make({ { id: 'personal', title: 'Yours, starred, or everything', - target: { selector: '[data-testid="user-picker-all"]' }, + // the Personal + Company block of the user list picker + target: { selector: '[class*="CatalogReactUserListPicker-root"]' }, placement: 'right', content: '_Owned_ shows what your groups own, _Starred_ your favourites and ' + '_All_ the whole company.', }, - { - id: 'tags', - title: 'More filters', - target: { selector: '[data-testid="tags-picker-expand"]' }, - placement: 'right', - content: - 'Narrow the list down by owner, lifecycle, tags or processing status.', - }, { id: 'table', title: 'The entity table', diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts deleted file mode 100644 index 547f8ef1ba0..00000000000 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/exploreTour.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; - -/** A manual tour that only changes pages; started from the tours page. */ -export const exploreTour = GuidedTourBlueprint.make({ - name: 'explore', - params: { - title: 'Explore the portal', - description: - 'A manual tour across the home, catalog, create, notifications and settings pages.', - order: 3, - steps: [ - { - id: 'home', - title: 'Home', - route: '/home', - content: 'The home page collects widgets from many plugins.', - }, - { - id: 'catalog', - title: 'The catalog', - route: '/catalog', - target: { selector: '[data-testid="user-picker-all"]' }, - placement: 'right', - content: - 'Filter the catalog by _kind_, _owner_ or _tags_. This dev app uses an in-memory catalog.', - }, - { - id: 'create', - title: 'Create', - route: '/create', - content: - 'Software templates live here. The example template comes from the mock catalog.', - }, - { - id: 'notifications', - title: 'Notifications', - route: '/notifications', - content: - 'Two of the mock notifications are unread. Mark them as read to see the counter change.', - }, - { - id: 'settings', - title: 'Settings', - route: '/settings', - content: - 'Theme, identity and feature flags. That is the end of this tour.', - }, - ], - }, -}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts index dcd9ad8957b..f28075a2779 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts @@ -16,7 +16,6 @@ import { catalogTour } from './catalogTour'; import { demoLoginTour } from './demoLoginTour'; import { demoRouteTour } from './demoRouteTour'; -import { exploreTour } from './exploreTour'; import { notificationsTour } from './notificationsTour'; import { scaffolderTour } from './scaffolderTour'; import { settingsTour } from './settingsTour'; @@ -26,7 +25,6 @@ import { welcomeTour } from './welcomeTour'; export const devTours = [ demoLoginTour, welcomeTour, - exploreTour, demoRouteTour, catalogTour, scaffolderTour, diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts index 19640afdb18..cc6a01b55a7 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts @@ -36,7 +36,10 @@ export const scaffolderTour = GuidedTourBlueprint.make({ { id: 'card', title: 'A template', - target: { selector: '[data-testid="template-card-content"]' }, + // the whole card, not only its content + target: { + selector: '.MuiCard-root:has([data-testid="template-card-content"])', + }, placement: 'right', content: 'Each card is a template from the catalog with its type, tags and owner.', diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts index 96f9b8f2c2e..ddfad76aa80 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts @@ -28,16 +28,26 @@ export const settingsTour = GuidedTourBlueprint.make({ id: 'profile', title: 'Who you are', route: '/settings', + // the display name and email next to the avatar + target: { + selector: + '.MuiGrid-container:has([data-testid="user-settings-menu"]) .MuiGrid-grid-xs-true', + }, + placement: 'bottom', + content: + 'Your display name and email come from the identity you signed in with.', + }, + { + id: 'logout', + title: 'Logout', target: { selector: '[data-testid="user-settings-menu"]' }, placement: 'left', - content: - 'Your profile comes from the identity you signed in with. The menu ' + - 'behind this button lets you sign out.', + content: 'The menu behind this button lets you sign out.', }, { id: 'theme', title: 'Light or dark', - target: { selector: 'button[value="dark"]' }, + target: { selector: '.MuiToggleButtonGroup-root' }, placement: 'bottom', content: 'Pick a theme, or leave it on _Auto_ to follow your operating system.', @@ -49,16 +59,7 @@ export const settingsTour = GuidedTourBlueprint.make({ placement: 'left', onMissingTarget: 'center', content: - 'Unpin the sidebar to collapse it and gain some room on small screens.', - }, - { - id: 'tabs', - title: 'More settings', - target: { selector: 'a[href="/settings/feature-flags"]' }, - placement: 'bottom', - onMissingTarget: 'center', - content: - 'Authentication providers and feature flags live in the other tabs. ' + + 'Unpin the sidebar to collapse it and gain some room on small screens. ' + 'That is the end of this tour.', }, ], From 5470df00e888247bf557a96059a4f27ae4dcef15 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:44 +0200 Subject: [PATCH 14/28] Spotlight the Tasks tab in the scaffolder dev tour Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/tours/scaffolderTour.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts index cc6a01b55a7..5e1f93ec328 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts @@ -66,6 +66,8 @@ export const scaffolderTour = GuidedTourBlueprint.make({ id: 'tasks', title: 'Follow your runs', route: '/create/tasks', + target: { selector: '[role="tab"][href="/create/tasks"]' }, + placement: 'bottom', content: 'Every template run becomes a task with live logs. ' + 'This list is empty in the dev app.', From 05f975ef16efebae34c3593a1802df8c62942a0f Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:50 +0200 Subject: [PATCH 15/28] Remove the demo pages and demo tours from the dev app The "Welcome to the demo" and "Second page tour" tours and the demo and second pages are gone. The home page is now the landing page of the dev app, the welcome tour is the login tour, and the header action restarts it. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/app-config.yaml | 2 + .../plugins/guided-tour/dev/index.tsx | 69 +------------------ .../guided-tour/dev/tours/demoLoginTour.ts | 53 -------------- .../guided-tour/dev/tours/demoRouteTour.ts | 34 --------- .../plugins/guided-tour/dev/tours/index.ts | 4 -- .../guided-tour/dev/tours/welcomeTour.ts | 2 +- 6 files changed, 6 insertions(+), 158 deletions(-) delete mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts delete mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml b/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml index 478435cc5f2..f20a623a02d 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml +++ b/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml @@ -19,6 +19,8 @@ app: icon: docs - page:home: config: + # the home page is the landing page of the dev app + path: / defaultConfig: - component: GuidedTourWelcome column: 0 diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx index f9b3a5ff613..55d984ed483 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -16,7 +16,6 @@ import { createDevApp } from '@backstage/frontend-dev-utils'; import { createFrontendModule, - PageBlueprint, PluginHeaderActionBlueprint, } from '@backstage/frontend-plugin-api'; import catalogPlugin from '@backstage/plugin-catalog/alpha'; @@ -25,13 +24,10 @@ import { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha'; import notificationsPlugin from '@backstage/plugin-notifications/alpha'; import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; -import { Button, Container, Flex, Header, Text } from '@backstage/ui'; import { MarkdownText, RestartTourAction, - useGuidedTour, } from '@internal/backstage-plugin-guided-tour-react'; -import { Link } from 'react-router-dom'; import plugin from '../src'; import { catalogMockModule, @@ -40,73 +36,14 @@ import { } from './mockApis'; import { devTours } from './tours'; -const DemoPage = () => { - const replay = useGuidedTour('guided-tour/demo-login'); - return ( - <> -
    - - - - This paragraph is the first target. - - - Click me to continue the tour on the next page - - - - - - - ); -}; - -const SecondPage = () => ( - <> -
    - - - - You arrived on the second page. - - Back to the demo page - - - -); - const demoModule = createFrontendModule({ pluginId: 'guided-tour', extensions: [ - PageBlueprint.make({ - name: 'demo', - // no routeRef: route refs can only be declared by the plugin itself, so - // the demo pages get no sidebar entry and are linked from the pages - params: { path: '/', title: 'Demo', loader: async () => }, - }), - PageBlueprint.make({ - name: 'second', - params: { - path: '/second', - title: 'Second', - loader: async () => , - }, - }), - // the header action from the react library, shown on all guided-tour pages + // the header action from the react library, shown on the guided tours page PluginHeaderActionBlueprint.make({ - name: 'restart-demo-tour', + name: 'restart-welcome-tour', params: { - loader: async () => ( - - ), + loader: async () => , }, }), ...devTours, diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts deleted file mode 100644 index c0bd37dd592..00000000000 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoLoginTour.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; - -/** Starts on login, shows markdown, a click-through step and a page change. */ -export const demoLoginTour = GuidedTourBlueprint.make({ - name: 'demo-login', - params: { - title: 'Welcome to the demo', - description: 'Starts on login and crosses pages.', - autoStart: 'login', - order: 1, - steps: [ - { - id: 'intro', - route: '/', - target: 'demo.intro', - content: - 'This is the **first** target. Markdown works here:\n\n' + - '- bullet lists\n- `inline code`\n- [links](/guided-tours)\n\n' + - '1. and numbered lists', - }, - { - id: 'link', - target: 'demo.link', - advanceOn: 'click', - content: 'Click this link to continue on the next page.', - }, - { - id: 'second', - target: 'second.text', - content: 'You made it across pages!', - }, - { - id: 'done', - content: 'Done. Replay it from [Guided tours](/guided-tours).', - }, - ], - }, -}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts deleted file mode 100644 index 0478be0cf29..00000000000 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/demoRouteTour.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; - -/** Starts on the first visit of /second. */ -export const demoRouteTour = GuidedTourBlueprint.make({ - name: 'demo-route', - params: { - title: 'Second page tour', - autoStart: { route: '/second' }, - steps: [ - { - id: 'text', - route: '/second', - target: 'second.text', - placement: 'top', - content: 'Starts on first visit of `/second`.', - }, - ], - }, -}); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts index f28075a2779..d85273b727e 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts @@ -14,8 +14,6 @@ * limitations under the License. */ import { catalogTour } from './catalogTour'; -import { demoLoginTour } from './demoLoginTour'; -import { demoRouteTour } from './demoRouteTour'; import { notificationsTour } from './notificationsTour'; import { scaffolderTour } from './scaffolderTour'; import { settingsTour } from './settingsTour'; @@ -23,9 +21,7 @@ import { welcomeTour } from './welcomeTour'; /** All tours of the dev app. */ export const devTours = [ - demoLoginTour, welcomeTour, - demoRouteTour, catalogTour, scaffolderTour, notificationsTour, diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts index 75900afb7bc..32400d775bf 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts @@ -27,7 +27,7 @@ export const welcomeTour = GuidedTourBlueprint.make({ description: 'A quick walk through the catalog, templates and your settings.', autoStart: 'login', - order: 2, + order: 1, steps: [ { id: 'intro', From 7aa33c802a02969697abfc7a3a386c16dc8a391e Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:20:57 +0200 Subject: [PATCH 16/28] Rework the welcome tour and add a completeRoute to tours The welcome tour (app and dev app) gains steps for the Notifications and Guided tours sidebar items, drops "Browse and filter", and returns to / when Done is pressed. Tours can set `completeRoute`; the overlay navigates there when the last step is finished with Done or by clicking through. The progress store now ignores storage notifications for a key while its own writes are in flight, so a pending write cannot briefly undo a later one (seen as "Restart" flashing after "Reset all tours"). Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../changes/guided-tour-plugin/design.md | 1 + .../specs/guided-tour/spec.md | 5 + .../plugins/guided-tour-react/src/types.ts | 5 + .../guided-tour/dev/tours/welcomeTour.ts | 34 +++-- .../guided-tour/src/api/progressStore.test.ts | 117 ++++++++++++++++++ .../guided-tour/src/api/progressStore.ts | 16 ++- .../src/components/overlay/ActiveStep.tsx | 17 ++- 7 files changed, 178 insertions(+), 17 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md index 5d359a28752..7cbfa806095 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md @@ -107,6 +107,7 @@ export interface GuidedTour { description?: string; version?: number; // bump to show the tour again to users who completed/dismissed an older version order?: number; // ordering in the queue and on the page, default 100 + completeRoute?: string; // navigate here when the last step is finished autoStart?: GuidedTourAutoStart; steps: GuidedTourStep[]; } diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md index 177d9f2237d..b981c369b90 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md +++ b/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md @@ -143,6 +143,11 @@ A step MAY set `route` to navigate before being shown, and MAY set `advanceOn: ' - **WHEN** a step with `route: '/catalog'` becomes active while the user is on `/` - **THEN** the app navigates to `/catalog` and waits for the step target before showing the popover +#### Scenario: Finishing a tour with a completeRoute + +- **WHEN** a tour sets `completeRoute: '/'` and the user presses Done on its last step +- **THEN** the tour is saved as completed and the app navigates to `/` + #### Scenario: Click-through step keeps Next - **WHEN** a step has `advanceOn: 'click'` diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts index f10ad016713..ed43b071bfc 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts +++ b/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts @@ -92,6 +92,11 @@ export interface GuidedTour { /** Ordering in the onboarding queue and on the overview page. Default 100. */ order?: number; autoStart?: GuidedTourAutoStart; + /** + * App-relative path to navigate to when the tour is finished with Done + * (or by clicking through its last step), e.g. back to the start page. + */ + completeRoute?: string; steps: GuidedTourStep[]; } diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts index 32400d775bf..6f4958d3b90 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts @@ -28,6 +28,7 @@ export const welcomeTour = GuidedTourBlueprint.make({ 'A quick walk through the catalog, templates and your settings.', autoStart: 'login', order: 1, + completeRoute: '/', steps: [ { id: 'intro', @@ -46,17 +47,6 @@ export const welcomeTour = GuidedTourBlueprint.make({ 'Everything your organization owns is listed in the catalog: ' + 'components, APIs, systems and the people behind them.', }, - { - id: 'catalog-page', - title: 'Browse and filter', - route: '/catalog', - target: { selector: '[data-testid="user-picker-all"]' }, - placement: 'right', - onMissingTarget: 'center', - content: - 'Filter by _kind_, _type_, _owner_ or _tags_. Star the entities you ' + - 'care about to find them again quickly.', - }, { id: 'create-nav', title: 'Create something new', @@ -67,15 +57,33 @@ export const welcomeTour = GuidedTourBlueprint.make({ 'Software templates scaffold a new project in minutes, following ' + "your organization's best practices.", }, + { + id: 'notifications-nav', + title: 'Notifications', + route: '/notifications', + target: { selector: 'nav a[href="/notifications"]' }, + placement: 'right', + content: + 'Plugins and people reach you here: finished template runs, ' + + 'ownership changes, announcements.', + }, { id: 'settings-nav', title: 'Your settings', route: '/settings', target: { selector: 'nav a[href="/settings"]' }, placement: 'right', + content: 'Switch themes, manage your identity and more.', + }, + { + id: 'guided-tours-nav', + title: 'Guided tours', + route: '/guided-tours', + target: { selector: 'nav a[href="/guided-tours"]' }, + placement: 'right', content: - 'Switch themes, manage your identity and more. ' + - 'Replay any tour from [Guided tours](/guided-tours) at any time.', + 'Every tour, including this one, can be replayed from here at any ' + + 'time. Done takes you back to the start page.', }, ], }, diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts new file mode 100644 index 00000000000..565d9080bd4 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts @@ -0,0 +1,117 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + StorageApi, + StorageValueSnapshot, +} from '@backstage/frontend-plugin-api'; +import { JsonValue } from '@backstage/types'; +import { ProgressStore } from './progressStore'; + +/** + * A storage that, like the user-settings storage, notifies observers with the + * written value *before* the write promise resolves, and resolves on demand. + */ +function slowStorage() { + const values = new Map(); + const observers = new Map< + string, + Set<(s: StorageValueSnapshot) => void> + >(); + const resolvers: Array<() => void> = []; + const notify = (key: string) => { + const snapshot: StorageValueSnapshot = values.has(key) + ? { key, presence: 'present', value: values.get(key)! } + : { key, presence: 'absent' }; + observers.get(key)?.forEach(o => o(snapshot)); + }; + const api: StorageApi = { + forBucket: () => api, + snapshot: key => + values.has(key) + ? ({ key, presence: 'present', value: values.get(key) } as any) + : { key, presence: 'absent' }, + observe$: key => + ({ + subscribe: (observer: any) => { + const set = observers.get(key) ?? new Set(); + set.add(observer.next); + observers.set(key, set); + return { unsubscribe: () => set.delete(observer.next) }; + }, + } as any), + set: (key, value) => + new Promise(resolve => { + values.set(key, value); + notify(key); + resolvers.push(resolve); + }), + remove: key => + new Promise(resolve => { + values.delete(key); + notify(key); + resolvers.push(resolve); + }), + }; + return { api, flush: () => resolvers.splice(0).forEach(r => r()) }; +} + +const progress = (status: 'dismissed' | 'in-progress') => ({ + status, + stepIndex: 0, + version: 1, + updatedAt: 'now', +}); + +const tick = () => new Promise(resolve => setTimeout(resolve, 0)); + +describe('ProgressStore', () => { + it('keeps the optimistic state while its own writes are in flight', async () => { + const { api, flush } = slowStorage(); + const store = new ProgressStore({ storage: api, tourIds: ['a'] }); + + const dismissed = store.setProgress('a', progress('dismissed')); + const cleared = store.clearProgress('a'); + expect(store.getSnapshot().progress.a).toBeUndefined(); + + // let the queued set() run: it echoes "dismissed" before it resolves, + // which must not undo the clear queued right after it + await tick(); + expect(store.getSnapshot().progress.a).toBeUndefined(); + flush(); + await dismissed; + await tick(); + flush(); + await cleared; + expect(store.getSnapshot().progress.a).toBeUndefined(); + expect(api.snapshot('tour/a').presence).toBe('absent'); + }); + + it('applies storage changes once nothing is pending', async () => { + const { api, flush } = slowStorage(); + const store = new ProgressStore({ storage: api, tourIds: ['a'] }); + const write = store.setProgress('a', progress('in-progress')); + await tick(); + flush(); + await write; + // a change from elsewhere (another tab) is picked up + const external = api.set('tour/a', progress('dismissed') as any); + flush(); + await external; + expect(store.getSnapshot().progress.a).toMatchObject({ + status: 'dismissed', + }); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts index 2cbb750b700..1fd1fc13a7b 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts +++ b/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts @@ -39,6 +39,8 @@ export class ProgressStore { private readonly tourIds: string[]; private readonly listeners = new Set<() => void>(); private readonly pending = new Map>(); + /** Number of our own writes in flight per key. */ + private readonly inflight = new Map(); private readonly loaded = new Set(); private readonly subscriptions: Array<{ unsubscribe(): void }> = []; private snapshot: ProgressStoreSnapshot = { @@ -128,6 +130,12 @@ export class ProgressStore { if (s.presence === 'unknown') { return; } + // While our own writes are pending, the storage echoes older values + // (e.g. the "dismissed" written just before a reset). The optimistic + // local state is the truth until the queue has drained. + if ((this.inflight.get(key) ?? 0) > 0) { + return; + } apply(s); this.loaded.add(key); const ready = this.loaded.size >= this.tourIds.length + 1; @@ -143,8 +151,14 @@ export class ProgressStore { } private write(key: string, op: () => Promise): Promise { + this.inflight.set(key, (this.inflight.get(key) ?? 0) + 1); const previous = this.pending.get(key) ?? Promise.resolve(); - const next = previous.then(op, op).catch(() => undefined); + const next = previous + .then(op, op) + .catch(() => undefined) + .finally(() => { + this.inflight.set(key, (this.inflight.get(key) ?? 1) - 1); + }); this.pending.set(key, next); return next; } diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx index 4b8c2a7784d..86fab3f7054 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx @@ -70,14 +70,25 @@ export function ActiveStep(props: ActiveStepProps) { } }, [status, step.onMissingTarget, api]); + const isLast = stepIndex >= tour.steps.length - 1; + // Done (or a click through the last step) may send the user somewhere else + const advance = () => { + if (isLast && tour.completeRoute) { + navigate(tour.completeRoute); + } + api.next(); + }; + // click-to-advance: let the click reach the element, then move on useEffect(() => { if (!element || step.advanceOn !== 'click') return undefined; - const onClick = () => api.next(); + const onClick = () => advance(); element.addEventListener('click', onClick, { capture: true }); return () => element.removeEventListener('click', onClick, { capture: true }); - }, [element, step.advanceOn, api]); + // advance only changes with the step + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [element, step.advanceOn, api, tour.id, stepIndex]); // Escape closes the tour. The overlays' own open state is never used for // that: react-aria also reports "closed" when focus leaves a popover, which @@ -102,7 +113,7 @@ export function ActiveStep(props: ActiveStepProps) { stepIndex={stepIndex} stepCount={tour.steps.length} onPrevious={() => api.previous()} - onNext={() => api.next()} + onNext={advance} onDismiss={() => api.dismiss()} /> ); From 15a74db3c1b5596a1f2086b6e054d364a5fd80e2 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:31:09 +0200 Subject: [PATCH 17/28] Reorder and reword the welcome tour steps The "Guided tours" step now follows the intro, the notifications step is titled "Your notifications", and the settings step ends the tour with "Done takes you back to the start page." Applied to the app and the dev app; the e2e spec follows the new order. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tour/dev/tours/welcomeTour.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts index 6f4958d3b90..d88793fbbe6 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts +++ b/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts @@ -37,6 +37,15 @@ export const welcomeTour = GuidedTourBlueprint.make({ 'Backstage is your developer portal: **one place** for all your software, ' + 'services and documentation. This short tour shows you around.', }, + { + id: 'guided-tours-nav', + title: 'Guided tours', + route: '/guided-tours', + target: { selector: 'nav a[href="/guided-tours"]' }, + placement: 'right', + content: + 'Every tour, including this one, can be replayed from here at any time.', + }, { id: 'catalog-nav', title: 'The software catalog', @@ -59,7 +68,7 @@ export const welcomeTour = GuidedTourBlueprint.make({ }, { id: 'notifications-nav', - title: 'Notifications', + title: 'Your notifications', route: '/notifications', target: { selector: 'nav a[href="/notifications"]' }, placement: 'right', @@ -73,17 +82,9 @@ export const welcomeTour = GuidedTourBlueprint.make({ route: '/settings', target: { selector: 'nav a[href="/settings"]' }, placement: 'right', - content: 'Switch themes, manage your identity and more.', - }, - { - id: 'guided-tours-nav', - title: 'Guided tours', - route: '/guided-tours', - target: { selector: 'nav a[href="/guided-tours"]' }, - placement: 'right', content: - 'Every tour, including this one, can be replayed from here at any ' + - 'time. Done takes you back to the start page.', + 'Switch themes, manage your identity and more. ' + + 'Done takes you back to the start page.', }, ], }, From 1e132a503114f4fd5cf56960296bc8545aee0177 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:31:16 +0200 Subject: [PATCH 18/28] Align the remixicon dependency range with Backstage Use ">=4.6.0 <4.9.0" like @backstage/ui and the other Backstage packages, so the guided tour packages share their copy of @remixicon/react instead of pulling a second one. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tours/plugins/guided-tour-react/package.json | 2 +- workspaces/guided-tours/plugins/guided-tour/package.json | 2 +- workspaces/guided-tours/yarn.lock | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tour-react/package.json b/workspaces/guided-tours/plugins/guided-tour-react/package.json index 5e515bc6665..d3686af7c43 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/package.json +++ b/workspaces/guided-tours/plugins/guided-tour-react/package.json @@ -29,7 +29,7 @@ "@backstage/frontend-plugin-api": "^0.18.0", "@backstage/ui": "^0.17.1", "@braintree/sanitize-url": "^7.1.2", - "@remixicon/react": "^4.6.0", + "@remixicon/react": ">=4.6.0 <4.9.0", "marked": "^15.0.12" }, "peerDependencies": { diff --git a/workspaces/guided-tours/plugins/guided-tour/package.json b/workspaces/guided-tours/plugins/guided-tour/package.json index 3ff7cb0e5e7..9fe2a670de5 100644 --- a/workspaces/guided-tours/plugins/guided-tour/package.json +++ b/workspaces/guided-tours/plugins/guided-tour/package.json @@ -30,7 +30,7 @@ "@backstage/types": "^1.2.2", "@backstage/ui": "^0.17.1", "@internal/backstage-plugin-guided-tour-react": "workspace:^", - "@remixicon/react": "^4.6.0", + "@remixicon/react": ">=4.6.0 <4.9.0", "react-aria-components": "~1.17.0", "zod": "^4.0.0" }, diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 9474074d63c..c5b8c917c99 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -3202,7 +3202,7 @@ __metadata: "@backstage/frontend-test-utils": "npm:^0.6.3" "@backstage/ui": "npm:^0.17.1" "@braintree/sanitize-url": "npm:^7.1.2" - "@remixicon/react": "npm:^4.6.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" marked: "npm:^15.0.12" @@ -3236,7 +3236,7 @@ __metadata: "@backstage/types": "npm:^1.2.2" "@backstage/ui": "npm:^0.17.1" "@internal/backstage-plugin-guided-tour-react": "workspace:^" - "@remixicon/react": "npm:^4.6.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" "@testing-library/user-event": "npm:^14.0.0" From 3f398d4c05c2f4df734f6c2555e79b9a314c3902 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:31:20 +0200 Subject: [PATCH 19/28] Archive the guided-tour-plugin change Promote the change's spec to openspec/specs/guided-tour/spec.md and move the change folder to openspec/changes/archive/2026-10-23-guided-tour-plugin. Task 6.3 (dark theme and screen reader check) stays open and is marked as such. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../2026-10-23-guided-tour-plugin}/design.md | 0 .../proposal.md | 0 .../specs/guided-tour/spec.md | 0 .../2026-10-23-guided-tour-plugin}/tasks.md | 2 +- .../openspec/specs/guided-tour/spec.md | 166 ++++++++++++++++++ 5 files changed, 167 insertions(+), 1 deletion(-) rename workspaces/guided-tours/openspec/changes/{guided-tour-plugin => archive/2026-10-23-guided-tour-plugin}/design.md (100%) rename workspaces/guided-tours/openspec/changes/{guided-tour-plugin => archive/2026-10-23-guided-tour-plugin}/proposal.md (100%) rename workspaces/guided-tours/openspec/changes/{guided-tour-plugin => archive/2026-10-23-guided-tour-plugin}/specs/guided-tour/spec.md (100%) rename workspaces/guided-tours/openspec/changes/{guided-tour-plugin => archive/2026-10-23-guided-tour-plugin}/tasks.md (93%) create mode 100644 workspaces/guided-tours/openspec/specs/guided-tour/spec.md diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/design.md similarity index 100% rename from workspaces/guided-tours/openspec/changes/guided-tour-plugin/design.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/design.md diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/proposal.md similarity index 100% rename from workspaces/guided-tours/openspec/changes/guided-tour-plugin/proposal.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/proposal.md diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/specs/guided-tour/spec.md similarity index 100% rename from workspaces/guided-tours/openspec/changes/guided-tour-plugin/specs/guided-tour/spec.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/specs/guided-tour/spec.md diff --git a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md similarity index 93% rename from workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md index 5f787ede8f6..f2db6756cf1 100644 --- a/workspaces/guided-tours/openspec/changes/guided-tour-plugin/tasks.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md @@ -43,4 +43,4 @@ - [x] 6.1 `yarn tsc`, `yarn lint:all`, `yarn prettier:check`, `yarn test:all` green. - [x] 6.2 Playwright e2e: welcome tour across pages, reload resumes saved step, dismiss is remembered, Reset all replays. -- [ ] 6.3 Manual check in light and dark theme, keyboard-only navigation, screen reader announces step title. _Done so far: light theme via Playwright screenshots, Escape and button focus via e2e; dark theme and screen reader not yet checked._ +- [ ] 6.3 (left open at archive time) Manual check in light and dark theme, keyboard-only navigation, screen reader announces step title. _Done so far: light theme via Playwright screenshots, Escape and button focus via e2e; dark theme and screen reader not yet checked._ diff --git a/workspaces/guided-tours/openspec/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/specs/guided-tour/spec.md new file mode 100644 index 00000000000..530aefb340f --- /dev/null +++ b/workspaces/guided-tours/openspec/specs/guided-tour/spec.md @@ -0,0 +1,166 @@ +# guided-tour Specification + +## Purpose + +Guided tours for the Backstage new frontend system: plugins register tours +through an extension, steps spotlight elements and show markdown, progress +is saved per user, tours start on login or on the first visit of a route, +and a dedicated page lists and replays them. + +## Requirements + +### Requirement: Tours are registered through NFS extensions + +The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tour`, and `api:guided-tour` SHALL expose the collected tours as one list ordered by `order` then title. + +#### Scenario: Plugin ships a tour + +- **WHEN** a frontend plugin includes an extension made with `GuidedTourBlueprint` and the guided tour plugin is installed +- **THEN** the tour appears in `guidedTourApi.getTours()` with an id derived from the extension id (e.g. `example/intro`) + +#### Scenario: Guided tour plugin not installed + +- **WHEN** a plugin includes a `guided-tour` extension and the guided tour plugin is not part of the app +- **THEN** the app starts without error and the plugin behaves as if it shipped no tour + +#### Scenario: Tour disabled by config + +- **WHEN** `app.extensions` contains `guided-tour:example/intro: false` +- **THEN** the tour is absent from the list, the page, and auto-start + +### Requirement: Steps spotlight an element and show markdown content + +Each step SHALL highlight its target element with a dimmed mask and a cut-out and SHALL show title and content in a popover anchored to that element. Content SHALL support minimal markdown: paragraphs, bold, italic, inline code, links, bullet and numbered lists. HTML SHALL be rendered as text. + +#### Scenario: Step with target + +- **WHEN** a step with `target: 'catalog.create'` becomes active and an element with `data-guided-tour="catalog.create"` exists +- **THEN** the element is scrolled into view, the mask cuts it out, and the popover is positioned next to it with role `dialog` and the step title as accessible name + +#### Scenario: Step without target + +- **WHEN** a step has no `target` +- **THEN** the step is shown in a centered dialog without a cut-out + +#### Scenario: Target never appears + +- **WHEN** the target is not found within `targetTimeoutMs` +- **THEN** the step is shown centered when `onMissingTarget` is `center` (default), or skipped when it is `skip` + +### Requirement: Navigation buttons + +The popover SHALL show a Previous button (disabled on the first step), a Next button (labelled Done on the last step), a close control, and a `current / total` counter. Escape SHALL close the tour. + +#### Scenario: Next and Previous + +- **WHEN** the user presses Next on step 2 of 4 +- **THEN** step 3 is shown; pressing Previous returns to step 2 + +#### Scenario: Done + +- **WHEN** the user presses Done on the last step +- **THEN** the tour ends and its progress is saved as `completed` + +### Requirement: Progress is saved per user + +The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. + +#### Scenario: Next persists the step + +- **WHEN** the user presses Next and then reloads the page +- **THEN** the tour resumes at the saved step + +#### Scenario: Deep link while a tour is in progress + +- **WHEN** a tour is saved as `in-progress` at a step with `route: '/'` and the user opens `/guided-tours` directly +- **THEN** the user stays on `/guided-tours`, no tour starts, and the tour's row offers Continue + +#### Scenario: Dismiss is remembered + +- **WHEN** the user closes a tour +- **THEN** the tour is saved as `dismissed` and is not auto-started again for that tour version + +#### Scenario: Version bump re-shows + +- **WHEN** a tour's `version` is higher than the saved version +- **THEN** the saved progress is ignored and the tour counts as never seen + +### Requirement: Auto-start on login + +Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tour` config `autoStart` is `false`. + +#### Scenario: First login + +- **WHEN** a user with no saved tour progress and no `onboarded` flag signs in +- **THEN** all login tours without progress play one after another in `order`, and `onboarded` is written when the sequence finishes or is dismissed + +#### Scenario: New tour after onboarding + +- **WHEN** `onboarded` is set and a login tour without any progress entry exists (newly enabled plugin) +- **THEN** only that tour starts, on its own, not combined with previously seen tours + +#### Scenario: Global kill switch + +- **WHEN** `api:guided-tour` is configured with `autoStart: false` +- **THEN** no tour starts automatically; manual start and the page still work + +### Requirement: Auto-start on first visit of a route + +A tour with `autoStart: { route }` SHALL start the first time the location matches `route` for a user who has no progress entry for it, provided no other tour is running. + +#### Scenario: First navigation to a plugin + +- **WHEN** a user without progress for `example/intro` navigates to `/example` +- **THEN** `example/intro` starts + +#### Scenario: Already seen + +- **WHEN** the user has `completed` or `dismissed` progress for `example/intro` and navigates to `/example` +- **THEN** nothing starts + +### Requirement: Manual start from any plugin + +The `-react` library SHALL provide `useGuidedTour(id)` returning `{ available, start, progress }`; `start` SHALL be a no-op and `available` false when the guided tour plugin is not installed. + +#### Scenario: Replay button in a plugin + +- **WHEN** a plugin renders a button calling `useGuidedTour('example/intro').start({ force: true })` +- **THEN** the tour starts from step 1 regardless of saved progress + +### Requirement: Dedicated page lists all tours + +The system SHALL provide a page at `/guided-tours` (title "Guided tours") listing every registered tour with its status, a Start/Restart action per tour, and a Reset all action that clears all progress and the `onboarded` flag. + +#### Scenario: Restart a completed tour + +- **WHEN** the user presses Restart for a completed tour +- **THEN** the tour starts from step 1, navigating to the first step's `route` if set + +#### Scenario: Reset all + +- **WHEN** the user confirms Reset all +- **THEN** every tour shows status New and the next login replays the login sequence + +### Requirement: Cross-page steps + +A step MAY set `route` to navigate before being shown, and MAY set `advanceOn: 'click'` so that clicking the highlighted element advances the tour. + +#### Scenario: Route step + +- **WHEN** a step with `route: '/catalog'` becomes active while the user is on `/` +- **THEN** the app navigates to `/catalog` and waits for the step target before showing the popover + +#### Scenario: Finishing a tour with a completeRoute + +- **WHEN** a tour sets `completeRoute: '/'` and the user presses Done on its last step +- **THEN** the tour is saved as completed and the app navigates to `/` + +#### Scenario: Click-through step keeps Next + +- **WHEN** a step has `advanceOn: 'click'` +- **THEN** the popover shows the hint to click the element and still offers the Next button, which advances without the click + +#### Scenario: Click-through step + +- **WHEN** a step has `advanceOn: 'click'` and the user clicks the highlighted element +- **THEN** the click reaches the element, the tour advances, and if the click navigated, the next step waits for its target on the new page From 5cc816007ff0d040badd4c765959b4636fdd55a7 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:31:24 +0200 Subject: [PATCH 20/28] Move the restart-tour button to the pages that own a tour The dev app no longer shows the button on the guided tours page. Instead the catalog, create, notifications and settings plugin headers get a button that restarts their own tour (dev/headerActions.tsx). Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../plugins/guided-tour/dev/headerActions.tsx | 44 +++++++++++++++++++ .../plugins/guided-tour/dev/index.tsx | 25 +++-------- 2 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx new file mode 100644 index 00000000000..d2bcb92d5d0 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx @@ -0,0 +1,44 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createFrontendModule, + PluginHeaderActionBlueprint, +} from '@backstage/frontend-plugin-api'; +import { RestartTourAction } from '@internal/backstage-plugin-guided-tour-react'; + +/** + * Puts the "restart the guided tour" button of the react library into the + * plugin header of the pages that have a tour of their own. + */ +const restartTourModule = (pluginId: string, tourId: string) => + createFrontendModule({ + pluginId, + extensions: [ + PluginHeaderActionBlueprint.make({ + name: 'restart-guided-tour', + params: { + loader: async () => , + }, + }), + ], + }); + +export const headerActionModules = [ + restartTourModule('catalog', 'guided-tour/catalog'), + restartTourModule('scaffolder', 'guided-tour/scaffolder'), + restartTourModule('notifications', 'guided-tour/notifications'), + restartTourModule('user-settings', 'guided-tour/settings'), +]; diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx index 55d984ed483..32fd6d3fd01 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx @@ -14,40 +14,26 @@ * limitations under the License. */ import { createDevApp } from '@backstage/frontend-dev-utils'; -import { - createFrontendModule, - PluginHeaderActionBlueprint, -} from '@backstage/frontend-plugin-api'; +import { createFrontendModule } from '@backstage/frontend-plugin-api'; import catalogPlugin from '@backstage/plugin-catalog/alpha'; import homePlugin from '@backstage/plugin-home/alpha'; import { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha'; import notificationsPlugin from '@backstage/plugin-notifications/alpha'; import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; -import { - MarkdownText, - RestartTourAction, -} from '@internal/backstage-plugin-guided-tour-react'; +import { MarkdownText } from '@internal/backstage-plugin-guided-tour-react'; import plugin from '../src'; import { catalogMockModule, notificationsMockModule, scaffolderMockModule, } from './mockApis'; +import { headerActionModules } from './headerActions'; import { devTours } from './tours'; const demoModule = createFrontendModule({ pluginId: 'guided-tour', - extensions: [ - // the header action from the react library, shown on the guided tours page - PluginHeaderActionBlueprint.make({ - name: 'restart-welcome-tour', - params: { - loader: async () => , - }, - }), - ...devTours, - ], + extensions: [...devTours], }); const homeModule = createFrontendModule({ @@ -87,5 +73,8 @@ createDevApp({ notificationsPlugin, notificationsMockModule, userSettingsPlugin, + // "restart the guided tour" header buttons on catalog, create, + // notifications and settings + ...headerActionModules, ], }); From 07ed7f4a03715c77c7ca0ab0cadea2995281b495 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 00:58:29 +0200 Subject: [PATCH 21/28] Prepare the guided tours plugins for publishing Rename the packages to @backstage-community/plugin-guided-tours and @backstage-community/plugin-guided-tours-react, set their version to 0.0.0, license them under Apache-2.0 and drop the private flag. The plugin id becomes guided-tours, and the api ref, extension ids, translation ref, storage bucket and dev tour ids follow it. The plugin and openspec folders take the plural name too. Adds the workspace README and the initial changeset and rebuilds the lockfile. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../.changeset/guided-tours-initial.md | 6 + workspaces/guided-tours/README.md | 21 ++-- .../design.md | 24 ++-- .../proposal.md | 12 +- .../specs/guided-tours}/spec.md | 8 +- .../tasks.md | 22 ++-- .../{guided-tour => guided-tours}/spec.md | 8 +- .../plugins/guided-tour/README.md | 39 ------ .../.eslintrc.js | 0 .../README.md | 8 +- .../package.json | 24 +++- .../src/api.ts | 2 +- .../src/blueprint.test.ts | 0 .../src/blueprint.ts | 2 +- .../src/components/GuidedTourTarget.tsx | 0 .../src/components/MarkdownText.test.tsx | 0 .../src/components/MarkdownText.tsx | 0 .../src/components/RestartTourAction.tsx | 2 +- .../src/hooks/useGuidedTour.ts | 0 .../src/index.ts | 0 .../src/setupTests.ts | 0 .../src/types.ts | 0 .../.eslintrc.js | 0 .../plugins/guided-tours/README.md | 39 ++++++ .../dev/app-config.yaml | 0 .../dev/headerActions.tsx | 10 +- .../dev/index.tsx | 4 +- .../dev/mockApis.tsx | 0 .../dev/mockData.ts | 4 +- .../dev/tours/catalogTour.ts | 2 +- .../dev/tours/index.ts | 0 .../dev/tours/notificationsTour.ts | 2 +- .../dev/tours/scaffolderTour.ts | 2 +- .../dev/tours/settingsTour.ts | 2 +- .../dev/tours/welcomeTour.ts | 2 +- .../package.json | 26 +++- .../src/api/DefaultGuidedTourApi.test.ts | 2 +- .../src/api/DefaultGuidedTourApi.ts | 2 +- .../src/api/progressStore.test.ts | 0 .../src/api/progressStore.ts | 4 +- .../src/components/overlay/ActiveStep.tsx | 2 +- .../components/overlay/GuidedTourOverlay.tsx | 2 +- .../src/components/overlay/Spotlight.tsx | 0 .../src/components/overlay/StepCard.tsx | 2 +- .../src/components/overlay/isOnRoute.test.ts | 0 .../src/components/overlay/isOnRoute.ts | 0 .../overlay/useGuidedTourSnapshot.ts | 2 +- .../components/overlay/useTargetElement.ts | 0 .../src/components/page/GuidedToursPage.tsx | 6 +- .../src/extensions/api.ts | 4 +- .../src/extensions/overlay.tsx | 0 .../src/extensions/page.tsx | 0 .../src/index.ts | 0 .../src/plugin.test.ts | 2 +- .../src/plugin.ts | 8 +- .../src/routes.ts | 0 .../src/setupTests.ts | 0 .../src/translation.ts | 2 +- workspaces/guided-tours/yarn.lock | 114 +++++++++--------- 59 files changed, 228 insertions(+), 195 deletions(-) create mode 100644 workspaces/guided-tours/.changeset/guided-tours-initial.md rename workspaces/guided-tours/openspec/changes/archive/{2026-10-23-guided-tour-plugin => 2026-10-23-guided-tours-plugin}/design.md (96%) rename workspaces/guided-tours/openspec/changes/archive/{2026-10-23-guided-tour-plugin => 2026-10-23-guided-tours-plugin}/proposal.md (72%) rename workspaces/guided-tours/openspec/changes/archive/{2026-10-23-guided-tour-plugin/specs/guided-tour => 2026-10-23-guided-tours-plugin/specs/guided-tours}/spec.md (94%) rename workspaces/guided-tours/openspec/changes/archive/{2026-10-23-guided-tour-plugin => 2026-10-23-guided-tours-plugin}/tasks.md (69%) rename workspaces/guided-tours/openspec/specs/{guided-tour => guided-tours}/spec.md (94%) delete mode 100644 workspaces/guided-tours/plugins/guided-tour/README.md rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/.eslintrc.js (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/README.md (84%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/package.json (69%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/api.ts (99%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/blueprint.test.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/blueprint.ts (97%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/components/GuidedTourTarget.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/components/MarkdownText.test.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/components/MarkdownText.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/components/RestartTourAction.tsx (96%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/hooks/useGuidedTour.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/index.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/setupTests.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour-react => guided-tours-react}/src/types.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/.eslintrc.js (100%) create mode 100644 workspaces/guided-tours/plugins/guided-tours/README.md rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/app-config.yaml (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/headerActions.tsx (78%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/index.tsx (95%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/mockApis.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/mockData.ts (98%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/catalogTour.ts (95%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/index.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/notificationsTour.ts (95%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/scaffolderTour.ts (96%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/settingsTour.ts (96%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/dev/tours/welcomeTour.ts (97%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/package.json (76%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/api/DefaultGuidedTourApi.test.ts (98%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/api/DefaultGuidedTourApi.ts (99%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/api/progressStore.test.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/api/progressStore.ts (97%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/ActiveStep.tsx (98%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/GuidedTourOverlay.tsx (98%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/Spotlight.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/StepCard.tsx (98%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/isOnRoute.test.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/isOnRoute.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/useGuidedTourSnapshot.ts (94%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/overlay/useTargetElement.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/components/page/GuidedToursPage.tsx (97%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/extensions/api.ts (92%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/extensions/overlay.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/extensions/page.tsx (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/index.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/plugin.test.ts (95%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/plugin.ts (83%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/routes.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/setupTests.ts (100%) rename workspaces/guided-tours/plugins/{guided-tour => guided-tours}/src/translation.ts (98%) diff --git a/workspaces/guided-tours/.changeset/guided-tours-initial.md b/workspaces/guided-tours/.changeset/guided-tours-initial.md new file mode 100644 index 00000000000..f352ed6a2a0 --- /dev/null +++ b/workspaces/guided-tours/.changeset/guided-tours-initial.md @@ -0,0 +1,6 @@ +--- +'@backstage-community/plugin-guided-tours': minor +'@backstage-community/plugin-guided-tours-react': minor +--- + +Added the guided tours plugins for the new frontend system: spotlight steps on top of any page, per-user progress and automatic start on login or on the first visit of a route. See the [README](https://github.com/backstage/community-plugins/tree/main/workspaces/guided-tours/plugins/guided-tours#readme) for all the details. diff --git a/workspaces/guided-tours/README.md b/workspaces/guided-tours/README.md index 75d588b662c..021dececd3c 100644 --- a/workspaces/guided-tours/README.md +++ b/workspaces/guided-tours/README.md @@ -1,27 +1,26 @@ -# [Backstage](https://backstage.io) - -This is your newly scaffolded Backstage App, Good Luck! - -> [!IMPORTANT] > **TODO**: Consider updating your README text with relevant documentation for your plugin. See some suggested text below. - # guided-tours -This workspace contains plugins for \[brief description of purpose, e.g. exposing data from a service]. +This workspace contains the guided tours plugins for Backstage: spotlight +steps on top of any page, per-user progress and automatic start on login or +on the first visit of a route. They target the new frontend system. ## Plugins -- \[plugin-backend](./plugins/plugin-backend/README): Backend plugin that provides... +- [plugin-guided-tours](./plugins/guided-tours/README.md): the tour runner, + the overlay and the overview page at `/guided-tours`. +- [plugin-guided-tours-react](./plugins/guided-tours-react/README.md): the + blueprint, API ref and hooks that let any frontend plugin ship a tour. ## Getting Started -To start the app, run: +To start the dev app, run: ```sh yarn install -yarn start +yarn --cwd plugins/guided-tours start ``` -To generate knip reports for this app, run: +To generate knip reports for this workspace, run: ```sh yarn backstage-repo-tools knip-reports diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/design.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md similarity index 96% rename from workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/design.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md index 7cbfa806095..9933ac1c8a0 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md @@ -25,7 +25,7 @@ 1. Any NFS plugin can ship tours by adding one extension and depending only on the `-react` library. -2. One global, ordered tour list owned by `api:guided-tour`. +2. One global, ordered tour list owned by `api:guided-tours`. 3. Steps spotlight a DOM element and show markdown text in a popover with Previous / Next / Close. 4. Progress (current step, dismissed, completed) is saved per user. @@ -45,7 +45,7 @@ ## Package layout ``` -plugins/guided-tour-react/ @internal/backstage-plugin-guided-tour-react (web-library) +plugins/guided-tours-react/ @backstage-community/plugin-guided-tours-react (web-library) src/ api.ts guidedTourApiRef, GuidedTourApi, GuidedTourProgress, GuidedTourRunnerState types.ts GuidedTour, GuidedTourStep, GuidedTourAutoStart @@ -55,13 +55,13 @@ plugins/guided-tour-react/ @internal/backstage-plugin-guided-tour-reac components/MarkdownText.tsx (minimal markdown -> BUI elements) index.ts -plugins/guided-tour/ @internal/backstage-plugin-guided-tour (frontend-plugin, pluginId guided-tour) +plugins/guided-tours/ @backstage-community/plugin-guided-tours (frontend-plugin, pluginId guided-tour) src/ api/DefaultGuidedTourApi.ts registry + runner state machine + progress store api/progressStore.ts storageApi bucket helpers - extensions/api.ts ApiBlueprint.makeWithOverrides -> api:guided-tour (input: tours) - extensions/overlay.tsx AppRootElementBlueprint -> app-root-element:guided-tour/overlay - extensions/page.tsx PageBlueprint -> page:guided-tour (/guided-tours) + extensions/api.ts ApiBlueprint.makeWithOverrides -> api:guided-tours (input: tours) + extensions/overlay.tsx AppRootElementBlueprint -> app-root-element:guided-tours/overlay + extensions/page.tsx PageBlueprint -> page:guided-tours (/guided-tours) components/overlay/GuidedTourOverlay.tsx orchestration (identity gate, queue, route triggers) components/overlay/Spotlight.tsx fixed SVG mask with cut-out components/overlay/StepPopover.tsx BUI Popover + react-aria Dialog, buttons @@ -118,7 +118,7 @@ export const guidedTourDataRef = createExtensionDataRef().with({ export const GuidedTourBlueprint = createExtensionBlueprint({ kind: 'guided-tour', - attachTo: { id: 'api:guided-tour', input: 'tours' }, + attachTo: { id: 'api:guided-tours', input: 'tours' }, output: [guidedTourDataRef], dataRefs: { tour: guidedTourDataRef }, factory(params: Omit & { id?: string }, { node }) { @@ -162,7 +162,7 @@ export interface GuidedTourApi { markOnboarded(): Promise; } export const guidedTourApiRef = createApiRef({ - id: 'plugin.guided-tour.api', + id: 'plugin.guided-tours.api', }); /** Safe in any plugin: returns no-op handlers when the guided tour plugin is not installed. */ @@ -178,7 +178,7 @@ React consumers use `useSyncExternalStore` directly and tests need no observable helpers. Why the API and not the overlay owns the registry: tours must be queryable -by the page, by `useGuidedTour`, and by the overlay. `api:guided-tour` is +by the page, by `useGuidedTour`, and by the overlay. `api:guided-tours` is the single attachment point, created with `ApiBlueprint.makeWithOverrides({ inputs: { tours: createExtensionInput([guidedTourDataRef]) }, configSchema: { autoStart: z => z.boolean().default(true) }, factory })`. Extensions attached to an input of an extension that is not installed are @@ -225,7 +225,7 @@ seen". 1. Wait for `identityApi.getBackstageIdentity()` and the first snapshot of the bucket (so a signed-out app or a loading storage shows nothing). -2. Skip everything if `api:guided-tour` config `autoStart` is `false`. +2. Skip everything if `api:guided-tours` config `autoStart` is `false`. 3. `loginTours = tours.filter(autoStart === 'login')` sorted by `order`. 4. If `onboarded` is not set: queue **all** `loginTours` without progress and play them back to back; each still has its own title, counter and @@ -293,7 +293,7 @@ Status (New / In progress / Completed / Dismissed with BUI `Badge`), and actions Start / Restart. Header actions: "Reset all tours" (confirm with BUI `Dialog`, then `resetAllProgress()`), and a note explaining auto-start. Starting a tour from the page navigates to the first step's `route` if set. -Sidebar: `nav.take('page:guided-tour')` inside the Settings group. +Sidebar: `nav.take('page:guided-tours')` inside the Settings group. ## Configuration @@ -301,7 +301,7 @@ Sidebar: `nav.take('page:guided-tour')` inside the Settings group. app: extensions: - guided-tour:example/intro: false # disable one tour - - api:guided-tour: + - api:guided-tours: config: autoStart: false # never auto-start (e2e, kiosks) ``` diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/proposal.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md similarity index 72% rename from workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/proposal.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md index c265a287f55..e4a5ff138a8 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/proposal.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md @@ -25,18 +25,18 @@ This change adds a first-class, extension-driven guided tour system that: Two new workspace packages and one app-level module: -| Package | Role | Purpose | -| ---------------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `plugins/guided-tour-react` (`@internal/backstage-plugin-guided-tour-react`) | `web-library` | Public contract: `GuidedTourBlueprint`, `guidedTourApiRef`, types, `useGuidedTour()` hook, `data-guided-tour` target helper, markdown renderer. This is the only package other plugins depend on. | -| `plugins/guided-tour` (`@internal/backstage-plugin-guided-tour`) | `frontend-plugin`, `pluginId: guided-tour` | The engine: `api:guided-tour` (collects tours, persists progress via `storageApiRef`), `app-root-element:guided-tour/overlay` (spotlight + step popover + navigation), `page:guided-tour` at `/guided-tours` (replay/reset page). | -| `packages/app/src/modules/guided-tour` | app module | A "Welcome to Backstage" login tour spanning sidebar, catalog and settings. | +| Package | Role | Purpose | +| ------------------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `plugins/guided-tours-react` (`@backstage-community/plugin-guided-tours-react`) | `web-library` | Public contract: `GuidedTourBlueprint`, `guidedTourApiRef`, types, `useGuidedTour()` hook, `data-guided-tour` target helper, markdown renderer. This is the only package other plugins depend on. | +| `plugins/guided-tours` (`@backstage-community/plugin-guided-tours`) | `frontend-plugin`, `pluginId: guided-tour` | The engine: `api:guided-tours` (collects tours, persists progress via `storageApiRef`), `app-root-element:guided-tours/overlay` (spotlight + step popover + navigation), `page:guided-tours` at `/guided-tours` (replay/reset page). | +| `packages/app/src/modules/guided-tour` | app module | A "Welcome to Backstage" login tour spanning sidebar, catalog and settings. | Demonstration of the "plugin ships its own tour" story: - `plugins/example` gets a `guided-tour:example/intro` extension that auto-starts the first time a user navigates to `/example` and includes a "click the highlighted element" step. The example plugin only adds - `@internal/backstage-plugin-guided-tour-react` to its dependencies. + `@backstage-community/plugin-guided-tours-react` to its dependencies. Also touched: diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md similarity index 94% rename from workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/specs/guided-tour/spec.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md index b981c369b90..c9b15a14e67 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/specs/guided-tour/spec.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md @@ -4,7 +4,7 @@ ### Requirement: Tours are registered through NFS extensions -The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tour`, and `api:guided-tour` SHALL expose the collected tours as one list ordered by `order` then title. +The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tours`, and `api:guided-tours` SHALL expose the collected tours as one list ordered by `order` then title. #### Scenario: Plugin ships a tour @@ -56,7 +56,7 @@ The popover SHALL show a Previous button (disabled on the first step), a Next bu ### Requirement: Progress is saved per user -The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. +The system SHALL persist, through `storageApiRef` bucket `guided-tours`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. #### Scenario: Next persists the step @@ -80,7 +80,7 @@ The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each ### Requirement: Auto-start on login -Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tour` config `autoStart` is `false`. +Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tours` config `autoStart` is `false`. #### Scenario: First login @@ -94,7 +94,7 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident #### Scenario: Global kill switch -- **WHEN** `api:guided-tour` is configured with `autoStart: false` +- **WHEN** `api:guided-tours` is configured with `autoStart: false` - **THEN** no tour starts automatically; manual start and the page still work ### Requirement: Auto-start on first visit of a route diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/tasks.md similarity index 69% rename from workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md rename to workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/tasks.md index f2db6756cf1..97a32b86ceb 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tour-plugin/tasks.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/tasks.md @@ -1,21 +1,21 @@ # Tasks: Guided tour plugin -## 1. `plugins/guided-tour-react` (web library) +## 1. `plugins/guided-tours-react` (web library) -- [x] 1.1 Scaffold `@internal/backstage-plugin-guided-tour-react` with `backstage-cli new` (role `web-library`); deps: `@backstage/frontend-plugin-api`, `@backstage/ui`, `marked`, `@braintree/sanitize-url`; peer `react`, `react-router-dom`. +- [x] 1.1 Scaffold `@backstage-community/plugin-guided-tours-react` with `backstage-cli new` (role `web-library`); deps: `@backstage/frontend-plugin-api`, `@backstage/ui`, `marked`, `@braintree/sanitize-url`; peer `react`, `react-router-dom`. - [x] 1.2 Add `types.ts` (`GuidedTour`, `GuidedTourStep`, `GuidedTourAutoStart`) and `api.ts` (`GuidedTourApi`, `GuidedTourProgress`, `GuidedTourRunnerState`, `guidedTourApiRef`). -- [x] 1.3 Add `guidedTourDataRef` and `GuidedTourBlueprint` (kind `guided-tour`, attachTo `api:guided-tour` / `tours`, id derived from node id). +- [x] 1.3 Add `guidedTourDataRef` and `GuidedTourBlueprint` (kind `guided-tour`, attachTo `api:guided-tours` / `tours`, id derived from node id). - [x] 1.4 Add `useGuidedTour(id)` hook using `useApiHolder()` so it is a no-op without the plugin. - [x] 1.5 Add `MarkdownText` (marked `Lexer` → BUI `Text`/`Link`/lists/code, sanitized links) with tests. - [x] 1.6 Add `GuidedTourTarget` helper (`data-guided-tour` attribute) and `guidedTourTargetProps(id)`. - [x] 1.7 Export everything from `index.ts`, write `README.md` with the "ship a tour from your plugin" recipe, run `yarn tsc && yarn lint && yarn test` for the package. -## 2. `plugins/guided-tour` core +## 2. `plugins/guided-tours` core -- [x] 2.1 Scaffold `@internal/backstage-plugin-guided-tour` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. +- [x] 2.1 Scaffold `@backstage-community/plugin-guided-tours` (role `frontend-plugin`, pluginId `guided-tour`); deps: `-react` lib, `@backstage/frontend-plugin-api`, `@backstage/ui`, `react-aria-components`, `react-router-dom`. - [x] 2.2 Implement `progressStore.ts` over `storageApiRef.forBucket('guided-tour')` (per-tour keys, `onboarded`, serialized writes, `observe$`). - [x] 2.3 Implement `DefaultGuidedTourApi` (registry sorted by `order`, runner state machine, `getSnapshot`, `subscribe`, `resetProgress`, `resetAllProgress`), with table-driven unit tests using `MockStorageApi`. -- [x] 2.4 Add `api:guided-tour` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. +- [x] 2.4 Add `api:guided-tours` via `ApiBlueprint.makeWithOverrides` with `tours` input and `autoStart` config schema. - [x] 2.5 Add `translation.ts` with all user-facing strings. ## 3. Overlay (app root element) @@ -24,20 +24,20 @@ - [x] 3.2 `Spotlight` SVG mask with evenodd hole, pointer-events rules for `advanceOn: 'click'`. - [x] 3.3 `StepPopover` on BUI `Popover` + react-aria `Dialog` (title, `MarkdownText`, counter, Previous / Next / Done / close, Esc = dismiss, keyboard focus). Centered BUI `Dialog` variant for target-less steps. - [x] 3.4 `GuidedTourOverlay`: identity gate, storage-ready gate, login queue and `onboarded` logic, route-triggered tours, `step.route` navigation, click-to-advance wiring, no render when idle. -- [x] 3.5 Register `app-root-element:guided-tour/overlay` with `AppRootElementBlueprint`; render tests via `renderInTestApp`. +- [x] 3.5 Register `app-root-element:guided-tours/overlay` with `AppRootElementBlueprint`; render tests via `renderInTestApp`. ## 4. Guided tours page - [x] 4.1 `GuidedToursPage` (BUI `Table`/`Card`, status `Badge`, Start / Restart, Reset all with confirm `Dialog`). -- [x] 4.2 Register `page:guided-tour` (`/guided-tours`, title "Guided tours", icon) and `rootRouteRef`. -- [x] 4.3 Dev app under `plugins/guided-tour/dev` with two demo tours (one route-triggered, one with a click step). +- [x] 4.2 Register `page:guided-tours` (`/guided-tours`, title "Guided tours", icon) and `rootRouteRef`. +- [x] 4.3 Dev app under `plugins/guided-tours/dev` with two demo tours (one route-triggered, one with a click step). ## 5. App wiring and demo tours -- [x] 5.1 Add both packages to `packages/app/package.json`; add `nav.take('page:guided-tour')` to the Settings group in `Sidebar.tsx`; add `data-guided-tour` ids to sidebar items via `nav.withComponent`. +- [x] 5.1 Add both packages to `packages/app/package.json`; add `nav.take('page:guided-tours')` to the Settings group in `Sidebar.tsx`; add `data-guided-tour` ids to sidebar items via `nav.withComponent`. - [x] 5.2 Add `packages/app/src/modules/guided-tour` with the `app/welcome` login tour (sidebar → `/catalog` → create button → `/settings`) and register it in `App.tsx`. - [x] 5.3 Add `guided-tour:example/intro` to `plugins/example` (route `/example`, one `advanceOn: 'click'` step), depending only on the `-react` package; mark targets in `TodoPage`. -- [x] 5.4 Document `app.extensions` toggles and `autoStart: false` in `app-config.yaml` comments and `plugins/guided-tour/README.md`. +- [x] 5.4 Document `app.extensions` toggles and `autoStart: false` in `app-config.yaml` comments and `plugins/guided-tours/README.md`. ## 6. Verification diff --git a/workspaces/guided-tours/openspec/specs/guided-tour/spec.md b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md similarity index 94% rename from workspaces/guided-tours/openspec/specs/guided-tour/spec.md rename to workspaces/guided-tours/openspec/specs/guided-tours/spec.md index 530aefb340f..a60dcff54d7 100644 --- a/workspaces/guided-tours/openspec/specs/guided-tour/spec.md +++ b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md @@ -11,7 +11,7 @@ and a dedicated page lists and replays them. ### Requirement: Tours are registered through NFS extensions -The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tour`, and `api:guided-tour` SHALL expose the collected tours as one list ordered by `order` then title. +The system SHALL expose a `GuidedTourBlueprint` (kind `guided-tour`) that attaches to the `tours` input of `api:guided-tours`, and `api:guided-tours` SHALL expose the collected tours as one list ordered by `order` then title. #### Scenario: Plugin ships a tour @@ -63,7 +63,7 @@ The popover SHALL show a Previous button (disabled on the first step), a Next bu ### Requirement: Progress is saved per user -The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. +The system SHALL persist, through `storageApiRef` bucket `guided-tours`, for each tour: status (`in-progress`, `dismissed`, `completed`), current step index, tour version and timestamp. #### Scenario: Next persists the step @@ -87,7 +87,7 @@ The system SHALL persist, through `storageApiRef` bucket `guided-tour`, for each ### Requirement: Auto-start on login -Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tour` config `autoStart` is `false`. +Tours with `autoStart: 'login'` SHALL start automatically after the user's identity is resolved and storage is loaded, unless `api:guided-tours` config `autoStart` is `false`. #### Scenario: First login @@ -101,7 +101,7 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident #### Scenario: Global kill switch -- **WHEN** `api:guided-tour` is configured with `autoStart: false` +- **WHEN** `api:guided-tours` is configured with `autoStart: false` - **THEN** no tour starts automatically; manual start and the page still work ### Requirement: Auto-start on first visit of a route diff --git a/workspaces/guided-tours/plugins/guided-tour/README.md b/workspaces/guided-tours/plugins/guided-tour/README.md deleted file mode 100644 index 3ad485cdc48..00000000000 --- a/workspaces/guided-tours/plugins/guided-tour/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# @internal/backstage-plugin-guided-tour - -Guided tours for the Backstage new frontend system: spotlight steps with -markdown, per-user progress in user settings, auto-start on login or on the -first visit of a route, and an overview page at `/guided-tours`. - -Install the package in `packages/app` (it is discovered through -`app.packages: all`) and add the page to your sidebar: - -```tsx -{ - nav.take('page:guided-tour'); -} -``` - -Ship tours from any plugin with `@internal/backstage-plugin-guided-tour-react`, -see its README. - -## Configuration - -```yaml -app: - extensions: - - guided-tour:example/intro: false # disable a single tour - - api:guided-tour: - config: - autoStart: false # never start tours on their own -``` - -## Extensions - -| Extension | Purpose | -| -------------------------------------- | --------------------------------------------------- | -| `api:guided-tour` | Registry (`tours` input), runner and progress store | -| `app-root-element:guided-tour/overlay` | Spotlight and step card | -| `page:guided-tour` | Overview page at `/guided-tours` | - -Progress is stored in the `guided-tour` bucket of the `storageApi`, one key -per tour plus an `onboarded` flag. diff --git a/workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js b/workspaces/guided-tours/plugins/guided-tours-react/.eslintrc.js similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/.eslintrc.js rename to workspaces/guided-tours/plugins/guided-tours-react/.eslintrc.js diff --git a/workspaces/guided-tours/plugins/guided-tour-react/README.md b/workspaces/guided-tours/plugins/guided-tours-react/README.md similarity index 84% rename from workspaces/guided-tours/plugins/guided-tour-react/README.md rename to workspaces/guided-tours/plugins/guided-tours-react/README.md index 06e8a82c10b..3563181cc0b 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/README.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/README.md @@ -1,16 +1,16 @@ -# @internal/backstage-plugin-guided-tour-react +# @backstage-community/plugin-guided-tours-react Ship a guided tour from any Backstage frontend plugin (new frontend system). This package only holds the contract: the `GuidedTourBlueprint`, the `guidedTourApiRef`, the `useGuidedTour` hook and a tiny markdown renderer. -The engine lives in `@internal/backstage-plugin-guided-tour`; when that +The engine lives in `@backstage-community/plugin-guided-tours`; when that plugin is not installed, your tour extension stays unattached and nothing breaks. ## Ship a tour ```ts -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; export const introTour = GuidedTourBlueprint.make({ name: 'intro', @@ -52,7 +52,7 @@ PluginHeaderActionBlueprint.make({ name: 'restart-tour', params: { loader: () => - import('@internal/backstage-plugin-guided-tour-react').then(m => ( + import('@backstage-community/plugin-guided-tours-react').then(m => ( )), }, diff --git a/workspaces/guided-tours/plugins/guided-tour-react/package.json b/workspaces/guided-tours/plugins/guided-tours-react/package.json similarity index 69% rename from workspaces/guided-tours/plugins/guided-tour-react/package.json rename to workspaces/guided-tours/plugins/guided-tours-react/package.json index d3686af7c43..8184dfc4edf 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/package.json +++ b/workspaces/guided-tours/plugins/guided-tours-react/package.json @@ -1,8 +1,7 @@ { - "name": "@internal/backstage-plugin-guided-tour-react", - "version": "0.1.0", - "license": "UNLICENSED", - "private": true, + "name": "@backstage-community/plugin-guided-tours-react", + "version": "0.0.0", + "license": "Apache-2.0", "description": "Web library for shipping guided tours from any Backstage frontend plugin", "main": "src/index.ts", "types": "src/index.ts", @@ -11,9 +10,24 @@ "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/community-plugins", + "directory": "workspaces/guided-tours/plugins/guided-tours-react" + }, + "keywords": [ + "backstage", + "guided-tours", + "onboarding" + ], "backstage": { "role": "web-library", - "pluginId": "guided-tour" + "pluginId": "guided-tours", + "pluginPackages": [ + "@backstage-community/plugin-guided-tours", + "@backstage-community/plugin-guided-tours-react" + ] }, "sideEffects": false, "scripts": { diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts similarity index 99% rename from workspaces/guided-tours/plugins/guided-tour-react/src/api.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/api.ts index dddb298e004..2ac78bb93d7 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/api.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts @@ -116,5 +116,5 @@ export interface GuidedTourApi { * @public */ export const guidedTourApiRef = createApiRef({ - id: 'plugin.guided-tour.api', + id: 'plugin.guided-tours.api', }); diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.test.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.test.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.test.ts diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts similarity index 97% rename from workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts index dcab15e6ee1..cc06a315713 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/blueprint.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts @@ -49,7 +49,7 @@ export const guidedTourDataRef = createExtensionDataRef().with({ */ export const GuidedTourBlueprint = createExtensionBlueprint({ kind: 'guided-tour', - attachTo: { id: 'api:guided-tour', input: 'tours' }, + attachTo: { id: 'api:guided-tours', input: 'tours' }, output: [guidedTourDataRef], dataRefs: { tour: guidedTourDataRef }, factory(params: GuidedTourParams, { node }) { diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/components/GuidedTourTarget.tsx rename to workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.test.tsx rename to workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/components/MarkdownText.tsx rename to workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/RestartTourAction.tsx similarity index 96% rename from workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx rename to workspaces/guided-tours/plugins/guided-tours-react/src/components/RestartTourAction.tsx index bd08f77801f..7600117edf0 100644 --- a/workspaces/guided-tours/plugins/guided-tour-react/src/components/RestartTourAction.tsx +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/components/RestartTourAction.tsx @@ -44,7 +44,7 @@ export interface RestartTourActionProps { * name: 'restart-tour', * params: { * loader: () => - * import('@internal/backstage-plugin-guided-tour-react').then(m => ( + * import('@backstage-community/plugin-guided-tours-react').then(m => ( * * )), * }, diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/hooks/useGuidedTour.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.ts diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/index.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/index.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/index.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/index.ts diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/setupTests.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts diff --git a/workspaces/guided-tours/plugins/guided-tour-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour-react/src/types.ts rename to workspaces/guided-tours/plugins/guided-tours-react/src/types.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/.eslintrc.js b/workspaces/guided-tours/plugins/guided-tours/.eslintrc.js similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/.eslintrc.js rename to workspaces/guided-tours/plugins/guided-tours/.eslintrc.js diff --git a/workspaces/guided-tours/plugins/guided-tours/README.md b/workspaces/guided-tours/plugins/guided-tours/README.md new file mode 100644 index 00000000000..bdb8dbc7c37 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/README.md @@ -0,0 +1,39 @@ +# @backstage-community/plugin-guided-tours + +Guided tours for the Backstage new frontend system: spotlight steps with +markdown, per-user progress in user settings, auto-start on login or on the +first visit of a route, and an overview page at `/guided-tours`. + +Install the package in `packages/app` (it is discovered through +`app.packages: all`) and add the page to your sidebar: + +```tsx +{ + nav.take('page:guided-tours'); +} +``` + +Ship tours from any plugin with `@backstage-community/plugin-guided-tours-react`, +see its README. + +## Configuration + +```yaml +app: + extensions: + - guided-tour:example/intro: false # disable a single tour + - api:guided-tours: + config: + autoStart: false # never start tours on their own +``` + +## Extensions + +| Extension | Purpose | +| --------------------------------------- | --------------------------------------------------- | +| `api:guided-tours` | Registry (`tours` input), runner and progress store | +| `app-root-element:guided-tours/overlay` | Spotlight and step card | +| `page:guided-tours` | Overview page at `/guided-tours` | + +Progress is stored in the `guided-tours` bucket of the `storageApi`, one key +per tour plus an `onboarded` flag. diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml b/workspaces/guided-tours/plugins/guided-tours/dev/app-config.yaml similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/dev/app-config.yaml rename to workspaces/guided-tours/plugins/guided-tours/dev/app-config.yaml diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx b/workspaces/guided-tours/plugins/guided-tours/dev/headerActions.tsx similarity index 78% rename from workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx rename to workspaces/guided-tours/plugins/guided-tours/dev/headerActions.tsx index d2bcb92d5d0..8e1078a5559 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/headerActions.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/dev/headerActions.tsx @@ -17,7 +17,7 @@ import { createFrontendModule, PluginHeaderActionBlueprint, } from '@backstage/frontend-plugin-api'; -import { RestartTourAction } from '@internal/backstage-plugin-guided-tour-react'; +import { RestartTourAction } from '@backstage-community/plugin-guided-tours-react'; /** * Puts the "restart the guided tour" button of the react library into the @@ -37,8 +37,8 @@ const restartTourModule = (pluginId: string, tourId: string) => }); export const headerActionModules = [ - restartTourModule('catalog', 'guided-tour/catalog'), - restartTourModule('scaffolder', 'guided-tour/scaffolder'), - restartTourModule('notifications', 'guided-tour/notifications'), - restartTourModule('user-settings', 'guided-tour/settings'), + restartTourModule('catalog', 'guided-tours/catalog'), + restartTourModule('scaffolder', 'guided-tours/scaffolder'), + restartTourModule('notifications', 'guided-tours/notifications'), + restartTourModule('user-settings', 'guided-tours/settings'), ]; diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx b/workspaces/guided-tours/plugins/guided-tours/dev/index.tsx similarity index 95% rename from workspaces/guided-tours/plugins/guided-tour/dev/index.tsx rename to workspaces/guided-tours/plugins/guided-tours/dev/index.tsx index 32fd6d3fd01..0c9c0c43a2e 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/index.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/dev/index.tsx @@ -21,7 +21,7 @@ import { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha'; import notificationsPlugin from '@backstage/plugin-notifications/alpha'; import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; -import { MarkdownText } from '@internal/backstage-plugin-guided-tour-react'; +import { MarkdownText } from '@backstage-community/plugin-guided-tours-react'; import plugin from '../src'; import { catalogMockModule, @@ -32,7 +32,7 @@ import { headerActionModules } from './headerActions'; import { devTours } from './tours'; const demoModule = createFrontendModule({ - pluginId: 'guided-tour', + pluginId: 'guided-tours', extensions: [...devTours], }); diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx b/workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/dev/mockApis.tsx rename to workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts b/workspaces/guided-tours/plugins/guided-tours/dev/mockData.ts similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/mockData.ts index d90f0e3c892..5228dfe407a 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/mockData.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/mockData.ts @@ -143,13 +143,13 @@ export const mockNotifications: Notification[] = [ user: 'user:default/guest', created: minutesAgo(60 * 26), read: minutesAgo(60 * 20), - origin: 'plugin-guided-tour', + origin: 'plugin-guided-tours', payload: { title: 'Welcome to the guided tour demo', description: 'Replay any tour from the Guided tours page.', link: '/guided-tours', severity: 'normal', - topic: 'guided-tour', + topic: 'guided-tours', }, }, ]; diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts similarity index 95% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts index 660133530a8..1b8791b2295 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/catalogTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; /** Starts on the first visit of the catalog. */ export const catalogTour = GuidedTourBlueprint.make({ diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/index.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/index.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/index.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts similarity index 95% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts index b61839a4c47..f9b7f238ea5 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/notificationsTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; /** Starts on the first visit of the notifications page. */ export const notificationsTour = GuidedTourBlueprint.make({ diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts similarity index 96% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts index 5e1f93ec328..5da0b01393b 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/scaffolderTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; /** Starts on the first visit of /create and clicks through to a template. */ export const scaffolderTour = GuidedTourBlueprint.make({ diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts similarity index 96% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts index ddfad76aa80..cb4e0c9574a 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/settingsTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; /** Starts on the first visit of the settings page. */ export const settingsTour = GuidedTourBlueprint.make({ diff --git a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/welcomeTour.ts similarity index 97% rename from workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts rename to workspaces/guided-tours/plugins/guided-tours/dev/tours/welcomeTour.ts index d88793fbbe6..3f0068c31a4 100644 --- a/workspaces/guided-tours/plugins/guided-tour/dev/tours/welcomeTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/welcomeTour.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { GuidedTourBlueprint } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourBlueprint } from '@backstage-community/plugin-guided-tours-react'; /** * The welcome tour of `packages/app`, adapted to the dev app: the sidebar diff --git a/workspaces/guided-tours/plugins/guided-tour/package.json b/workspaces/guided-tours/plugins/guided-tours/package.json similarity index 76% rename from workspaces/guided-tours/plugins/guided-tour/package.json rename to workspaces/guided-tours/plugins/guided-tours/package.json index 9fe2a670de5..b2af049f026 100644 --- a/workspaces/guided-tours/plugins/guided-tour/package.json +++ b/workspaces/guided-tours/plugins/guided-tours/package.json @@ -1,8 +1,7 @@ { - "name": "@internal/backstage-plugin-guided-tour", - "version": "0.1.0", - "license": "UNLICENSED", - "private": true, + "name": "@backstage-community/plugin-guided-tours", + "version": "0.0.0", + "license": "Apache-2.0", "description": "Guided tours for Backstage: spotlight steps, per-user progress, auto-start on login or route", "main": "src/index.ts", "types": "src/index.ts", @@ -11,9 +10,24 @@ "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/community-plugins", + "directory": "workspaces/guided-tours/plugins/guided-tours" + }, + "keywords": [ + "backstage", + "guided-tours", + "onboarding" + ], "backstage": { "role": "frontend-plugin", - "pluginId": "guided-tour" + "pluginId": "guided-tours", + "pluginPackages": [ + "@backstage-community/plugin-guided-tours", + "@backstage-community/plugin-guided-tours-react" + ] }, "sideEffects": false, "scripts": { @@ -26,10 +40,10 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { + "@backstage-community/plugin-guided-tours-react": "workspace:^", "@backstage/frontend-plugin-api": "^0.18.0", "@backstage/types": "^1.2.2", "@backstage/ui": "^0.17.1", - "@internal/backstage-plugin-guided-tour-react": "workspace:^", "@remixicon/react": ">=4.6.0 <4.9.0", "react-aria-components": "~1.17.0", "zod": "^4.0.0" diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts rename to workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts index d3c334449eb..d34cff7da24 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.test.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { mockApis } from '@backstage/frontend-test-utils'; -import { GuidedTour } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTour } from '@backstage-community/plugin-guided-tours-react'; import { DefaultGuidedTourApi, selectLoginTours } from './DefaultGuidedTourApi'; const tour = (id: string, extra: Partial = {}): GuidedTour => ({ diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.ts similarity index 99% rename from workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts rename to workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.ts index a3f9145b60d..a39be80a446 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/DefaultGuidedTourApi.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.ts @@ -21,7 +21,7 @@ import { GuidedTourRunnerState, GuidedTourSnapshot, GuidedTourStartOptions, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { ProgressStore } from './progressStore'; const IDLE: GuidedTourRunnerState = { stepIndex: 0, queue: [] }; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.test.ts rename to workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.ts similarity index 97% rename from workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts rename to workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.ts index 1fd1fc13a7b..ad9e79c76a3 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/api/progressStore.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.ts @@ -18,9 +18,9 @@ import { StorageValueSnapshot, } from '@backstage/frontend-plugin-api'; import { JsonValue } from '@backstage/types'; -import { GuidedTourProgress } from '@internal/backstage-plugin-guided-tour-react'; +import { GuidedTourProgress } from '@backstage-community/plugin-guided-tours-react'; -export const PROGRESS_BUCKET = 'guided-tour'; +export const PROGRESS_BUCKET = 'guided-tours'; export const ONBOARDED_KEY = 'onboarded'; export const tourKey = (id: string) => `tour/${id}`; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/ActiveStep.tsx similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/ActiveStep.tsx index 86fab3f7054..4728e499b8b 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/ActiveStep.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/ActiveStep.tsx @@ -19,7 +19,7 @@ import { GuidedTour, guidedTourApiRef, guidedTourTargetSelector, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { useEffect, useMemo } from 'react'; import { Dialog as AriaDialog } from 'react-aria-components'; import { useLocation, useNavigate } from 'react-router-dom'; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx index 30d721f29d3..8c7ba2920a0 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/GuidedTourOverlay.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { identityApiRef, useApi } from '@backstage/frontend-plugin-api'; -import { guidedTourApiRef } from '@internal/backstage-plugin-guided-tour-react'; +import { guidedTourApiRef } from '@backstage-community/plugin-guided-tours-react'; import { useEffect, useRef, useState } from 'react'; import { matchPath, useLocation } from 'react-router-dom'; import { selectLoginTours } from '../../api/DefaultGuidedTourApi'; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/Spotlight.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.tsx similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.tsx index a8683e48014..c3d2fbe64a8 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/StepCard.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.tsx @@ -18,7 +18,7 @@ import { Button, ButtonIcon, Flex, Text } from '@backstage/ui'; import { GuidedTourStep, MarkdownText, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { RiCloseLine } from '@remixicon/react'; import { Heading } from 'react-aria-components'; import { guidedTourTranslationRef } from '../../translation'; diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.test.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.test.ts rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.test.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/isOnRoute.ts rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useGuidedTourSnapshot.ts similarity index 94% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useGuidedTourSnapshot.ts index 7b496f1cf55..7aef58f1eb6 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useGuidedTourSnapshot.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useGuidedTourSnapshot.ts @@ -17,7 +17,7 @@ import { useApi } from '@backstage/frontend-plugin-api'; import { GuidedTourSnapshot, guidedTourApiRef, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { useSyncExternalStore } from 'react'; export function useGuidedTourSnapshot(): GuidedTourSnapshot { diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/components/overlay/useTargetElement.ts rename to workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx similarity index 97% rename from workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx index ab8383ce9b4..af98de53ede 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/components/page/GuidedToursPage.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx @@ -32,7 +32,7 @@ import { GuidedTour, GuidedTourProgress, guidedTourApiRef, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { routeForStep } from '../overlay/isOnRoute'; @@ -79,7 +79,7 @@ function TourRow(props: { tour: GuidedTour; progress?: GuidedTourProgress }) { justify="between" align="center" gap="4" - data-guided-tour={`guided-tour.row.${tour.id}`} + data-guided-tour={`guided-tours.row.${tour.id}`} > @@ -140,7 +140,7 @@ export function GuidedToursPage() { } /> - + {tours.length === 0 && ( {t('page.empty')} )} diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts b/workspaces/guided-tours/plugins/guided-tours/src/extensions/api.ts similarity index 92% rename from workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts rename to workspaces/guided-tours/plugins/guided-tours/src/extensions/api.ts index f12e780062b..2d5d3c56b11 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/extensions/api.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/extensions/api.ts @@ -21,12 +21,12 @@ import { import { guidedTourApiRef, guidedTourDataRef, -} from '@internal/backstage-plugin-guided-tour-react'; +} from '@backstage-community/plugin-guided-tours-react'; import { z } from 'zod'; import { DefaultGuidedTourApi } from '../api/DefaultGuidedTourApi'; /** - * `api:guided-tour`: the registry every `guided-tour` extension attaches to. + * `api:guided-tours`: the registry every `guided-tour` extension attaches to. */ export const guidedTourApi = ApiBlueprint.makeWithOverrides({ inputs: { diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx b/workspaces/guided-tours/plugins/guided-tours/src/extensions/overlay.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/extensions/overlay.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/extensions/overlay.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx b/workspaces/guided-tours/plugins/guided-tours/src/extensions/page.tsx similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/extensions/page.tsx rename to workspaces/guided-tours/plugins/guided-tours/src/extensions/page.tsx diff --git a/workspaces/guided-tours/plugins/guided-tour/src/index.ts b/workspaces/guided-tours/plugins/guided-tours/src/index.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/index.ts rename to workspaces/guided-tours/plugins/guided-tours/src/index.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/plugin.test.ts similarity index 95% rename from workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts rename to workspaces/guided-tours/plugins/guided-tours/src/plugin.test.ts index df5069cf35e..fe7a57dcf78 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/plugin.test.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/plugin.test.ts @@ -15,7 +15,7 @@ */ import { guidedTourPlugin } from './plugin'; -describe('guided-tour', () => { +describe('guided-tours', () => { it('should export plugin', () => { expect(guidedTourPlugin).toBeDefined(); }); diff --git a/workspaces/guided-tours/plugins/guided-tour/src/plugin.ts b/workspaces/guided-tours/plugins/guided-tours/src/plugin.ts similarity index 83% rename from workspaces/guided-tours/plugins/guided-tour/src/plugin.ts rename to workspaces/guided-tours/plugins/guided-tours/src/plugin.ts index 93dce545435..fd58fb704b1 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/plugin.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/plugin.ts @@ -20,14 +20,14 @@ import { guidedToursPage } from './extensions/page'; import { rootRouteRef } from './routes'; /** - * The guided tour plugin: the tour registry (`api:guided-tour`), the overlay - * that plays tours (`app-root-element:guided-tour/overlay`) and the overview - * page (`page:guided-tour`). + * The guided tour plugin: the tour registry (`api:guided-tours`), the overlay + * that plays tours (`app-root-element:guided-tours/overlay`) and the overview + * page (`page:guided-tours`). * * @public */ export const guidedTourPlugin = createFrontendPlugin({ - pluginId: 'guided-tour', + pluginId: 'guided-tours', extensions: [guidedTourApi, guidedTourOverlay, guidedToursPage], routes: { root: rootRouteRef, diff --git a/workspaces/guided-tours/plugins/guided-tour/src/routes.ts b/workspaces/guided-tours/plugins/guided-tours/src/routes.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/routes.ts rename to workspaces/guided-tours/plugins/guided-tours/src/routes.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts similarity index 100% rename from workspaces/guided-tours/plugins/guided-tour/src/setupTests.ts rename to workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts diff --git a/workspaces/guided-tours/plugins/guided-tour/src/translation.ts b/workspaces/guided-tours/plugins/guided-tours/src/translation.ts similarity index 98% rename from workspaces/guided-tours/plugins/guided-tour/src/translation.ts rename to workspaces/guided-tours/plugins/guided-tours/src/translation.ts index e9a35eb099a..567be18717f 100644 --- a/workspaces/guided-tours/plugins/guided-tour/src/translation.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/translation.ts @@ -17,7 +17,7 @@ import { createTranslationRef } from '@backstage/frontend-plugin-api'; /** @alpha */ export const guidedTourTranslationRef = createTranslationRef({ - id: 'guided-tour', + id: 'guided-tours', messages: { overlay: { previous: 'Previous', diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index c5b8c917c99..5505018cdd2 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -443,6 +443,63 @@ __metadata: languageName: node linkType: hard +"@backstage-community/plugin-guided-tours-react@workspace:^, @backstage-community/plugin-guided-tours-react@workspace:plugins/guided-tours-react": + version: 0.0.0-use.local + resolution: "@backstage-community/plugin-guided-tours-react@workspace:plugins/guided-tours-react" + dependencies: + "@backstage/cli": "npm:^0.36.5" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/frontend-test-utils": "npm:^0.6.3" + "@backstage/ui": "npm:^0.17.1" + "@braintree/sanitize-url": "npm:^7.1.2" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + marked: "npm:^15.0.12" + react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-router-dom: "npm:^6.30.2" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + languageName: unknown + linkType: soft + +"@backstage-community/plugin-guided-tours@workspace:plugins/guided-tours": + version: 0.0.0-use.local + resolution: "@backstage-community/plugin-guided-tours@workspace:plugins/guided-tours" + dependencies: + "@backstage-community/plugin-guided-tours-react": "workspace:^" + "@backstage/catalog-model": "npm:^1.10.0" + "@backstage/cli": "npm:^0.36.5" + "@backstage/frontend-defaults": "npm:^0.5.5" + "@backstage/frontend-dev-utils": "npm:^0.1.5" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/frontend-test-utils": "npm:^0.6.3" + "@backstage/plugin-catalog": "npm:^2.0.8" + "@backstage/plugin-catalog-react": "npm:^3.2.2" + "@backstage/plugin-home": "npm:^0.9.9" + "@backstage/plugin-home-react": "npm:^0.1.41" + "@backstage/plugin-notifications": "npm:^0.5.20" + "@backstage/plugin-notifications-common": "npm:^0.2.3" + "@backstage/plugin-scaffolder": "npm:^1.38.2" + "@backstage/plugin-scaffolder-react": "npm:^2.0.3" + "@backstage/plugin-user-settings": "npm:^0.9.6" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.1" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" + react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-aria-components: "npm:~1.17.0" + react-router-dom: "npm:^6.30.2" + zod: "npm:^4.0.0" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + languageName: unknown + linkType: soft + "@backstage/backend-plugin-api@npm:^1.11.0": version: 1.11.0 resolution: "@backstage/backend-plugin-api@npm:1.11.0" @@ -3193,63 +3250,6 @@ __metadata: languageName: node linkType: hard -"@internal/backstage-plugin-guided-tour-react@workspace:^, @internal/backstage-plugin-guided-tour-react@workspace:plugins/guided-tour-react": - version: 0.0.0-use.local - resolution: "@internal/backstage-plugin-guided-tour-react@workspace:plugins/guided-tour-react" - dependencies: - "@backstage/cli": "npm:^0.36.5" - "@backstage/frontend-plugin-api": "npm:^0.18.0" - "@backstage/frontend-test-utils": "npm:^0.6.3" - "@backstage/ui": "npm:^0.17.1" - "@braintree/sanitize-url": "npm:^7.1.2" - "@remixicon/react": "npm:>=4.6.0 <4.9.0" - "@testing-library/jest-dom": "npm:^6.0.0" - "@testing-library/react": "npm:^14.0.0" - marked: "npm:^15.0.12" - react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" - react-router-dom: "npm:^6.30.2" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: ^6.30.2 - languageName: unknown - linkType: soft - -"@internal/backstage-plugin-guided-tour@workspace:plugins/guided-tour": - version: 0.0.0-use.local - resolution: "@internal/backstage-plugin-guided-tour@workspace:plugins/guided-tour" - dependencies: - "@backstage/catalog-model": "npm:^1.10.0" - "@backstage/cli": "npm:^0.36.5" - "@backstage/frontend-defaults": "npm:^0.5.5" - "@backstage/frontend-dev-utils": "npm:^0.1.5" - "@backstage/frontend-plugin-api": "npm:^0.18.0" - "@backstage/frontend-test-utils": "npm:^0.6.3" - "@backstage/plugin-catalog": "npm:^2.0.8" - "@backstage/plugin-catalog-react": "npm:^3.2.2" - "@backstage/plugin-home": "npm:^0.9.9" - "@backstage/plugin-home-react": "npm:^0.1.41" - "@backstage/plugin-notifications": "npm:^0.5.20" - "@backstage/plugin-notifications-common": "npm:^0.2.3" - "@backstage/plugin-scaffolder": "npm:^1.38.2" - "@backstage/plugin-scaffolder-react": "npm:^2.0.3" - "@backstage/plugin-user-settings": "npm:^0.9.6" - "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.17.1" - "@internal/backstage-plugin-guided-tour-react": "workspace:^" - "@remixicon/react": "npm:>=4.6.0 <4.9.0" - "@testing-library/jest-dom": "npm:^6.0.0" - "@testing-library/react": "npm:^14.0.0" - "@testing-library/user-event": "npm:^14.0.0" - react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" - react-aria-components: "npm:~1.17.0" - react-router-dom: "npm:^6.30.2" - zod: "npm:^4.0.0" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: ^6.30.2 - languageName: unknown - linkType: soft - "@internal/guided-tours@workspace:.": version: 0.0.0-use.local resolution: "@internal/guided-tours@workspace:." From a344bd38391a58b3481d07502655f30f1dad0fee Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 01:03:57 +0200 Subject: [PATCH 22/28] Add API and knip reports and make the tests run in the workspace Restore the leading doc comments that the license header rule replaced, so the placement type keeps its release tag and the react package its package documentation. Export the translation ref from an alpha entry point as other plugins do. Add react-dom as a dev dependency so jest can load react-router-dom, polyfill URL.canParse in the test setup for jsdom 20, and drop two unused dev dependencies that knip reported. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- workspaces/guided-tours/.prettierignore | 1 + workspaces/guided-tours/.yarnrc.yml | 2 +- .../plugins/guided-tours-react/knip-report.md | 2 + .../plugins/guided-tours-react/package.json | 16 +- .../plugins/guided-tours-react/report.api.md | 213 ++++++++++++++++++ .../plugins/guided-tours-react/src/index.ts | 6 + .../guided-tours-react/src/setupTests.ts | 12 + .../plugins/guided-tours-react/src/types.ts | 6 + .../plugins/guided-tours/knip-report.md | 2 + .../plugins/guided-tours/package.json | 22 +- .../plugins/guided-tours/report-alpha.api.md | 41 ++++ .../plugins/guided-tours/report.api.md | 148 ++++++++++++ .../plugins/guided-tours/src/alpha.ts | 17 ++ .../src/components/overlay/isOnRoute.ts | 5 + .../plugins/guided-tours/src/index.ts | 1 - .../plugins/guided-tours/src/setupTests.ts | 12 + workspaces/guided-tours/yarn.lock | 36 ++- 17 files changed, 520 insertions(+), 22 deletions(-) create mode 100644 workspaces/guided-tours/plugins/guided-tours-react/knip-report.md create mode 100644 workspaces/guided-tours/plugins/guided-tours-react/report.api.md create mode 100644 workspaces/guided-tours/plugins/guided-tours/knip-report.md create mode 100644 workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md create mode 100644 workspaces/guided-tours/plugins/guided-tours/report.api.md create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/alpha.ts diff --git a/workspaces/guided-tours/.prettierignore b/workspaces/guided-tours/.prettierignore index 1cfaa894795..faec22d97cb 100644 --- a/workspaces/guided-tours/.prettierignore +++ b/workspaces/guided-tours/.prettierignore @@ -3,3 +3,4 @@ dist-types coverage .vscode .eslintrc.js +knip-report.md diff --git a/workspaces/guided-tours/.yarnrc.yml b/workspaces/guided-tours/.yarnrc.yml index e652f1bdf83..201b1dd092f 100644 --- a/workspaces/guided-tours/.yarnrc.yml +++ b/workspaces/guided-tours/.yarnrc.yml @@ -1,4 +1,4 @@ approvedGitRepositories: - - "**" + - '**' enableScripts: true diff --git a/workspaces/guided-tours/plugins/guided-tours-react/knip-report.md b/workspaces/guided-tours/plugins/guided-tours-react/knip-report.md new file mode 100644 index 00000000000..2661c353270 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours-react/knip-report.md @@ -0,0 +1,2 @@ +# Knip report + diff --git a/workspaces/guided-tours/plugins/guided-tours-react/package.json b/workspaces/guided-tours/plugins/guided-tours-react/package.json index 8184dfc4edf..dd9db93eb6e 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/package.json +++ b/workspaces/guided-tours/plugins/guided-tours-react/package.json @@ -6,9 +6,18 @@ "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { - "access": "public", - "main": "dist/index.esm.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ] + } }, "homepage": "https://backstage.io", "repository": { @@ -56,6 +65,7 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "^6.30.2" }, "files": [ diff --git a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md new file mode 100644 index 00000000000..1db750e2936 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md @@ -0,0 +1,213 @@ +## API Report File for "@backstage-community/plugin-guided-tours-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ApiRef } from '@backstage/frontend-plugin-api'; +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; +import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { JSX as JSX_2 } from 'react'; +import { ReactElement } from 'react'; +import { ReactNode } from 'react'; + +// @public +export interface GuidedTour { + // (undocumented) + autoStart?: GuidedTourAutoStart; + completeRoute?: string; + // (undocumented) + description?: string; + id: string; + order?: number; + // (undocumented) + steps: GuidedTourStep[]; + // (undocumented) + title: string; + version?: number; +} + +// @public +export interface GuidedTourApi { + // (undocumented) + complete(): void; + // (undocumented) + dismiss(): void; + getProgress(id: string): GuidedTourProgress | undefined; + // (undocumented) + getSnapshot(): GuidedTourSnapshot; + // (undocumented) + getTour(id: string): GuidedTour | undefined; + getTours(): GuidedTour[]; + isAutoStartEnabled(): boolean; + markOnboarded(): Promise; + // (undocumented) + next(): void; + // (undocumented) + previous(): void; + resetAllProgress(): Promise; + resetProgress(id: string): Promise; + start(id: string, options?: GuidedTourStartOptions): void; + startQueue( + ids: string[], + options?: { + onboarding?: boolean; + }, + ): void; + // (undocumented) + subscribe(listener: () => void): () => void; +} + +// @public +export const guidedTourApiRef: ApiRef & { + readonly $$type: '@backstage/ApiRef'; +}; + +// @public +export type GuidedTourAutoStart = + | false + | 'login' + | { + route: string; + }; + +// @public +export const GuidedTourBlueprint: ExtensionBlueprint<{ + kind: 'guided-tour'; + params: GuidedTourParams; + output: ExtensionDataRef; + inputs: {}; + config: {}; + configInput: {}; + dataRefs: { + tour: ConfigurableExtensionDataRef; + }; +}>; + +// @public +export const guidedTourDataRef: ConfigurableExtensionDataRef< + GuidedTour, + 'guided-tour.tour', + {} +>; + +// @public +export type GuidedTourParams = Omit & { + id?: string; +}; + +// @public +export type GuidedTourPlacement = + | 'top' + | 'bottom' + | 'left' + | 'right' + | 'start' + | 'end'; + +// @public +export interface GuidedTourProgress { + // (undocumented) + status: 'in-progress' | 'completed' | 'dismissed'; + // (undocumented) + stepIndex: number; + // (undocumented) + updatedAt: string; + // (undocumented) + version: number; +} + +// @public +export interface GuidedTourRunnerState { + // (undocumented) + activeTourId?: string; + // (undocumented) + queue: string[]; + // (undocumented) + stepIndex: number; +} + +// @public +export interface GuidedTourSnapshot { + onboarded: boolean; + // (undocumented) + progress: Record; + ready: boolean; + // (undocumented) + state: GuidedTourRunnerState; +} + +// @public +export interface GuidedTourStartOptions { + force?: boolean; + stepId?: string; +} + +// @public +export interface GuidedTourStep { + advanceOn?: 'next' | 'click'; + content: string; + id: string; + onMissingTarget?: 'center' | 'skip'; + placement?: GuidedTourPlacement; + route?: string; + target?: + | string + | { + selector: string; + }; + targetTimeoutMs?: number; + title?: string; +} + +// @public +export function GuidedTourTarget(props: { + id: string; + children: ReactNode; + as?: 'span' | 'div'; +}): JSX_2.Element; + +// @public +export function guidedTourTargetProps(id: string): { + 'data-guided-tour': string; +}; + +// @public +export function guidedTourTargetSelector( + target: NonNullable, +): string; + +// @public +export function MarkdownText(props: MarkdownTextProps): JSX_2.Element; + +// @public +export interface MarkdownTextProps { + // (undocumented) + className?: string; + // (undocumented) + content: string; +} + +// @public +export function RestartTourAction( + props: RestartTourActionProps, +): JSX_2.Element | null; + +// @public +export interface RestartTourActionProps { + icon?: ReactElement; + label?: string; + tourId: string; +} + +// @public +export function useGuidedTour(id: string): UseGuidedTourResult; + +// @public +export interface UseGuidedTourResult { + active: boolean; + available: boolean; + progress?: GuidedTourProgress; + start(options?: GuidedTourStartOptions): void; +} +``` diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/index.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/index.ts index d718384d09b..7013cfa60c8 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/index.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/index.ts @@ -14,6 +14,12 @@ * limitations under the License. */ +/** + * Web library for the guided tour plugin. Depend on this package to ship a + * guided tour from any Backstage frontend plugin. + * + * @packageDocumentation + */ export * from './types'; export * from './api'; export * from './blueprint'; diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts index 5f11bab1c2c..f5e63378294 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/setupTests.ts @@ -14,3 +14,15 @@ * limitations under the License. */ import '@testing-library/jest-dom'; + +// jsdom 20 (jest-environment-jsdom) ships a URL without canParse, which +// @braintree/sanitize-url relies on. +if (typeof URL.canParse !== 'function') { + URL.canParse = (url: string | URL, base?: string | URL): boolean => { + try { + return Boolean(new URL(url, base)); + } catch { + return false; + } + }; +} diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts index ed43b071bfc..4eec9b674ae 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts @@ -14,6 +14,12 @@ * limitations under the License. */ +/** + * Placement of the step card relative to the highlighted element. + * A subset of react-aria placements. + * + * @public + */ export type GuidedTourPlacement = | 'top' | 'bottom' diff --git a/workspaces/guided-tours/plugins/guided-tours/knip-report.md b/workspaces/guided-tours/plugins/guided-tours/knip-report.md new file mode 100644 index 00000000000..2661c353270 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/knip-report.md @@ -0,0 +1,2 @@ +# Knip report + diff --git a/workspaces/guided-tours/plugins/guided-tours/package.json b/workspaces/guided-tours/plugins/guided-tours/package.json index b2af049f026..4d7426b5e61 100644 --- a/workspaces/guided-tours/plugins/guided-tours/package.json +++ b/workspaces/guided-tours/plugins/guided-tours/package.json @@ -6,9 +6,22 @@ "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { - "access": "public", - "main": "dist/index.esm.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "homepage": "https://backstage.io", "repository": { @@ -55,7 +68,6 @@ "devDependencies": { "@backstage/catalog-model": "^1.10.0", "@backstage/cli": "^0.36.5", - "@backstage/frontend-defaults": "^0.5.5", "@backstage/frontend-dev-utils": "^0.1.5", "@backstage/frontend-test-utils": "^0.6.3", "@backstage/plugin-catalog": "^2.0.8", @@ -69,8 +81,8 @@ "@backstage/plugin-user-settings": "^0.9.6", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "^6.30.2" }, "files": [ diff --git a/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md b/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md new file mode 100644 index 00000000000..b3c46cc2712 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md @@ -0,0 +1,41 @@ +## API Report File for "@backstage-community/plugin-guided-tours" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { TranslationRef } from '@backstage/frontend-plugin-api'; + +// @alpha (undocumented) +export const guidedTourTranslationRef: TranslationRef< + 'guided-tours', + { + readonly 'page.start': 'Start'; + readonly 'page.cancel': 'Cancel'; + readonly 'page.title': 'Guided tours'; + readonly 'page.description': 'Replay any tour at any time. Tours marked for login start on their own the first time you sign in.'; + readonly 'page.empty': 'No guided tours are installed.'; + readonly 'page.status.new': 'New'; + readonly 'page.status.completed': 'Completed'; + readonly 'page.status.inProgress': 'In progress'; + readonly 'page.status.dismissed': 'Dismissed'; + readonly 'page.confirm': 'Reset'; + readonly 'page.continue': 'Continue'; + readonly 'page.restart': 'Restart'; + readonly 'page.steps': '{{n}} steps'; + readonly 'page.resetAll': 'Reset all tours'; + readonly 'page.resetAllTitle': 'Reset all tours?'; + readonly 'page.resetAllBody': 'Progress of every tour is cleared and the welcome tours play again on your next visit.'; + readonly 'page.autoStartLogin': 'Starts on login'; + readonly 'page.autoStartRoute': 'Starts on first visit of {{route}}'; + readonly 'overlay.loading': 'Looking for the next step…'; + readonly 'overlay.close': 'Close tour'; + readonly 'overlay.next': 'Next'; + readonly 'overlay.done': 'Done'; + readonly 'overlay.previous': 'Previous'; + readonly 'overlay.counter': 'Step {{current}} of {{total}}'; + readonly 'overlay.clickToContinue': 'Click the highlighted element to continue.'; + } +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/workspaces/guided-tours/plugins/guided-tours/report.api.md b/workspaces/guided-tours/plugins/guided-tours/report.api.md new file mode 100644 index 00000000000..1a8929f68ed --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/report.api.md @@ -0,0 +1,148 @@ +## API Report File for "@backstage-community/plugin-guided-tours" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; +import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; +import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionInput } from '@backstage/frontend-plugin-api'; +import { GuidedTour } from '@backstage-community/plugin-guided-tours-react'; +import { IconElement } from '@backstage/frontend-plugin-api'; +import { JSX as JSX_2 } from 'react'; +import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; +import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; +import { RouteRef } from '@backstage/frontend-plugin-api'; + +// @public +const guidedTourPlugin: OverridableFrontendPlugin< + { + root: RouteRef; + }, + {}, + { + 'api:guided-tours': OverridableExtensionDefinition<{ + config: { + autoStart: boolean; + }; + configInput: { + autoStart?: boolean | undefined; + }; + output: ExtensionDataRef; + inputs: { + tours: ExtensionInput< + ConfigurableExtensionDataRef, + { + singleton: false; + optional: false; + internal: false; + } + >; + }; + kind: 'api'; + name: undefined; + params: < + TApi, + TImpl extends TApi, + TDeps extends { [name in string]: unknown }, + >( + params: ApiFactory, + ) => ExtensionBlueprintParams; + }>; + 'app-root-element:guided-tours/overlay': OverridableExtensionDefinition<{ + kind: 'app-root-element'; + name: 'overlay'; + config: {}; + configInput: {}; + output: ExtensionDataRef; + inputs: {}; + params: { + element: JSX.Element; + }; + }>; + 'page:guided-tours': OverridableExtensionDefinition<{ + kind: 'page'; + name: undefined; + config: { + path: string | undefined; + title: string | undefined; + }; + configInput: { + path?: string | undefined; + title?: string | undefined; + }; + output: + | ExtensionDataRef + | ExtensionDataRef + | ExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + > + | ExtensionDataRef< + string, + 'core.title', + { + optional: true; + } + > + | ExtensionDataRef< + IconElement, + 'core.icon', + { + optional: true; + } + >; + inputs: { + pages: ExtensionInput< + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'core.title', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + IconElement, + 'core.icon', + { + optional: true; + } + >, + { + singleton: false; + optional: false; + internal: false; + } + >; + }; + params: { + path: string; + title?: string; + icon?: IconElement; + loader?: () => Promise; + routeRef?: RouteRef; + noHeader?: boolean; + }; + }>; + } +>; +export default guidedTourPlugin; +export { guidedTourPlugin }; + +// (No @packageDocumentation comment for this package) +``` diff --git a/workspaces/guided-tours/plugins/guided-tours/src/alpha.ts b/workspaces/guided-tours/plugins/guided-tours/src/alpha.ts new file mode 100644 index 00000000000..197684069cc --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/alpha.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { guidedTourTranslationRef } from './translation'; diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts index dcbb6ef4c77..5cf0e83f338 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/isOnRoute.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +/** + * Whether the current pathname is "on" a step route. A route matches + * itself and any sub path (pages often redirect to a sub path, e.g. + * `/create` to `/create/templates`); the root route only matches exactly. + */ export function isOnRoute(route: string, pathname: string): boolean { const base = route.replace(/\/+$/, '') || '/'; if (base === '/') { diff --git a/workspaces/guided-tours/plugins/guided-tours/src/index.ts b/workspaces/guided-tours/plugins/guided-tours/src/index.ts index 62a1462f69e..8e2d035f3c3 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/index.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/index.ts @@ -14,4 +14,3 @@ * limitations under the License. */ export { guidedTourPlugin as default, guidedTourPlugin } from './plugin'; -export { guidedTourTranslationRef } from './translation'; diff --git a/workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts b/workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts index 5f11bab1c2c..f5e63378294 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/setupTests.ts @@ -14,3 +14,15 @@ * limitations under the License. */ import '@testing-library/jest-dom'; + +// jsdom 20 (jest-environment-jsdom) ships a URL without canParse, which +// @braintree/sanitize-url relies on. +if (typeof URL.canParse !== 'function') { + URL.canParse = (url: string | URL, base?: string | URL): boolean => { + try { + return Boolean(new URL(url, base)); + } catch { + return false; + } + }; +} diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 5505018cdd2..10db4fb4f28 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -457,6 +457,7 @@ __metadata: "@testing-library/react": "npm:^14.0.0" marked: "npm:^15.0.12" react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-dom: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" react-router-dom: "npm:^6.30.2" peerDependencies: react: ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -471,7 +472,6 @@ __metadata: "@backstage-community/plugin-guided-tours-react": "workspace:^" "@backstage/catalog-model": "npm:^1.10.0" "@backstage/cli": "npm:^0.36.5" - "@backstage/frontend-defaults": "npm:^0.5.5" "@backstage/frontend-dev-utils": "npm:^0.1.5" "@backstage/frontend-plugin-api": "npm:^0.18.0" "@backstage/frontend-test-utils": "npm:^0.6.3" @@ -489,9 +489,9 @@ __metadata: "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" - "@testing-library/user-event": "npm:^14.0.0" react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" react-aria-components: "npm:~1.17.0" + react-dom: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" react-router-dom: "npm:^6.30.2" zod: "npm:^4.0.0" peerDependencies: @@ -1306,7 +1306,7 @@ __metadata: languageName: node linkType: hard -"@backstage/frontend-defaults@npm:^0.5.5, @backstage/frontend-defaults@npm:^0.5.7": +"@backstage/frontend-defaults@npm:^0.5.7": version: 0.5.7 resolution: "@backstage/frontend-defaults@npm:0.5.7" dependencies: @@ -6518,15 +6518,6 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^14.0.0": - version: 14.6.8 - resolution: "@testing-library/user-event@npm:14.6.8" - peerDependencies: - "@testing-library/dom": ">=7.21.4" - checksum: 10/674190e5d592d5f1478af26c08c13ee197dbbc03885da3b99312c9cd810e4dc9c0ffbd4df91c51f39d467c1866a0c28f451df56d3fd535a5260d7660c24d9f42 - languageName: node - linkType: hard - "@tokenizer/inflate@npm:^0.4.1": version: 0.4.1 resolution: "@tokenizer/inflate@npm:0.4.1" @@ -17889,6 +17880,18 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^16.13.1 || ^17.0.0 || ^18.0.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10/3f4b73a3aa083091173b29812b10394dd06f4ac06aff410b74702cfb3aa29d7b0ced208aab92d5272919b612e5cda21aeb1d54191848cf6e46e9e354f3541f81 + languageName: node + linkType: hard + "react-double-scrollbar@npm:0.0.15": version: 0.0.15 resolution: "react-double-scrollbar@npm:0.0.15" @@ -19016,6 +19019,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/e8d68b89d18d5b028223edf090092846868a765a591944760942b77ea1f69b17235f7e956696efbb62c8130ab90af7e0949bfb8eba7896335507317236966bc9 + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" From d8c3a91641bef09a1fa0dd68949383ed3d103001 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 01:10:27 +0200 Subject: [PATCH 23/28] Fix the deprecations reported by CI Create the guided tour API ref with the `createApiRef().with()` form and import the `ScaffolderApi` type of the dev app mocks from `@backstage/plugin-scaffolder-common`. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tours/plugins/guided-tours-react/report.api.md | 5 ++++- .../guided-tours/plugins/guided-tours-react/src/api.ts | 2 +- .../guided-tours/plugins/guided-tours/dev/mockApis.tsx | 6 ++---- workspaces/guided-tours/plugins/guided-tours/package.json | 1 + workspaces/guided-tours/yarn.lock | 1 + 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md index 1db750e2936..df15aa9d6d0 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md @@ -59,7 +59,10 @@ export interface GuidedTourApi { } // @public -export const guidedTourApiRef: ApiRef & { +export const guidedTourApiRef: ApiRef< + GuidedTourApi, + 'plugin.guided-tours.api' +> & { readonly $$type: '@backstage/ApiRef'; }; diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts index 2ac78bb93d7..ba767bdc256 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts @@ -115,6 +115,6 @@ export interface GuidedTourApi { * * @public */ -export const guidedTourApiRef = createApiRef({ +export const guidedTourApiRef = createApiRef().with({ id: 'plugin.guided-tours.api', }); diff --git a/workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx b/workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx index 712e4bf3c5a..f491a56149e 100644 --- a/workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/dev/mockApis.tsx @@ -29,10 +29,8 @@ import { NotificationSettings, NotificationStatus, } from '@backstage/plugin-notifications-common'; -import { - ScaffolderApi, - scaffolderApiRef, -} from '@backstage/plugin-scaffolder-react'; +import { ScaffolderApi } from '@backstage/plugin-scaffolder-common'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { mockEntities, mockNotifications } from './mockData'; /** Replaces `api:catalog` with an in-memory catalog. */ diff --git a/workspaces/guided-tours/plugins/guided-tours/package.json b/workspaces/guided-tours/plugins/guided-tours/package.json index 4d7426b5e61..fb98f7cd26d 100644 --- a/workspaces/guided-tours/plugins/guided-tours/package.json +++ b/workspaces/guided-tours/plugins/guided-tours/package.json @@ -77,6 +77,7 @@ "@backstage/plugin-notifications": "^0.5.20", "@backstage/plugin-notifications-common": "^0.2.3", "@backstage/plugin-scaffolder": "^1.38.2", + "@backstage/plugin-scaffolder-common": "^2.3.1", "@backstage/plugin-scaffolder-react": "^2.0.3", "@backstage/plugin-user-settings": "^0.9.6", "@testing-library/jest-dom": "^6.0.0", diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 10db4fb4f28..4678c0c45fa 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -482,6 +482,7 @@ __metadata: "@backstage/plugin-notifications": "npm:^0.5.20" "@backstage/plugin-notifications-common": "npm:^0.2.3" "@backstage/plugin-scaffolder": "npm:^1.38.2" + "@backstage/plugin-scaffolder-common": "npm:^2.3.1" "@backstage/plugin-scaffolder-react": "npm:^2.0.3" "@backstage/plugin-user-settings": "npm:^0.9.6" "@backstage/types": "npm:^1.2.2" From 15850b7e4ad96a1871f8fbf54379431ffbaead16 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 01:56:02 +0200 Subject: [PATCH 24/28] Address review feedback Document every public type and API member, rename the tour data ref to `guided-tours.tour` and explain why the extension kind stays singular. Retitle the workspace README and start the dev app from the workspace root. Drop the yarnrc the workspace does not need and tidy the gitignore. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- workspaces/guided-tours/.gitignore | 2 +- workspaces/guided-tours/.yarnrc.yml | 4 --- workspaces/guided-tours/README.md | 19 ++++++++++--- .../plugins/guided-tours-react/report.api.md | 28 ++----------------- .../plugins/guided-tours-react/src/api.ts | 16 +++++++++++ .../guided-tours-react/src/blueprint.ts | 4 ++- .../src/components/MarkdownText.tsx | 2 ++ .../plugins/guided-tours-react/src/types.ts | 4 +++ .../plugins/guided-tours/report.api.md | 2 +- 9 files changed, 45 insertions(+), 36 deletions(-) delete mode 100644 workspaces/guided-tours/.yarnrc.yml diff --git a/workspaces/guided-tours/.gitignore b/workspaces/guided-tours/.gitignore index fbf813909c9..77ad56d1284 100644 --- a/workspaces/guided-tours/.gitignore +++ b/workspaces/guided-tours/.gitignore @@ -15,7 +15,7 @@ coverage # Dependencies node_modules/ -# Yarn 3 files +# Yarn files .pnp.* .yarn/* !.yarn/patches diff --git a/workspaces/guided-tours/.yarnrc.yml b/workspaces/guided-tours/.yarnrc.yml deleted file mode 100644 index 201b1dd092f..00000000000 --- a/workspaces/guided-tours/.yarnrc.yml +++ /dev/null @@ -1,4 +0,0 @@ -approvedGitRepositories: - - '**' - -enableScripts: true diff --git a/workspaces/guided-tours/README.md b/workspaces/guided-tours/README.md index 021dececd3c..4de5fa888c7 100644 --- a/workspaces/guided-tours/README.md +++ b/workspaces/guided-tours/README.md @@ -1,4 +1,4 @@ -# guided-tours +# Guided Tours plugin for Backstage This workspace contains the guided tours plugins for Backstage: spotlight steps on top of any page, per-user progress and automatic start on login or @@ -17,11 +17,22 @@ To start the dev app, run: ```sh yarn install -yarn --cwd plugins/guided-tours start +yarn start ``` -To generate knip reports for this workspace, run: +It opens a portal-like demo at http://localhost:3000 with a welcome tour and +page tours for the catalog, templates, notifications and settings. + +## Tests + +```sh +yarn test # unit tests +yarn test:e2e # Playwright tests against the dev app +``` + +To generate the API and knip reports for this workspace, run: ```sh -yarn backstage-repo-tools knip-reports +yarn build:api-reports +yarn build:knip-reports ``` diff --git a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md index df15aa9d6d0..81e658e23b2 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md @@ -13,37 +13,27 @@ import { ReactNode } from 'react'; // @public export interface GuidedTour { - // (undocumented) autoStart?: GuidedTourAutoStart; completeRoute?: string; - // (undocumented) description?: string; id: string; order?: number; - // (undocumented) steps: GuidedTourStep[]; - // (undocumented) title: string; version?: number; } // @public export interface GuidedTourApi { - // (undocumented) complete(): void; - // (undocumented) dismiss(): void; getProgress(id: string): GuidedTourProgress | undefined; - // (undocumented) getSnapshot(): GuidedTourSnapshot; - // (undocumented) getTour(id: string): GuidedTour | undefined; getTours(): GuidedTour[]; isAutoStartEnabled(): boolean; markOnboarded(): Promise; - // (undocumented) next(): void; - // (undocumented) previous(): void; resetAllProgress(): Promise; resetProgress(id: string): Promise; @@ -54,7 +44,6 @@ export interface GuidedTourApi { onboarding?: boolean; }, ): void; - // (undocumented) subscribe(listener: () => void): () => void; } @@ -78,19 +67,19 @@ export type GuidedTourAutoStart = export const GuidedTourBlueprint: ExtensionBlueprint<{ kind: 'guided-tour'; params: GuidedTourParams; - output: ExtensionDataRef; + output: ExtensionDataRef; inputs: {}; config: {}; configInput: {}; dataRefs: { - tour: ConfigurableExtensionDataRef; + tour: ConfigurableExtensionDataRef; }; }>; // @public export const guidedTourDataRef: ConfigurableExtensionDataRef< GuidedTour, - 'guided-tour.tour', + 'guided-tours.tour', {} >; @@ -110,33 +99,24 @@ export type GuidedTourPlacement = // @public export interface GuidedTourProgress { - // (undocumented) status: 'in-progress' | 'completed' | 'dismissed'; - // (undocumented) stepIndex: number; - // (undocumented) updatedAt: string; - // (undocumented) version: number; } // @public export interface GuidedTourRunnerState { - // (undocumented) activeTourId?: string; - // (undocumented) queue: string[]; - // (undocumented) stepIndex: number; } // @public export interface GuidedTourSnapshot { onboarded: boolean; - // (undocumented) progress: Record; ready: boolean; - // (undocumented) state: GuidedTourRunnerState; } @@ -185,9 +165,7 @@ export function MarkdownText(props: MarkdownTextProps): JSX_2.Element; // @public export interface MarkdownTextProps { - // (undocumented) className?: string; - // (undocumented) content: string; } diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts index ba767bdc256..d7a5cafde90 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/api.ts @@ -22,9 +22,13 @@ import { GuidedTour } from './types'; * @public */ export interface GuidedTourProgress { + /** Where the user left the tour. */ status: 'in-progress' | 'completed' | 'dismissed'; + /** Index of the step that was shown last. */ stepIndex: number; + /** Version of the tour the progress was written for. */ version: number; + /** ISO timestamp of the last change. */ updatedAt: string; } @@ -34,8 +38,11 @@ export interface GuidedTourProgress { * @public */ export interface GuidedTourRunnerState { + /** Id of the running tour; undefined while no tour runs. */ activeTourId?: string; + /** Index of the step currently shown. */ stepIndex: number; + /** Ids of the tours that play after the running one. */ queue: string[]; } @@ -51,7 +58,9 @@ export interface GuidedTourSnapshot { ready: boolean; /** True once the user has gone through (or dismissed) the login sequence. */ onboarded: boolean; + /** The running tour and its queue. */ state: GuidedTourRunnerState; + /** Saved progress by tour id, including entries of older tour versions. */ progress: Record; } @@ -76,6 +85,7 @@ export interface GuidedTourStartOptions { export interface GuidedTourApi { /** All registered tours, ordered by `order` then title. */ getTours(): GuidedTour[]; + /** A registered tour by id. */ getTour(id: string): GuidedTour | undefined; /** @@ -86,14 +96,20 @@ export interface GuidedTourApi { start(id: string, options?: GuidedTourStartOptions): void; /** Starts the first tour of the list and queues the rest. */ startQueue(ids: string[], options?: { onboarding?: boolean }): void; + /** Shows the next step; completes the tour on its last step. */ next(): void; + /** Shows the previous step; a no-op on the first step. */ previous(): void; + /** Closes the running tour and remembers it as dismissed. */ dismiss(): void; + /** Finishes the running tour and starts the next one in the queue. */ complete(): void; /** Whether tours may start on their own (login and route triggers). */ isAutoStartEnabled(): boolean; + /** The current state; a new object on every change. */ getSnapshot(): GuidedTourSnapshot; + /** Calls the listener on every change; returns the unsubscribe function. */ subscribe(listener: () => void): () => void; /** diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts index cc06a315713..ba20dc39900 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts @@ -25,7 +25,7 @@ import { GuidedTour, GuidedTourParams } from './types'; * @public */ export const guidedTourDataRef = createExtensionDataRef().with({ - id: 'guided-tour.tour', + id: 'guided-tours.tour', }); /** @@ -48,6 +48,8 @@ export const guidedTourDataRef = createExtensionDataRef().with({ * @public */ export const GuidedTourBlueprint = createExtensionBlueprint({ + // Singular on purpose: every extension of this kind is one tour, so ids + // read as `guided-tour:/`, like `nav-item` or `entity-card`. kind: 'guided-tour', attachTo: { id: 'api:guided-tours', input: 'tours' }, output: [guidedTourDataRef], diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx index 94aabdbf7c3..7bc0cd57fc3 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.tsx @@ -24,7 +24,9 @@ import { Fragment, ReactNode, useMemo } from 'react'; * @public */ export interface MarkdownTextProps { + /** The markdown source. */ content: string; + /** Class name of the wrapping element. */ className?: string; } diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts index 4eec9b674ae..8338ad893ff 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts @@ -88,7 +88,9 @@ export type GuidedTourAutoStart = false | 'login' | { route: string }; export interface GuidedTour { /** Unique id, e.g. `example/intro`. */ id: string; + /** Shown above every step and on the overview page. */ title: string; + /** One or two sentences for the overview page. */ description?: string; /** * Bump to show the tour again to users who completed or dismissed an @@ -97,12 +99,14 @@ export interface GuidedTour { version?: number; /** Ordering in the onboarding queue and on the overview page. Default 100. */ order?: number; + /** When the tour starts on its own. Default `false`. */ autoStart?: GuidedTourAutoStart; /** * App-relative path to navigate to when the tour is finished with Done * (or by clicking through its last step), e.g. back to the start page. */ completeRoute?: string; + /** The steps in the order they are shown. */ steps: GuidedTourStep[]; } diff --git a/workspaces/guided-tours/plugins/guided-tours/report.api.md b/workspaces/guided-tours/plugins/guided-tours/report.api.md index 1a8929f68ed..9d010b066fd 100644 --- a/workspaces/guided-tours/plugins/guided-tours/report.api.md +++ b/workspaces/guided-tours/plugins/guided-tours/report.api.md @@ -34,7 +34,7 @@ const guidedTourPlugin: OverridableFrontendPlugin< output: ExtensionDataRef; inputs: { tours: ExtensionInput< - ConfigurableExtensionDataRef, + ConfigurableExtensionDataRef, { singleton: false; optional: false; From 07e49838f6fb09aad560a19a7400c8de66aa520a Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 01:56:05 +0200 Subject: [PATCH 25/28] Add Playwright tests and raise the unit test coverage Unit tests now cover the overlay, the step card, the spotlight, the target hooks, the overview page, the extensions, the react hooks and helpers and the remaining branches of the api and progress store. Along the way the target hook stopped leaking the previous step's status into a new step, which could skip or center a step for a moment. The workspace gets Playwright tests against the dev app: the welcome tour across pages, the centered and anchored overlays, the click-through step, the previous button restoring earlier pages, resume after reload, Escape and close, the overview page and the header restart action. CI runs them through the playwrightTests flag. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- workspaces/guided-tours/.eslintignore | 1 + workspaces/guided-tours/bcp.json | 2 +- .../e2e-tests/guided-tours-page.test.ts | 92 ++++++++ workspaces/guided-tours/e2e-tests/helpers.ts | 52 +++++ .../guided-tours/e2e-tests/page-tours.test.ts | 127 +++++++++++ .../e2e-tests/welcome-tour.test.ts | 132 +++++++++++ workspaces/guided-tours/package.json | 5 +- workspaces/guided-tours/playwright.config.ts | 50 ++++ .../plugins/guided-tours-react/package.json | 1 + .../src/components/GuidedTourTarget.test.tsx | 43 ++++ .../src/components/MarkdownText.test.tsx | 25 ++ .../src/hooks/useGuidedTour.test.tsx | 141 ++++++++++++ .../guided-tours-react/src/types.test.ts | 30 +++ .../plugins/guided-tours/package.json | 1 + .../src/api/DefaultGuidedTourApi.test.ts | 82 +++++++ .../src/api/progressStore.test.ts | 51 +++++ .../overlay/GuidedTourOverlay.test.tsx | 213 ++++++++++++++++++ .../src/components/overlay/Spotlight.test.tsx | 47 ++++ .../src/components/overlay/StepCard.test.tsx | 80 +++++++ .../overlay/useTargetElement.test.tsx | 133 +++++++++++ .../components/overlay/useTargetElement.ts | 18 +- .../components/page/GuidedToursPage.test.tsx | 162 +++++++++++++ .../src/extensions/extensions.test.tsx | 80 +++++++ workspaces/guided-tours/tsconfig.json | 1 + workspaces/guided-tours/yarn.lock | 43 ++++ 25 files changed, 1605 insertions(+), 7 deletions(-) create mode 100644 workspaces/guided-tours/e2e-tests/guided-tours-page.test.ts create mode 100644 workspaces/guided-tours/e2e-tests/helpers.ts create mode 100644 workspaces/guided-tours/e2e-tests/page-tours.test.ts create mode 100644 workspaces/guided-tours/e2e-tests/welcome-tour.test.ts create mode 100644 workspaces/guided-tours/playwright.config.ts create mode 100644 workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours-react/src/types.test.ts create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx create mode 100644 workspaces/guided-tours/plugins/guided-tours/src/extensions/extensions.test.tsx diff --git a/workspaces/guided-tours/.eslintignore b/workspaces/guided-tours/.eslintignore index e5b19947ff1..c4f62acdcc6 100644 --- a/workspaces/guided-tours/.eslintignore +++ b/workspaces/guided-tours/.eslintignore @@ -1 +1,2 @@ +e2e-tests playwright.config.ts diff --git a/workspaces/guided-tours/bcp.json b/workspaces/guided-tours/bcp.json index fdd6800e206..a0c610a813d 100644 --- a/workspaces/guided-tours/bcp.json +++ b/workspaces/guided-tours/bcp.json @@ -2,6 +2,6 @@ "autoVersionBump": true, "knipReports": true, "listDeprecations": true, - "playwrightTests": false, + "playwrightTests": true, "codecov": true } diff --git a/workspaces/guided-tours/e2e-tests/guided-tours-page.test.ts b/workspaces/guided-tours/e2e-tests/guided-tours-page.test.ts new file mode 100644 index 00000000000..3a8f9a50f1b --- /dev/null +++ b/workspaces/guided-tours/e2e-tests/guided-tours-page.test.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { expect, test } from '@playwright/test'; +import { closeTour, resetAllTours, step, stepButton } from './helpers'; + +test.describe('guided tours page', () => { + test.beforeEach(async ({ page }) => { + await resetAllTours(page); + await page.goto('/guided-tours'); + await closeTour(page); + }); + + test('lists every tour with its status and lets the user start, continue and restart', async ({ + page, + }) => { + await expect( + page.getByRole('heading', { name: 'Guided tours' }).first(), + ).toBeVisible(); + for (const title of [ + 'Welcome to Backstage', + 'The software catalog', + 'Create from a template', + 'Your notifications', + 'Your settings', + ]) { + await expect(page.getByRole('heading', { name: title })).toBeVisible(); + } + const welcome = page.locator( + '[data-guided-tour="guided-tours.row.guided-tours/welcome"]', + ); + const catalog = page.locator( + '[data-guided-tour="guided-tours.row.guided-tours/catalog"]', + ); + await expect(welcome.getByText('Dismissed')).toBeVisible(); + await expect(catalog.getByText('New')).toBeVisible(); + await expect( + catalog.getByText('3 steps · Starts on first visit of /catalog'), + ).toBeVisible(); + + // Start opens the tour on the page of its first step + await catalog.getByRole('button', { name: 'Start' }).click(); + await expect(page).toHaveURL(/\/catalog/); + await expect(step(page, 'Pick a kind')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect(step(page, 'Yours, starred, or everything')).toBeVisible(); + + // a tour left on another page is not resumed here, the page offers to + // continue it where it was + await page.goto('/guided-tours'); + await expect(catalog.getByText('In progress')).toBeVisible(); + await expect(page.getByRole('dialog')).toHaveCount(0); + await catalog.getByRole('button', { name: 'Continue' }).click(); + await expect(page).toHaveURL(/\/catalog/); + await expect( + step(page, 'Yours, starred, or everything').getByText('Step 2 of 3'), + ).toBeVisible(); + await closeTour(page); + + // dismissed and completed tours can be restarted from the first step + await page.goto('/guided-tours'); + await expect(catalog.getByText('Dismissed')).toBeVisible(); + await welcome.getByRole('button', { name: 'Restart' }).click(); + await expect( + step(page, 'Welcome 👋').getByText('Step 1 of 6'), + ).toBeVisible(); + await closeTour(page); + + // Reset all asks for confirmation and clears every status + await page.getByRole('button', { name: 'Reset all tours' }).click(); + await expect( + page.getByRole('dialog').getByText('Reset all tours?'), + ).toBeVisible(); + await page.getByRole('button', { name: 'Cancel' }).click(); + await expect(welcome.getByText('Dismissed')).toBeVisible(); + await page.getByRole('button', { name: 'Reset all tours' }).click(); + await page.getByRole('button', { name: 'Reset', exact: true }).click(); + await expect(page.getByText('New')).toHaveCount(5); + }); +}); diff --git a/workspaces/guided-tours/e2e-tests/helpers.ts b/workspaces/guided-tours/e2e-tests/helpers.ts new file mode 100644 index 00000000000..fe89c77f115 --- /dev/null +++ b/workspaces/guided-tours/e2e-tests/helpers.ts @@ -0,0 +1,52 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { expect, Page } from '@playwright/test'; + +/** The button inside the step card; the dev pages have other Next/Previous buttons. */ +export const stepButton = (page: Page, name: 'Previous' | 'Next' | 'Done') => + page.getByRole('dialog').getByRole('button', { name, exact: true }); + +/** The step card: a centered dialog named after its heading, or an anchored popover. */ +export const step = (page: Page, title: string) => + page.getByRole('dialog', { name: title }); + +export const spotlight = (page: Page) => + page.getByTestId('guided-tour-spotlight'); + +/** Closes a running tour, if any. Tours start a moment after the page loads. */ +export async function closeTour(page: Page) { + const close = page.getByRole('button', { name: 'Close tour' }); + await close + .first() + .waitFor({ state: 'visible', timeout: 3000 }) + .catch(() => undefined); + if (await close.count()) { + await close.first().click(); + } + await expect(page.getByRole('dialog')).toHaveCount(0); +} + +/** + * Clears all progress through the guided tours page. The welcome tour then + * starts again on the next page load, as it does for a new user. + */ +export async function resetAllTours(page: Page) { + await page.goto('/guided-tours'); + await closeTour(page); + await page.getByRole('button', { name: 'Reset all tours' }).click(); + await page.getByRole('button', { name: 'Reset', exact: true }).click(); + await expect(page.getByRole('dialog')).toHaveCount(0); +} diff --git a/workspaces/guided-tours/e2e-tests/page-tours.test.ts b/workspaces/guided-tours/e2e-tests/page-tours.test.ts new file mode 100644 index 00000000000..529d4c02db1 --- /dev/null +++ b/workspaces/guided-tours/e2e-tests/page-tours.test.ts @@ -0,0 +1,127 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { expect, test } from '@playwright/test'; +import { + closeTour, + resetAllTours, + spotlight, + step, + stepButton, +} from './helpers'; + +test.describe('page tours', () => { + test.beforeEach(async ({ page }) => { + await resetAllTours(page); + await page.goto('/'); + await closeTour(page); + }); + + test('the catalog tour starts on the first visit and can be restarted from the header', async ({ + page, + }) => { + await page.goto('/catalog'); + await expect(step(page, 'Pick a kind')).toBeVisible(); + await expect(spotlight(page)).toBeVisible(); + await stepButton(page, 'Next').click(); + await stepButton(page, 'Next').click(); + await expect( + step(page, 'The entity table').getByText('Step 3 of 3'), + ).toBeVisible(); + await stepButton(page, 'Done').click(); + await expect(page.getByRole('dialog')).toHaveCount(0); + + // a finished tour stays away on the next visit, the header action replays it + await page.goto('/catalog'); + await expect( + page.getByRole('button', { name: 'Restart the guided tour' }), + ).toBeVisible(); + await expect(page.getByRole('dialog')).toHaveCount(0); + await page.getByRole('button', { name: 'Restart the guided tour' }).click(); + await expect(step(page, 'Pick a kind')).toBeVisible(); + await expect( + step(page, 'Pick a kind').getByText('Step 1 of 3'), + ).toBeVisible(); + }); + + test('the scaffolder tour has a click-through step and restores pages when going back', async ({ + page, + }) => { + await page.goto('/create'); + await expect(step(page, 'Find a template')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect(step(page, 'A template')).toBeVisible(); + await stepButton(page, 'Next').click(); + + // click-through: the hint is shown, the Next button stays, and clicking the + // highlighted element both opens the template and advances the tour + const choose = step(page, 'Start it'); + await expect(choose).toBeVisible(); + await expect( + choose.getByText('Click the highlighted element to continue.'), + ).toBeVisible(); + await expect(stepButton(page, 'Next')).toBeVisible(); + await page.getByTestId('template-card-actions--create').first().click(); + await expect(page).toHaveURL( + /\/create\/templates\/default\/example-nodejs-template/, + ); + await expect(step(page, 'Fill in the form')).toBeVisible(); + + await stepButton(page, 'Next').click(); + await expect(page).toHaveURL(/\/create\/tasks/); + await expect( + step(page, 'Follow your runs').getByText('Step 5 of 5'), + ).toBeVisible(); + + // Previous returns to the template page of the earlier step + await stepButton(page, 'Previous').click(); + await expect(page).toHaveURL( + /\/create\/templates\/default\/example-nodejs-template/, + ); + await expect(step(page, 'Fill in the form')).toBeVisible(); + await stepButton(page, 'Previous').click(); + await expect(page).toHaveURL(/\/create\/templates/); + await expect(step(page, 'Start it')).toBeVisible(); + }); + + test('the notifications and settings tours spotlight their pages', async ({ + page, + }) => { + await page.goto('/notifications'); + await expect(step(page, 'Unread first')).toBeVisible(); + await expect(spotlight(page)).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect(step(page, 'Read, saved, all')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect( + step(page, 'Inbox zero').getByText('Step 3 of 3'), + ).toBeVisible(); + await stepButton(page, 'Done').click(); + await expect(page.getByRole('dialog')).toHaveCount(0); + + await page.goto('/settings'); + await expect(step(page, 'Who you are')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect(step(page, 'Logout')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect(step(page, 'Light or dark')).toBeVisible(); + await stepButton(page, 'Next').click(); + await expect( + step(page, 'Pin the sidebar').getByText('Step 4 of 4'), + ).toBeVisible(); + await stepButton(page, 'Done').click(); + await expect(page.getByRole('dialog')).toHaveCount(0); + }); +}); diff --git a/workspaces/guided-tours/e2e-tests/welcome-tour.test.ts b/workspaces/guided-tours/e2e-tests/welcome-tour.test.ts new file mode 100644 index 00000000000..68e0d6257e4 --- /dev/null +++ b/workspaces/guided-tours/e2e-tests/welcome-tour.test.ts @@ -0,0 +1,132 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { expect, test } from '@playwright/test'; +import { + closeTour, + resetAllTours, + spotlight, + step, + stepButton, +} from './helpers'; + +test.describe('welcome tour', () => { + test.beforeEach(async ({ page }) => { + await resetAllTours(page); + }); + + test('starts on the first visit, moves across pages and finishes on the start page', async ({ + page, + }) => { + await page.goto('/'); + + // the first step has no target: a centered dialog without spotlight + const intro = step(page, 'Welcome 👋'); + await expect(intro).toBeVisible(); + await expect(intro.getByText('Welcome to Backstage')).toBeVisible(); + await expect(intro.getByText('Step 1 of 6')).toBeVisible(); + await expect(stepButton(page, 'Previous')).toBeDisabled(); + await expect(spotlight(page)).toHaveCount(0); + + // the second step navigates and anchors to the sidebar item + await stepButton(page, 'Next').click(); + await expect(page).toHaveURL(/\/guided-tours$/); + await expect(step(page, 'Guided tours')).toBeVisible(); + await expect( + step(page, 'Guided tours').getByText('Step 2 of 6'), + ).toBeVisible(); + await expect(spotlight(page)).toBeVisible(); + await expect(stepButton(page, 'Previous')).toBeEnabled(); + + await stepButton(page, 'Next').click(); + await expect(page).toHaveURL(/\/catalog/); + await expect(step(page, 'The software catalog')).toBeVisible(); + + // the previous button goes back one step and restores that step's page + await stepButton(page, 'Previous').click(); + await expect(page).toHaveURL(/\/guided-tours$/); + await expect(step(page, 'Guided tours')).toBeVisible(); + await stepButton(page, 'Previous').click(); + await expect(step(page, 'Welcome 👋')).toBeVisible(); + await expect(stepButton(page, 'Previous')).toBeDisabled(); + + // through to the end: Done closes the tour and returns to the start page + for (const title of [ + 'Guided tours', + 'The software catalog', + 'Create something new', + 'Your notifications', + 'Your settings', + ]) { + await stepButton(page, 'Next').click(); + await expect(step(page, title)).toBeVisible(); + } + await expect(page).toHaveURL(/\/settings/); + await expect( + step(page, 'Your settings').getByText('Step 6 of 6'), + ).toBeVisible(); + await expect(stepButton(page, 'Next')).toHaveCount(0); + await stepButton(page, 'Done').click(); + await expect(page.getByRole('dialog')).toHaveCount(0); + await expect(page).toHaveURL(/\/$/); + + // a completed tour does not come back + await page.goto('/guided-tours'); + const row = page.locator( + '[data-guided-tour="guided-tours.row.guided-tours/welcome"]', + ); + await expect(row.getByText('Completed')).toBeVisible(); + await expect(row.getByRole('button', { name: 'Restart' })).toBeVisible(); + await expect(page.getByRole('dialog')).toHaveCount(0); + }); + + test('remembers the current step across reloads and can be dismissed', async ({ + page, + }) => { + await page.goto('/'); + await stepButton(page, 'Next').click(); + await expect(step(page, 'Guided tours')).toBeVisible(); + + await page.reload(); + await expect(step(page, 'Guided tours')).toBeVisible(); + await expect( + step(page, 'Guided tours').getByText('Step 2 of 6'), + ).toBeVisible(); + + // Escape dismisses the tour, and dismissing is remembered + await page.keyboard.press('Escape'); + await expect(page.getByRole('dialog')).toHaveCount(0); + await page.reload(); + await expect( + page.getByRole('heading', { name: 'Guided tours', exact: true }).first(), + ).toBeVisible(); + await expect(page.getByRole('dialog')).toHaveCount(0); + }); + + test('the close button dismisses and the tours page shows the status', async ({ + page, + }) => { + await page.goto('/'); + await expect(step(page, 'Welcome 👋')).toBeVisible(); + await closeTour(page); + + await page.goto('/guided-tours'); + const row = page.locator( + '[data-guided-tour="guided-tours.row.guided-tours/welcome"]', + ); + await expect(row.getByText('Dismissed')).toBeVisible(); + await expect(row.getByText('6 steps · Starts on login')).toBeVisible(); + }); +}); diff --git a/workspaces/guided-tours/package.json b/workspaces/guided-tours/package.json index 797895957e8..c47f4eaf3c1 100644 --- a/workspaces/guided-tours/package.json +++ b/workspaces/guided-tours/package.json @@ -6,7 +6,7 @@ "node": "22 || 24" }, "scripts": { - "start": "backstage-cli repo start", + "start": "backstage-cli repo start --plugin guided-tours", "tsc": "tsc", "tsc:full": "tsc --skipLibCheck false --incremental false", "build:all": "backstage-cli repo build --all", @@ -16,6 +16,8 @@ "clean": "backstage-cli repo clean", "test": "backstage-cli repo test", "test:all": "backstage-cli repo test --coverage", + "test:e2e": "playwright test", + "test:e2e-ui": "playwright test --ui", "fix": "backstage-cli repo fix", "lint": "backstage-cli repo lint --since origin/main", "lint:all": "backstage-cli repo lint", @@ -39,6 +41,7 @@ "@backstage/e2e-test-utils": "^0.1.2", "@backstage/repo-tools": "^0.19.2", "@changesets/cli": "^2.27.1", + "@playwright/test": "^1.63.0", "knip": "^5.27.4", "node-gyp": "^10.0.0", "prettier": "^2.3.2", diff --git a/workspaces/guided-tours/playwright.config.ts b/workspaces/guided-tours/playwright.config.ts new file mode 100644 index 00000000000..7a6d059da9f --- /dev/null +++ b/workspaces/guided-tours/playwright.config.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineConfig } from '@playwright/test'; + +/** + * Runs the Playwright tests in `e2e-tests` against the guided tours dev app. + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: 'e2e-tests', + timeout: 60_000, + expect: { timeout: 10_000 }, + + // the dev app of plugins/guided-tours, unless PLAYWRIGHT_URL points elsewhere + webServer: process.env.PLAYWRIGHT_URL + ? [] + : [ + { + command: 'yarn start', + port: 3000, + reuseExistingServer: true, + timeout: 180_000, + }, + ], + + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + reporter: [['html', { open: 'never', outputFolder: 'e2e-test-report' }]], + outputDir: 'node_modules/.cache/e2e-test-results', + + use: { + baseURL: process.env.PLAYWRIGHT_URL ?? 'http://localhost:3000', + channel: 'chromium', + screenshot: 'only-on-failure', + trace: 'on-first-retry', + }, +}); diff --git a/workspaces/guided-tours/plugins/guided-tours-react/package.json b/workspaces/guided-tours/plugins/guided-tours-react/package.json index dd9db93eb6e..44f8af448db 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/package.json +++ b/workspaces/guided-tours/plugins/guided-tours-react/package.json @@ -64,6 +64,7 @@ "@backstage/frontend-test-utils": "^0.6.3", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "^6.30.2" diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.test.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.test.tsx new file mode 100644 index 00000000000..af31a2e72d7 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/components/GuidedTourTarget.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { render, screen } from '@testing-library/react'; +import { GuidedTourTarget, guidedTourTargetProps } from './GuidedTourTarget'; + +describe('GuidedTourTarget', () => { + it('marks elements through props or a wrapper', () => { + expect(guidedTourTargetProps('example.todos')).toEqual({ + 'data-guided-tour': 'example.todos', + }); + + render( + <> + + + + + + + , + ); + const span = screen.getByText('one').parentElement!; + expect(span.tagName).toBe('SPAN'); + expect(span).toHaveAttribute('data-guided-tour', 'as-span'); + expect(span).toHaveStyle({ display: 'contents' }); + const div = screen.getByText('two').parentElement!; + expect(div.tagName).toBe('DIV'); + expect(div).toHaveAttribute('data-guided-tour', 'as-div'); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx index 3f503181b1e..bb5205349e8 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/components/MarkdownText.test.tsx @@ -60,4 +60,29 @@ describe('MarkdownText', () => { expect(container.querySelector('img')).toBeNull(); expect(container).toHaveTextContent(''); }); + + it('renders the remaining block and inline tokens', () => { + const { container } = renderMd( + '~~gone~~ line \nbreak \\* escaped [t](/x "Title")\n\n```\nconst a = 1;\n```\n\n> quoted\n\n---\n\n- item with `code`\n\n nested paragraph', + ); + expect(container.querySelector('del')).toHaveTextContent('gone'); + expect(container.querySelector('br')).not.toBeNull(); + expect(container).toHaveTextContent('* escaped'); + expect(screen.getByRole('link', { name: 't' })).toHaveAttribute( + 'title', + 'Title', + ); + expect(container.querySelector('pre code')).toHaveTextContent( + 'const a = 1;', + ); + expect(container.querySelector('blockquote')).toHaveTextContent('quoted'); + expect(container.querySelector('hr')).toBeNull(); + expect(container.querySelector('li code')).toHaveTextContent('code'); + expect(container.querySelector('li')).toHaveTextContent('nested paragraph'); + }); + + it('renders nothing for empty content', () => { + const { container } = renderMd(''); + expect(container).toHaveTextContent(''); + }); }); diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx new file mode 100644 index 00000000000..2c6daddf313 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx @@ -0,0 +1,141 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { TestApiProvider } from '@backstage/frontend-test-utils'; +import { act, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { ReactNode } from 'react'; +import { + GuidedTour, + GuidedTourApi, + GuidedTourSnapshot, + guidedTourApiRef, +} from '../index'; +import { RestartTourAction } from '../components/RestartTourAction'; +import { useGuidedTour } from './useGuidedTour'; + +const tour: GuidedTour = { + id: 'example/intro', + title: 'Intro', + steps: [{ id: 's1', content: 'one' }], +}; + +/** A minimal api whose snapshot can be swapped from the test. */ +function fakeApi(active?: string) { + const listeners = new Set<() => void>(); + let snapshot: GuidedTourSnapshot = { + ready: true, + onboarded: true, + progress: {}, + state: { activeTourId: active, stepIndex: 0, queue: [] }, + }; + const api = { + getTour: (id: string) => (id === tour.id ? tour : undefined), + getProgress: jest.fn(() => undefined), + start: jest.fn(), + subscribe: (l: () => void) => { + listeners.add(l); + return () => listeners.delete(l); + }, + getSnapshot: () => snapshot, + setActive(id?: string) { + snapshot = { + ...snapshot, + state: { ...snapshot.state, activeTourId: id }, + }; + listeners.forEach(l => l()); + }, + }; + return api as unknown as GuidedTourApi & typeof api; +} + +function Probe(props: { id: string }) { + const result = useGuidedTour(props.id); + return ( + <> + available:{String(result.available)} + active:{String(result.active)} + + + ); +} + +const withApi = (api: GuidedTourApi | undefined, children: ReactNode) => + api ? ( + + {children} + + ) : ( + {children} + ); + +describe('useGuidedTour', () => { + it('is a no-op without the guided tour plugin', async () => { + render(withApi(undefined, )); + expect(screen.getByText('available:false')).toBeInTheDocument(); + expect(screen.getByText('active:false')).toBeInTheDocument(); + await userEvent.click(screen.getByRole('button', { name: 'start' })); + }); + + it('reports availability and activity and starts the tour', async () => { + const api = fakeApi(); + render( + withApi( + api, + <> + + + , + ), + ); + expect(screen.getByText('available:true')).toBeInTheDocument(); + expect(screen.getByText('available:false')).toBeInTheDocument(); + expect(screen.getAllByText('active:false')).toHaveLength(2); + + await userEvent.click(screen.getAllByRole('button', { name: 'start' })[0]); + expect(api.start).toHaveBeenCalledWith('example/intro', { force: true }); + + act(() => api.setActive('example/intro')); + expect(screen.getByText('active:true')).toBeInTheDocument(); + }); +}); + +describe('RestartTourAction', () => { + it('renders nothing for an unknown tour and restarts a known one', async () => { + const api = fakeApi(); + const { rerender } = render( + withApi(api, ), + ); + expect(screen.queryByRole('button')).toBeNull(); + + rerender( + withApi( + api, + , + ), + ); + await userEvent.click( + screen.getByRole('button', { name: 'Show me around' }), + ); + expect(api.start).toHaveBeenCalledWith('example/intro', { force: true }); + }); + + it('uses the default label', () => { + render(withApi(fakeApi(), )); + expect( + screen.getByRole('button', { name: 'Restart the guided tour' }), + ).toBeInTheDocument(); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/types.test.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.test.ts new file mode 100644 index 00000000000..73345351cc3 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/types.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { guidedTourTargetSelector } from './types'; + +describe('guidedTourTargetSelector', () => { + it('resolves ids to the data attribute and passes selectors through', () => { + expect(guidedTourTargetSelector('example.todos')).toBe( + '[data-guided-tour="example.todos"]', + ); + expect(guidedTourTargetSelector('say "hi"')).toBe( + '[data-guided-tour="say \\"hi\\""]', + ); + expect(guidedTourTargetSelector({ selector: 'nav a[href="/x"]' })).toBe( + 'nav a[href="/x"]', + ); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/package.json b/workspaces/guided-tours/plugins/guided-tours/package.json index fb98f7cd26d..dc63ddf9254 100644 --- a/workspaces/guided-tours/plugins/guided-tours/package.json +++ b/workspaces/guided-tours/plugins/guided-tours/package.json @@ -82,6 +82,7 @@ "@backstage/plugin-user-settings": "^0.9.6", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "^6.30.2" diff --git a/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts index d34cff7da24..976ef55dd8f 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts @@ -159,6 +159,88 @@ describe('DefaultGuidedTourApi', () => { expect(api.getProgress('a')).toBeUndefined(); expect(api.getProgress('b')).toMatchObject({ status: 'dismissed' }); }); + + it('starts at a given step, saves the previous tour and notifies listeners', () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a'), tour('b')], + storageApi: mockApis.storage(), + autoStart: false, + }); + expect(api.isAutoStartEnabled()).toBe(false); + expect(api.getTour('a')?.id).toBe('a'); + expect(api.getTour('nope')).toBeUndefined(); + expect(api.getProgress('nope')).toBeUndefined(); + + const listener = jest.fn(); + const unsubscribe = api.subscribe(listener); + api.start('a', { stepId: 's3' }); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'a', + stepIndex: 2, + }); + expect(listener).toHaveBeenCalled(); + api.start('a', { stepId: 'unknown', force: true }); + expect(api.getSnapshot().state.stepIndex).toBe(0); + + // switching to another tour keeps the first one resumable + api.next(); + api.start('b'); + expect(api.getProgress('a')).toMatchObject({ + status: 'in-progress', + stepIndex: 1, + }); + expect(api.getSnapshot().state.activeTourId).toBe('b'); + + listener.mockClear(); + unsubscribe(); + api.next(); + expect(listener).not.toHaveBeenCalled(); + }); + + it('ignores moves while no tour runs and empty tours', () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('empty', { steps: [] })], + storageApi: mockApis.storage(), + }); + api.start('empty'); + api.next(); + api.previous(); + api.dismiss(); + api.complete(); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + expect(api.getProgress('empty')).toBeUndefined(); + }); + + it('marks onboarded when a queue has nothing to play', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a')], + storageApi: mockApis.storage(), + }); + api.startQueue(['unknown']); + expect(api.getSnapshot().onboarded).toBe(false); + api.startQueue(['unknown'], { onboarding: true }); + await flush(); + expect(api.getSnapshot().onboarded).toBe(true); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + }); + + it('keeps the onboarding flag across a queue that is dismissed late', async () => { + const api = new DefaultGuidedTourApi({ + tours: [tour('a'), tour('b'), tour('c')], + storageApi: mockApis.storage(), + }); + api.startQueue(['a', 'b', 'c'], { onboarding: true }); + api.complete(); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'b', + queue: ['c'], + }); + api.complete(); + api.complete(); + await flush(); + expect(api.getSnapshot().onboarded).toBe(true); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + }); }); describe('selectLoginTours', () => { diff --git a/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts index 565d9080bd4..590b8d99b0e 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/progressStore.test.ts @@ -114,4 +114,55 @@ describe('ProgressStore', () => { status: 'dismissed', }); }); + + it('ignores malformed values, swallows write errors and can be destroyed', async () => { + const { api, flush } = slowStorage(); + await Promise.all([ + (() => { + const w = api.set('tour/a', { bogus: true } as any); + flush(); + return w; + })(), + (() => { + const w = api.set('onboarded', true); + flush(); + return w; + })(), + ]); + const store = new ProgressStore({ storage: api, tourIds: ['a', 'b'] }); + expect(store.getSnapshot()).toMatchObject({ + ready: true, + onboarded: true, + progress: {}, + }); + + const listener = jest.fn(); + store.subscribe(listener); + const originalSet = api.set; + api.set = () => Promise.reject(new Error('offline')); + await expect( + store.setProgress('b', progress('in-progress')), + ).resolves.toBeUndefined(); + expect(store.getSnapshot().progress.b).toMatchObject({ + status: 'in-progress', + }); + expect(listener).toHaveBeenCalled(); + + const cleared = store.clearAll(); + await tick(); + flush(); + await cleared; + expect(store.getSnapshot()).toMatchObject({ + onboarded: false, + progress: {}, + }); + + api.set = originalSet; + listener.mockClear(); + store.destroy(); + const external = api.set('onboarded', true); + flush(); + await external; + expect(listener).not.toHaveBeenCalled(); + }); }); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx new file mode 100644 index 00000000000..28e0ae45fc5 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx @@ -0,0 +1,213 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { identityApiRef } from '@backstage/frontend-plugin-api'; +import { + mockApis, + renderInTestApp, + TestApiProvider, +} from '@backstage/frontend-test-utils'; +import { + GuidedTour, + guidedTourApiRef, +} from '@backstage-community/plugin-guided-tours-react'; +import { act, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Route, Routes, useLocation } from 'react-router-dom'; +import { DefaultGuidedTourApi } from '../../api/DefaultGuidedTourApi'; +import { GuidedTourOverlay } from './GuidedTourOverlay'; + +const welcome: GuidedTour = { + id: 'app/welcome', + title: 'Welcome', + autoStart: 'login', + completeRoute: '/done', + steps: [ + { id: 'intro', title: 'Hi 👋', content: 'Centered step' }, + { + id: 'target', + title: 'The button', + target: 'demo.button', + content: 'Anchored step', + route: '/page', + }, + { + id: 'click', + title: 'Click it', + target: 'demo.button', + advanceOn: 'click', + content: 'Click through', + }, + ], +}; + +const catalog: GuidedTour = { + id: 'catalog/intro', + title: 'Catalog', + autoStart: { route: '/catalog' }, + steps: [ + { + id: 'gone', + target: 'missing', + targetTimeoutMs: 20, + onMissingTarget: 'skip', + content: 'Skipped', + }, + { + id: 'center', + target: 'missing-too', + targetTimeoutMs: 20, + content: 'Centered fallback', + }, + ], +}; + +function Location() { + return location:{useLocation().pathname}; +} + +async function renderOverlay(options: { + api: DefaultGuidedTourApi; + path?: string; + signedIn?: boolean; +}) { + const identityApi = mockApis.identity(); + if (options.signedIn === false) { + identityApi.getBackstageIdentity = () => new Promise(() => {}); + } + const result = await renderInTestApp( + + + + + Demo} + /> + + + , + { initialRouteEntries: [options.path ?? '/'] }, + ); + return result; +} + +describe('GuidedTourOverlay', () => { + it('stays idle before sign-in and when auto-start is off', async () => { + const off = new DefaultGuidedTourApi({ + tours: [welcome], + storageApi: mockApis.storage(), + autoStart: false, + }); + await renderOverlay({ api: off }); + const anon = new DefaultGuidedTourApi({ + tours: [welcome], + storageApi: mockApis.storage(), + }); + await renderOverlay({ api: anon, signedIn: false }); + await act(() => new Promise(r => setTimeout(r, 20))); + expect(screen.queryByRole('dialog')).toBeNull(); + expect(off.getSnapshot().state.activeTourId).toBeUndefined(); + expect(anon.getSnapshot().state.activeTourId).toBeUndefined(); + }); + + it('plays the login tour: centered, anchored, click-through, previous and done', async () => { + const api = new DefaultGuidedTourApi({ + tours: [welcome], + storageApi: mockApis.storage(), + }); + await renderOverlay({ api }); + + const intro = await screen.findByRole('dialog', { name: 'Hi 👋' }); + expect(intro).toBeVisible(); + expect(screen.getByText('Step 1 of 3')).toBeVisible(); + expect(screen.queryByTestId('guided-tour-spotlight')).toBeNull(); + + // step 2 navigates to its route, waits for the target and anchors to it + await userEvent.click(screen.getByRole('button', { name: 'Next' })); + expect(await screen.findByText('location:/page')).toBeVisible(); + expect( + await screen.findByRole('dialog', { name: 'The button' }), + ).toBeVisible(); + expect(screen.getByTestId('guided-tour-spotlight')).toBeVisible(); + + // previous goes back to the centered step + await userEvent.click(screen.getByRole('button', { name: 'Previous' })); + expect(await screen.findByRole('dialog', { name: 'Hi 👋' })).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Next' })); + await screen.findByRole('dialog', { name: 'The button' }); + + // the click-through step advances when the element itself is clicked + await userEvent.click(screen.getByRole('button', { name: 'Next' })); + expect( + await screen.findByRole('dialog', { name: 'Click it' }), + ).toBeVisible(); + expect( + screen.getByText('Click the highlighted element to continue.'), + ).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Demo' })); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + expect(api.getProgress('app/welcome')).toMatchObject({ + status: 'completed', + }); + expect(screen.getByText('location:/done')).toBeVisible(); + await waitFor(() => expect(api.getSnapshot().onboarded).toBe(true)); + }); + + it('resumes an in-progress tour and closes on Escape', async () => { + const storageApi = mockApis.storage(); + const first = new DefaultGuidedTourApi({ tours: [welcome], storageApi }); + first.start('app/welcome'); + first.next(); + await act(() => new Promise(r => setTimeout(r, 0))); + + const api = new DefaultGuidedTourApi({ tours: [welcome], storageApi }); + await renderOverlay({ api, path: '/page' }); + expect( + await screen.findByRole('dialog', { name: 'The button' }), + ).toBeVisible(); + expect(screen.getByText('Step 2 of 3')).toBeVisible(); + + await userEvent.keyboard('{Escape}'); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + expect(api.getProgress('app/welcome')).toMatchObject({ + status: 'dismissed', + stepIndex: 1, + }); + }); + + it('starts route tours on first visit, skips missing targets and centers the rest', async () => { + const api = new DefaultGuidedTourApi({ + tours: [catalog], + storageApi: mockApis.storage(), + }); + await renderOverlay({ api, path: '/catalog' }); + // the first step is skipped as its target never shows up, the second is + // shown centered instead + expect(await screen.findByText('Step 2 of 2')).toBeVisible(); + expect(screen.getByRole('dialog', { name: 'Catalog' })).toBeVisible(); + expect(screen.getByText('Centered fallback')).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Close tour' })); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + expect(api.getProgress('catalog/intro')).toMatchObject({ + status: 'dismissed', + }); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.test.tsx new file mode 100644 index 00000000000..35a92ac4f9a --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/Spotlight.test.tsx @@ -0,0 +1,47 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { render, screen } from '@testing-library/react'; +import { Spotlight } from './Spotlight'; + +describe('Spotlight', () => { + it('dims everything while the target is unknown', () => { + render(); + const svg = screen.getByTestId('guided-tour-spotlight'); + expect(svg.querySelector('path')).toHaveAttribute( + 'd', + 'M0 0H100000V100000H0Z', + ); + expect(svg.querySelectorAll('rect')).toHaveLength(0); + }); + + it('cuts a padded hole, shields it and lets clicks through on request', () => { + const rect = { top: 100, left: 50, width: 200, height: 40 }; + const { rerender } = render(); + const svg = screen.getByTestId('guided-tour-spotlight'); + const path = svg.querySelector('path')!.getAttribute('d')!; + expect(path).toContain('M0 0H100000V100000H0Z'); + expect(path).toContain('M52 94'); // left + radius - padding, top - padding + const rects = svg.querySelectorAll('rect'); + expect(rects).toHaveLength(2); + expect(rects[0]).toHaveAttribute('x', '44'); + expect(rects[0]).toHaveAttribute('width', '212'); + expect(rects[0]).toHaveStyle({ pointerEvents: 'auto' }); + + rerender(); + expect(svg.querySelectorAll('rect')).toHaveLength(1); + expect(svg.querySelector('rect')).toHaveAttribute('stroke-width', '2'); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.test.tsx new file mode 100644 index 00000000000..03847e3f373 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/StepCard.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { renderInTestApp } from '@backstage/frontend-test-utils'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { StepCard } from './StepCard'; + +describe('StepCard', () => { + const handlers = () => ({ + onPrevious: jest.fn(), + onNext: jest.fn(), + onDismiss: jest.fn(), + }); + + it('shows the first step with a disabled Previous button', async () => { + const h = handlers(); + await renderInTestApp( + , + ); + expect(screen.getByRole('heading', { name: 'Welcome' })).toBeVisible(); + expect(screen.getByText('there').tagName).toBe('STRONG'); + expect(screen.getByText('Step 1 of 3')).toBeVisible(); + expect(screen.getByRole('button', { name: 'Previous' })).toBeDisabled(); + expect( + screen.queryByText('Click the highlighted element to continue.'), + ).toBeNull(); + + await userEvent.click(screen.getByRole('button', { name: 'Next' })); + await userEvent.click(screen.getByRole('button', { name: 'Close tour' })); + expect(h.onNext).toHaveBeenCalledTimes(1); + expect(h.onDismiss).toHaveBeenCalledTimes(1); + expect(h.onPrevious).not.toHaveBeenCalled(); + }); + + it('shows Done on the last step and the hint on click-through steps', async () => { + const h = handlers(); + await renderInTestApp( + , + ); + expect(screen.getByRole('heading', { name: 'Last one' })).toBeVisible(); + expect(screen.getByText('Step 3 of 3')).toBeVisible(); + expect( + screen.getByText('Click the highlighted element to continue.'), + ).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Previous' })); + await userEvent.click(screen.getByRole('button', { name: 'Done' })); + expect(h.onPrevious).toHaveBeenCalledTimes(1); + expect(h.onNext).toHaveBeenCalledTimes(1); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx new file mode 100644 index 00000000000..048c6e29b07 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx @@ -0,0 +1,133 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { useElementRect, useTargetElement } from './useTargetElement'; + +describe('useTargetElement', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('finds an existing element at once and reports none without a selector', () => { + const el = document.createElement('div'); + el.setAttribute('data-guided-tour', 'x'); + document.body.appendChild(el); + + const found = renderHook(() => useTargetElement('[data-guided-tour="x"]')); + expect(found.result.current).toEqual({ element: el, status: 'found' }); + + const none = renderHook(() => useTargetElement(undefined)); + expect(none.result.current).toEqual({ element: null, status: 'none' }); + + const disabled = renderHook(() => + useTargetElement('[data-guided-tour="x"]', { enabled: false }), + ); + expect(disabled.result.current.status).toBe('resolving'); + }); + + it('waits for the element to appear and gives up after the timeout', async () => { + const { result } = renderHook(() => + useTargetElement('#late', { timeoutMs: 50 }), + ); + expect(result.current.status).toBe('resolving'); + + const el = document.createElement('div'); + el.id = 'late'; + act(() => { + document.body.appendChild(el); + }); + await waitFor(() => expect(result.current.status).toBe('found')); + expect(result.current.element).toBe(el); + + const missing = renderHook(() => + useTargetElement('#never', { timeoutMs: 20 }), + ); + await waitFor(() => + expect(missing.result.current).toEqual({ + element: null, + status: 'missing', + }), + ); + }); +}); + +const box = (left: number, top: number, width: number, height: number) => + ({ + left, + top, + width, + height, + right: left + width, + bottom: top + height, + } as DOMRect); + +describe('useElementRect', () => { + beforeAll(() => { + // jsdom 20 has no DOMRect; the hook builds one for display:contents wrappers + if (typeof DOMRect === 'undefined') { + (globalThis as any).DOMRect = class { + constructor( + public x: number, + public y: number, + public width: number, + public height: number, + ) {} + get left() { + return this.x; + } + get top() { + return this.y; + } + }; + } + }); + + it('measures the element, unions display:contents children and clears on null', async () => { + const wrapper = document.createElement('span'); + const a = document.createElement('button'); + const b = document.createElement('button'); + wrapper.append(a, b); + document.body.appendChild(wrapper); + wrapper.getBoundingClientRect = () => box(0, 0, 0, 0); + a.getBoundingClientRect = () => box(10, 20, 30, 10); + b.getBoundingClientRect = () => box(50, 25, 20, 15); + wrapper.scrollIntoView = jest.fn(); + + const { result, rerender } = renderHook( + (el: HTMLElement | null) => useElementRect(el), + { initialProps: wrapper as HTMLElement | null }, + ); + await waitFor(() => + expect(result.current).toEqual({ + top: 20, + left: 10, + width: 60, + height: 20, + }), + ); + expect(wrapper.scrollIntoView).toHaveBeenCalled(); + + const plain = document.createElement('div'); + plain.getBoundingClientRect = () => box(1, 2, 3, 4); + rerender(plain); + await waitFor(() => + expect(result.current).toEqual({ top: 2, left: 1, width: 3, height: 4 }), + ); + + rerender(null); + expect(result.current).toBeNull(); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts index 5fb9eb1a04b..ec850d29bdc 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.ts @@ -31,10 +31,17 @@ export function useTargetElement( options: { enabled?: boolean; timeoutMs?: number; resetKey?: string } = {}, ): TargetResult { const { enabled = true, timeoutMs = 5000, resetKey } = options; - const [result, setResult] = useState({ + const initial = (): TargetResult & { key?: string } => ({ element: null, status: selector ? 'resolving' : 'none', + key: resetKey, }); + const [stored, setStored] = useState(initial); + // a result that belongs to another step (stale until the effect below runs) + // must not leak into the new step, e.g. a `missing` that would skip it + const result = stored.key === resetKey ? stored : initial(); + const setResult = (next: TargetResult) => + setStored({ ...next, key: resetKey }); useEffect(() => { if (!selector) { @@ -47,9 +54,9 @@ export function useTargetElement( } const find = () => document.querySelector(selector); - const initial = find(); - if (initial) { - setResult({ element: initial, status: 'found' }); + const existing = find(); + if (existing) { + setResult({ element: existing, status: 'found' }); return undefined; } setResult({ element: null, status: 'resolving' }); @@ -78,9 +85,10 @@ export function useTargetElement( observer.disconnect(); clearTimeout(timer.id); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selector, enabled, timeoutMs, resetKey]); - return result; + return { element: result.element, status: result.status }; } export interface Rect { diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx new file mode 100644 index 00000000000..d1422ae5be6 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx @@ -0,0 +1,162 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + mockApis, + renderInTestApp, + TestApiProvider, +} from '@backstage/frontend-test-utils'; +import { guidedTourApiRef } from '@backstage-community/plugin-guided-tours-react'; +import { screen, within } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useLocation } from 'react-router-dom'; +import { DefaultGuidedTourApi } from '../../api/DefaultGuidedTourApi'; +import { GuidedToursPage } from './GuidedToursPage'; + +const tours = [ + { + id: 'app/welcome', + title: 'Welcome', + description: 'A first look.', + autoStart: 'login' as const, + order: 1, + steps: [ + { id: 'a', content: 'one' }, + { id: 'b', content: 'two', route: '/catalog' }, + ], + }, + { + id: 'catalog/intro', + title: 'Catalog', + autoStart: { route: '/catalog' }, + steps: [{ id: 'a', content: 'one' }], + }, +]; + +function Location() { + return location:{useLocation().pathname}; +} + +async function renderPage(api: DefaultGuidedTourApi) { + return renderInTestApp( + + + + , + ); +} + +describe('GuidedToursPage', () => { + it('lists the tours with their status and auto-start hints', async () => { + const api = new DefaultGuidedTourApi({ + tours, + storageApi: mockApis.storage(), + }); + api.start('catalog/intro'); + api.dismiss(); + await renderPage(api); + + expect(screen.getByRole('heading', { name: 'Guided tours' })).toBeVisible(); + const welcome = screen + .getByRole('heading', { name: 'Welcome' }) + .closest( + '[data-guided-tour="guided-tours.row.app/welcome"]', + ) as HTMLElement; + expect(within(welcome).getByText('New')).toBeVisible(); + expect(within(welcome).getByText('A first look.')).toBeVisible(); + expect( + within(welcome).getByText(/2 steps · Starts on login/), + ).toBeVisible(); + expect( + within(welcome).getByRole('button', { name: 'Start' }), + ).toBeVisible(); + + const catalog = screen + .getByRole('heading', { name: 'Catalog' }) + .closest( + '[data-guided-tour="guided-tours.row.catalog/intro"]', + ) as HTMLElement; + expect(within(catalog).getByText('Dismissed')).toBeVisible(); + expect( + within(catalog).getByText(/1 steps · Starts on first visit of \/catalog/), + ).toBeVisible(); + expect( + within(catalog).getByRole('button', { name: 'Restart' }), + ).toBeVisible(); + }); + + it('starts, continues on the right page and resets everything', async () => { + const api = new DefaultGuidedTourApi({ + tours, + storageApi: mockApis.storage(), + }); + await renderPage(api); + + // tours are listed by order: the welcome tour comes first + await userEvent.click(screen.getAllByRole('button', { name: 'Start' })[0]); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'app/welcome', + stepIndex: 0, + }); + + // leave the tour on its second step: the page offers to continue there + api.next(); + api.resetProgress('catalog/intro'); + api.start('catalog/intro'); + api.dismiss(); + expect(await screen.findByText('In progress')).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Continue' })); + expect(api.getSnapshot().state).toMatchObject({ + activeTourId: 'app/welcome', + stepIndex: 1, + }); + expect(await screen.findByText('location:/catalog')).toBeVisible(); + + await userEvent.click( + screen.getByRole('button', { name: 'Reset all tours' }), + ); + const dialog = await screen.findByRole('dialog'); + expect(within(dialog).getByText('Reset all tours?')).toBeVisible(); + await userEvent.click( + within(dialog).getByRole('button', { name: 'Cancel' }), + ); + expect(screen.queryByRole('dialog')).toBeNull(); + expect(api.getProgress('app/welcome')).toBeDefined(); + + await userEvent.click( + screen.getByRole('button', { name: 'Reset all tours' }), + ); + await userEvent.click( + within(await screen.findByRole('dialog')).getByRole('button', { + name: 'Reset', + }), + ); + expect(await screen.findAllByText('New')).toHaveLength(2); + expect(api.getProgress('app/welcome')).toBeUndefined(); + expect(api.getSnapshot().state.activeTourId).toBeUndefined(); + }); + + it('shows an empty state without tours', async () => { + const api = new DefaultGuidedTourApi({ + tours: [], + storageApi: mockApis.storage(), + }); + await renderPage(api); + expect(screen.getByText('No guided tours are installed.')).toBeVisible(); + expect( + screen.getByRole('button', { name: 'Reset all tours' }), + ).toBeDisabled(); + }); +}); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/extensions/extensions.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/extensions/extensions.test.tsx new file mode 100644 index 00000000000..8c497672b26 --- /dev/null +++ b/workspaces/guided-tours/plugins/guided-tours/src/extensions/extensions.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + ApiBlueprint, + coreExtensionData, + storageApiRef, +} from '@backstage/frontend-plugin-api'; +import { + createExtensionTester, + mockApis, + renderInTestApp, + TestApiProvider, +} from '@backstage/frontend-test-utils'; +import { + GuidedTourApi, + GuidedTourBlueprint, + guidedTourApiRef, +} from '@backstage-community/plugin-guided-tours-react'; +import { screen } from '@testing-library/react'; +import { DefaultGuidedTourApi } from '../api/DefaultGuidedTourApi'; +import { guidedTourApi } from './api'; +import { guidedToursPage } from './page'; + +const introTour = GuidedTourBlueprint.make({ + name: 'intro', + params: { + title: 'Intro tour', + steps: [{ id: 'one', content: 'One' }], + }, +}); + +describe('extensions', () => { + it('collects the tours and the autoStart config into the api', () => { + const factory = createExtensionTester(guidedTourApi, { + config: { autoStart: false }, + }) + // the tester installs the api under the `test` plugin id + .add(introTour.override({ attachTo: { id: 'api:test', input: 'tours' } })) + .get(ApiBlueprint.dataRefs.factory); + expect(factory.api).toBe(guidedTourApiRef); + expect(factory.deps).toEqual({ storageApi: storageApiRef }); + + const api = factory.factory({ + storageApi: mockApis.storage(), + }) as GuidedTourApi; + expect(api.isAutoStartEnabled()).toBe(false); + expect(api.getTours().map(t => t.id)).toEqual(['intro']); + }); + + it('mounts the overview page at /guided-tours', async () => { + const tester = createExtensionTester(guidedToursPage); + expect(tester.get(coreExtensionData.routePath)).toBe('/guided-tours'); + + const api = new DefaultGuidedTourApi({ + tours: [], + storageApi: mockApis.storage(), + }); + await renderInTestApp( + + {tester.get(coreExtensionData.reactElement)} + , + ); + expect( + await screen.findByText('No guided tours are installed.'), + ).toBeVisible(); + }); +}); diff --git a/workspaces/guided-tours/tsconfig.json b/workspaces/guided-tours/tsconfig.json index d346b34ac55..6ad54a8a867 100644 --- a/workspaces/guided-tours/tsconfig.json +++ b/workspaces/guided-tours/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "@backstage/cli/config/tsconfig.json", "include": [ + "e2e-tests", "packages/*/src", "plugins/*/src", "plugins/*/dev", diff --git a/workspaces/guided-tours/yarn.lock b/workspaces/guided-tours/yarn.lock index 4678c0c45fa..29a179d17c6 100644 --- a/workspaces/guided-tours/yarn.lock +++ b/workspaces/guided-tours/yarn.lock @@ -455,6 +455,7 @@ __metadata: "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" marked: "npm:^15.0.12" react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" react-dom: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" @@ -490,6 +491,7 @@ __metadata: "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" react-aria-components: "npm:~1.17.0" react-dom: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" @@ -3260,6 +3262,7 @@ __metadata: "@backstage/e2e-test-utils": "npm:^0.1.2" "@backstage/repo-tools": "npm:^0.19.2" "@changesets/cli": "npm:^2.27.1" + "@playwright/test": "npm:^1.63.0" knip: "npm:^5.27.4" node-gyp: "npm:^10.0.0" prettier: "npm:^2.3.2" @@ -5200,6 +5203,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.63.0": + version: 1.64.1 + resolution: "@playwright/test@npm:1.64.1" + dependencies: + playwright: "npm:1.64.1" + bin: + playwright: cli.js + checksum: 10/589855c5fbc9ebbfb072e77e4b24a646f302ca9823d56ac3ff08a8e4ecf7ee13a390fe19236f4f9737e9a736194324f244f90c409a10edeb480c5f99ce77d10e + languageName: node + linkType: hard + "@pmmmwh/react-refresh-webpack-plugin@npm:^0.6.0": version: 0.6.3 resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.6.3" @@ -6519,6 +6533,15 @@ __metadata: languageName: node linkType: hard +"@testing-library/user-event@npm:^14.0.0": + version: 14.6.8 + resolution: "@testing-library/user-event@npm:14.6.8" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10/674190e5d592d5f1478af26c08c13ee197dbbc03885da3b99312c9cd810e4dc9c0ffbd4df91c51f39d467c1866a0c28f451df56d3fd535a5260d7660c24d9f42 + languageName: node + linkType: hard + "@tokenizer/inflate@npm:^0.4.1": version: 0.4.1 resolution: "@tokenizer/inflate@npm:0.4.1" @@ -16842,6 +16865,26 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.64.1": + version: 1.64.1 + resolution: "playwright-core@npm:1.64.1" + bin: + playwright-core: cli.js + checksum: 10/4a173590bc784d8d5bfe2cace53ccc31316dac11475660b59cea24a2e833875d87183d41a957a20355301ac2b339a17940faaf0b42217156fa9c0c3cfdd4633c + languageName: node + linkType: hard + +"playwright@npm:1.64.1": + version: 1.64.1 + resolution: "playwright@npm:1.64.1" + dependencies: + playwright-core: "npm:1.64.1" + bin: + playwright: cli.js + checksum: 10/1096fa91e433f84c8677433a26052aa4f269bf0811aa793fe667d7053feb1c2852e9f10f9f0cced77fa2678f8580ed47192f29adbc9c027efa5ba87b38e23e50 + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" From 896e7a1af70002af9d3c7bc75d57ffb72572d29d Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 02:00:38 +0200 Subject: [PATCH 26/28] Use act from react in the tests The act re-exported by Testing Library is the deprecated one from react-dom/test-utils, which the CI deprecation check rejects. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../guided-tours-react/src/hooks/useGuidedTour.test.tsx | 3 ++- .../src/components/overlay/GuidedTourOverlay.test.tsx | 3 ++- .../src/components/overlay/useTargetElement.test.tsx | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx b/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx index 2c6daddf313..4a54069661f 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/hooks/useGuidedTour.test.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ import { TestApiProvider } from '@backstage/frontend-test-utils'; -import { act, render, screen } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; +import { act } from 'react'; import userEvent from '@testing-library/user-event'; import { ReactNode } from 'react'; import { diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx index 28e0ae45fc5..a8c6f6dc9a2 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx @@ -23,7 +23,8 @@ import { GuidedTour, guidedTourApiRef, } from '@backstage-community/plugin-guided-tours-react'; -import { act, screen, waitFor } from '@testing-library/react'; +import { screen, waitFor } from '@testing-library/react'; +import { act } from 'react'; import userEvent from '@testing-library/user-event'; import { Route, Routes, useLocation } from 'react-router-dom'; import { DefaultGuidedTourApi } from '../../api/DefaultGuidedTourApi'; diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx index 048c6e29b07..913d74f06a3 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/useTargetElement.test.tsx @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { act, renderHook, waitFor } from '@testing-library/react'; +import { renderHook, waitFor } from '@testing-library/react'; +import { act } from 'react'; import { useElementRect, useTargetElement } from './useTargetElement'; describe('useTargetElement', () => { From d95e58d8c1b0c93a57c8fc581623e879039b3ee1 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 08:36:19 +0200 Subject: [PATCH 27/28] Use path instead of route for the autoStart trigger The autoStart option now reads `{ path }` to describe the browser location that starts a tour. The step `route` and `completeRoute` keep their names. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- workspaces/guided-tours/.changeset/guided-tours-initial.md | 2 +- workspaces/guided-tours/README.md | 2 +- .../archive/2026-10-23-guided-tours-plugin/design.md | 6 +++--- .../archive/2026-10-23-guided-tours-plugin/proposal.md | 2 +- .../specs/guided-tours/spec.md | 4 ++-- workspaces/guided-tours/openspec/specs/guided-tours/spec.md | 6 +++--- .../guided-tours/plugins/guided-tours-react/README.md | 2 +- .../guided-tours/plugins/guided-tours-react/report.api.md | 2 +- .../plugins/guided-tours-react/src/blueprint.ts | 2 +- .../guided-tours/plugins/guided-tours-react/src/types.ts | 4 ++-- workspaces/guided-tours/plugins/guided-tours/README.md | 2 +- .../plugins/guided-tours/dev/tours/catalogTour.ts | 2 +- .../plugins/guided-tours/dev/tours/notificationsTour.ts | 2 +- .../plugins/guided-tours/dev/tours/scaffolderTour.ts | 2 +- .../plugins/guided-tours/dev/tours/settingsTour.ts | 2 +- .../guided-tours/plugins/guided-tours/report-alpha.api.md | 2 +- .../guided-tours/src/api/DefaultGuidedTourApi.test.ts | 2 +- .../src/components/overlay/GuidedTourOverlay.test.tsx | 2 +- .../src/components/overlay/GuidedTourOverlay.tsx | 2 +- .../src/components/page/GuidedToursPage.test.tsx | 2 +- .../guided-tours/src/components/page/GuidedToursPage.tsx | 4 ++-- .../guided-tours/plugins/guided-tours/src/translation.ts | 2 +- 22 files changed, 29 insertions(+), 29 deletions(-) diff --git a/workspaces/guided-tours/.changeset/guided-tours-initial.md b/workspaces/guided-tours/.changeset/guided-tours-initial.md index f352ed6a2a0..f1733d394c2 100644 --- a/workspaces/guided-tours/.changeset/guided-tours-initial.md +++ b/workspaces/guided-tours/.changeset/guided-tours-initial.md @@ -3,4 +3,4 @@ '@backstage-community/plugin-guided-tours-react': minor --- -Added the guided tours plugins for the new frontend system: spotlight steps on top of any page, per-user progress and automatic start on login or on the first visit of a route. See the [README](https://github.com/backstage/community-plugins/tree/main/workspaces/guided-tours/plugins/guided-tours#readme) for all the details. +Added the guided tours plugins for the new frontend system: spotlight steps on top of any page, per-user progress and automatic start on login or on the first visit of a path. See the [README](https://github.com/backstage/community-plugins/tree/main/workspaces/guided-tours/plugins/guided-tours#readme) for all the details. diff --git a/workspaces/guided-tours/README.md b/workspaces/guided-tours/README.md index 4de5fa888c7..7906c6cd701 100644 --- a/workspaces/guided-tours/README.md +++ b/workspaces/guided-tours/README.md @@ -2,7 +2,7 @@ This workspace contains the guided tours plugins for Backstage: spotlight steps on top of any page, per-user progress and automatic start on login or -on the first visit of a route. They target the new frontend system. +on the first visit of a path. They target the new frontend system. ## Plugins diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md index 9933ac1c8a0..ce93692bee2 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md @@ -29,7 +29,7 @@ 3. Steps spotlight a DOM element and show markdown text in a popover with Previous / Next / Close. 4. Progress (current step, dismissed, completed) is saved per user. -5. Auto-start modes: on login, on first visit of a route, or manual only. +5. Auto-start modes: on login, on first visit of a path, or manual only. 6. A tour that appears after the user has already been onboarded is played on its own, not merged into the welcome sequence. 7. `/guided-tours` page lists all tours, allows replay and reset. @@ -99,7 +99,7 @@ export interface GuidedTourStep { export type GuidedTourAutoStart = | false // manual only (default) | 'login' // part of onboarding / shown alone when new - | { route: string }; // first time the location matches this path (matchPath semantics) + | { path: string }; // first time the location matches this path (matchPath semantics) export interface GuidedTour { id: string; // defaults to the extension node id without the kind prefix, e.g. "example/intro" @@ -233,7 +233,7 @@ seen". 5. If `onboarded` is set: queue only `loginTours` that have **no** progress entry (new plugin enabled later, or bumped `version`). They are played alone, i.e. not re-attached to tours the user already handled. -6. Route tours: a `useLocation` effect matches `autoStart.route` against the +6. Path tours: a `useLocation` effect matches `autoStart.path` against the pathname. First match with no progress entry and nothing running starts the tour. Matching tours while another tour runs wait for the next navigation, they do not interrupt. diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md index e4a5ff138a8..0f04d71aa8a 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/proposal.md @@ -17,7 +17,7 @@ This change adds a first-class, extension-driven guided tour system that: dependency only on a small `-react` library, never on the tour plugin itself; - remembers per user, in user settings, what has been seen, dismissed and completed; -- can auto-start tours on login or on first visit of a route, shows a tour +- can auto-start tours on login or on first visit of a path, shows a tour that arrives later (new plugin installed) on its own, and lets users replay everything from a dedicated page. diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md index c9b15a14e67..bf6084f5122 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md @@ -97,9 +97,9 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident - **WHEN** `api:guided-tours` is configured with `autoStart: false` - **THEN** no tour starts automatically; manual start and the page still work -### Requirement: Auto-start on first visit of a route +### Requirement: Auto-start on first visit of a path -A tour with `autoStart: { route }` SHALL start the first time the location matches `route` for a user who has no progress entry for it, provided no other tour is running. +A tour with `autoStart: { path }` SHALL start the first time the location matches `path` for a user who has no progress entry for it, provided no other tour is running. #### Scenario: First navigation to a plugin diff --git a/workspaces/guided-tours/openspec/specs/guided-tours/spec.md b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md index a60dcff54d7..5e33de2fc3a 100644 --- a/workspaces/guided-tours/openspec/specs/guided-tours/spec.md +++ b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md @@ -4,7 +4,7 @@ Guided tours for the Backstage new frontend system: plugins register tours through an extension, steps spotlight elements and show markdown, progress -is saved per user, tours start on login or on the first visit of a route, +is saved per user, tours start on login or on the first visit of a path, and a dedicated page lists and replays them. ## Requirements @@ -104,9 +104,9 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident - **WHEN** `api:guided-tours` is configured with `autoStart: false` - **THEN** no tour starts automatically; manual start and the page still work -### Requirement: Auto-start on first visit of a route +### Requirement: Auto-start on first visit of a path -A tour with `autoStart: { route }` SHALL start the first time the location matches `route` for a user who has no progress entry for it, provided no other tour is running. +A tour with `autoStart: { path }` SHALL start the first time the location matches `path` for a user who has no progress entry for it, provided no other tour is running. #### Scenario: First navigation to a plugin diff --git a/workspaces/guided-tours/plugins/guided-tours-react/README.md b/workspaces/guided-tours/plugins/guided-tours-react/README.md index 3563181cc0b..481047cbc78 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/README.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/README.md @@ -17,7 +17,7 @@ export const introTour = GuidedTourBlueprint.make({ params: { title: 'Welcome to Example', description: 'A two minute walk through the example plugin.', - autoStart: { route: '/example' }, // first visit of /example + autoStart: { path: '/example' }, // first visit of /example steps: [ { id: 'todos', diff --git a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md index 81e658e23b2..136c7fe5b75 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md @@ -60,7 +60,7 @@ export type GuidedTourAutoStart = | false | 'login' | { - route: string; + path: string; }; // @public diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts index ba20dc39900..4dbde1d1803 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/blueprint.ts @@ -39,7 +39,7 @@ export const guidedTourDataRef = createExtensionDataRef().with({ * name: 'intro', * params: { * title: 'Welcome to Example', - * autoStart: { route: '/example' }, + * autoStart: { path: '/example' }, * steps: [{ id: 'todos', target: 'example.todos', content: 'Your **todos**.' }], * }, * }); diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts index 8338ad893ff..8c3daaa0d83 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts @@ -74,11 +74,11 @@ export interface GuidedTourStep { * - `false`: manual only (default). * - `'login'`: part of the onboarding sequence; a login tour that shows up * after the user has been onboarded is played alone. - * - `{ route }`: the first time the current location matches the path. + * - `{ path }`: the first time the current location matches the path. * * @public */ -export type GuidedTourAutoStart = false | 'login' | { route: string }; +export type GuidedTourAutoStart = false | 'login' | { path: string }; /** * A guided tour: an ordered list of steps plus metadata. diff --git a/workspaces/guided-tours/plugins/guided-tours/README.md b/workspaces/guided-tours/plugins/guided-tours/README.md index bdb8dbc7c37..ab86630d866 100644 --- a/workspaces/guided-tours/plugins/guided-tours/README.md +++ b/workspaces/guided-tours/plugins/guided-tours/README.md @@ -2,7 +2,7 @@ Guided tours for the Backstage new frontend system: spotlight steps with markdown, per-user progress in user settings, auto-start on login or on the -first visit of a route, and an overview page at `/guided-tours`. +first visit of a path, and an overview page at `/guided-tours`. Install the package in `packages/app` (it is discovered through `app.packages: all`) and add the page to your sidebar: diff --git a/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts index 1b8791b2295..78bebdb8371 100644 --- a/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/catalogTour.ts @@ -21,7 +21,7 @@ export const catalogTour = GuidedTourBlueprint.make({ params: { title: 'The software catalog', description: 'Filters, the entity table and search on the catalog page.', - autoStart: { route: '/catalog' }, + autoStart: { path: '/catalog' }, order: 10, steps: [ { diff --git a/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts index f9b7f238ea5..84315f15ef0 100644 --- a/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/notificationsTour.ts @@ -21,7 +21,7 @@ export const notificationsTour = GuidedTourBlueprint.make({ params: { title: 'Your notifications', description: 'Reading, filtering and clearing notifications.', - autoStart: { route: '/notifications' }, + autoStart: { path: '/notifications' }, order: 12, steps: [ { diff --git a/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts index 5da0b01393b..a7edf167b4d 100644 --- a/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/scaffolderTour.ts @@ -21,7 +21,7 @@ export const scaffolderTour = GuidedTourBlueprint.make({ params: { title: 'Create from a template', description: 'Finding a template, starting it and following its tasks.', - autoStart: { route: '/create' }, + autoStart: { path: '/create' }, order: 11, steps: [ { diff --git a/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts b/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts index cb4e0c9574a..a0fea3bde14 100644 --- a/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts +++ b/workspaces/guided-tours/plugins/guided-tours/dev/tours/settingsTour.ts @@ -21,7 +21,7 @@ export const settingsTour = GuidedTourBlueprint.make({ params: { title: 'Your settings', description: 'Profile, theme and the sidebar.', - autoStart: { route: '/settings' }, + autoStart: { path: '/settings' }, order: 13, steps: [ { diff --git a/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md b/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md index b3c46cc2712..aed786bce56 100644 --- a/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md +++ b/workspaces/guided-tours/plugins/guided-tours/report-alpha.api.md @@ -26,7 +26,7 @@ export const guidedTourTranslationRef: TranslationRef< readonly 'page.resetAllTitle': 'Reset all tours?'; readonly 'page.resetAllBody': 'Progress of every tour is cleared and the welcome tours play again on your next visit.'; readonly 'page.autoStartLogin': 'Starts on login'; - readonly 'page.autoStartRoute': 'Starts on first visit of {{route}}'; + readonly 'page.autoStartPath': 'Starts on first visit of {{path}}'; readonly 'overlay.loading': 'Looking for the next step…'; readonly 'overlay.close': 'Close tour'; readonly 'overlay.next': 'Next'; diff --git a/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts index 976ef55dd8f..d619266334a 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/api/DefaultGuidedTourApi.test.ts @@ -248,7 +248,7 @@ describe('selectLoginTours', () => { tour('manual'), tour('login-b', { autoStart: 'login', order: 2 }), tour('login-a', { autoStart: 'login', order: 1 }), - tour('route', { autoStart: { route: '/x' } }), + tour('route', { autoStart: { path: '/x' } }), ]; const progress = (id: string, status: 'completed' | 'dismissed') => ({ [id]: { status, stepIndex: 0, version: 1, updatedAt: '' }, diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx index a8c6f6dc9a2..9ee88cff380 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx @@ -57,7 +57,7 @@ const welcome: GuidedTour = { const catalog: GuidedTour = { id: 'catalog/intro', title: 'Catalog', - autoStart: { route: '/catalog' }, + autoStart: { path: '/catalog' }, steps: [ { id: 'gone', diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx index 8c7ba2920a0..08a835fd652 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx @@ -97,7 +97,7 @@ export function GuidedTourOverlay() { typeof t.autoStart === 'object' && t.autoStart !== null && matchPath( - { path: t.autoStart.route, end: false }, + { path: t.autoStart.path, end: false }, location.pathname, ) && api.getProgress(t.id) === undefined, diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx index d1422ae5be6..449f1bbb638 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.test.tsx @@ -40,7 +40,7 @@ const tours = [ { id: 'catalog/intro', title: 'Catalog', - autoStart: { route: '/catalog' }, + autoStart: { path: '/catalog' }, steps: [{ id: 'a', content: 'one' }], }, ]; diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx index af98de53ede..f3f97c41b11 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/page/GuidedToursPage.tsx @@ -96,8 +96,8 @@ function TourRow(props: { tour: GuidedTour; progress?: GuidedTourProgress }) { {tour.autoStart === 'login' && ` · ${t('page.autoStartLogin')}`} {typeof tour.autoStart === 'object' && tour.autoStart !== null && - ` · ${t('page.autoStartRoute', { - route: tour.autoStart.route, + ` · ${t('page.autoStartPath', { + path: tour.autoStart.path, })}`} diff --git a/workspaces/guided-tours/plugins/guided-tours/src/translation.ts b/workspaces/guided-tours/plugins/guided-tours/src/translation.ts index 567be18717f..dff5656ee7c 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/translation.ts +++ b/workspaces/guided-tours/plugins/guided-tours/src/translation.ts @@ -44,7 +44,7 @@ export const guidedTourTranslationRef = createTranslationRef({ cancel: 'Cancel', confirm: 'Reset', autoStartLogin: 'Starts on login', - autoStartRoute: 'Starts on first visit of {{route}}', + autoStartPath: 'Starts on first visit of {{path}}', status: { new: 'New', inProgress: 'In progress', From e8a46f335e3516a41649a5ee02a27070c9f18ce2 Mon Sep 17 00:00:00 2001 From: Christoph Jerolimov Date: Sat, 24 Oct 2026 08:46:13 +0200 Subject: [PATCH 28/28] Add an exact flag to the autoStart path The autoStart path now matches the location exactly by default. Tours that should also start below the path, for example on entity pages under /catalog, set exact: false. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christoph Jerolimov --- .../2026-10-23-guided-tours-plugin/design.md | 2 +- .../specs/guided-tours/spec.md | 7 +++- .../openspec/specs/guided-tours/spec.md | 7 +++- .../plugins/guided-tours-react/README.md | 2 +- .../plugins/guided-tours-react/report.api.md | 1 + .../plugins/guided-tours-react/src/types.ts | 16 +++++++-- .../overlay/GuidedTourOverlay.test.tsx | 35 +++++++++++++++++++ .../components/overlay/GuidedTourOverlay.tsx | 2 +- 8 files changed, 65 insertions(+), 7 deletions(-) diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md index ce93692bee2..b0fe0fcb79f 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/design.md @@ -99,7 +99,7 @@ export interface GuidedTourStep { export type GuidedTourAutoStart = | false // manual only (default) | 'login' // part of onboarding / shown alone when new - | { path: string }; // first time the location matches this path (matchPath semantics) + | { path: string; exact?: boolean }; // first time the location is this path; exact: false also matches below it export interface GuidedTour { id: string; // defaults to the extension node id without the kind prefix, e.g. "example/intro" diff --git a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md index bf6084f5122..daaeaadcb46 100644 --- a/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md +++ b/workspaces/guided-tours/openspec/changes/archive/2026-10-23-guided-tours-plugin/specs/guided-tours/spec.md @@ -99,13 +99,18 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident ### Requirement: Auto-start on first visit of a path -A tour with `autoStart: { path }` SHALL start the first time the location matches `path` for a user who has no progress entry for it, provided no other tour is running. +A tour with `autoStart: { path }` SHALL start the first time the location is `path` for a user who has no progress entry for it, provided no other tour is running. With `exact: false` any location below `path` SHALL match as well. #### Scenario: First navigation to a plugin - **WHEN** a user without progress for `example/intro` navigates to `/example` - **THEN** `example/intro` starts +#### Scenario: Entity page below the path + +- **WHEN** a user without progress for `example/intro` navigates to `/example/details` +- **THEN** nothing starts, unless the tour sets `exact: false` + #### Scenario: Already seen - **WHEN** the user has `completed` or `dismissed` progress for `example/intro` and navigates to `/example` diff --git a/workspaces/guided-tours/openspec/specs/guided-tours/spec.md b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md index 5e33de2fc3a..78ce581de26 100644 --- a/workspaces/guided-tours/openspec/specs/guided-tours/spec.md +++ b/workspaces/guided-tours/openspec/specs/guided-tours/spec.md @@ -106,13 +106,18 @@ Tours with `autoStart: 'login'` SHALL start automatically after the user's ident ### Requirement: Auto-start on first visit of a path -A tour with `autoStart: { path }` SHALL start the first time the location matches `path` for a user who has no progress entry for it, provided no other tour is running. +A tour with `autoStart: { path }` SHALL start the first time the location is `path` for a user who has no progress entry for it, provided no other tour is running. With `exact: false` any location below `path` SHALL match as well. #### Scenario: First navigation to a plugin - **WHEN** a user without progress for `example/intro` navigates to `/example` - **THEN** `example/intro` starts +#### Scenario: Entity page below the path + +- **WHEN** a user without progress for `example/intro` navigates to `/example/details` +- **THEN** nothing starts, unless the tour sets `exact: false` + #### Scenario: Already seen - **WHEN** the user has `completed` or `dismissed` progress for `example/intro` and navigates to `/example` diff --git a/workspaces/guided-tours/plugins/guided-tours-react/README.md b/workspaces/guided-tours/plugins/guided-tours-react/README.md index 481047cbc78..b93d2600a99 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/README.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/README.md @@ -17,7 +17,7 @@ export const introTour = GuidedTourBlueprint.make({ params: { title: 'Welcome to Example', description: 'A two minute walk through the example plugin.', - autoStart: { path: '/example' }, // first visit of /example + autoStart: { path: '/example' }, // first visit of /example (exact: false for subpages too) steps: [ { id: 'todos', diff --git a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md index 136c7fe5b75..90c2ad2d7e9 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/report.api.md +++ b/workspaces/guided-tours/plugins/guided-tours-react/report.api.md @@ -61,6 +61,7 @@ export type GuidedTourAutoStart = | 'login' | { path: string; + exact?: boolean; }; // @public diff --git a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts index 8c3daaa0d83..db61bd580c3 100644 --- a/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts +++ b/workspaces/guided-tours/plugins/guided-tours-react/src/types.ts @@ -74,11 +74,23 @@ export interface GuidedTourStep { * - `false`: manual only (default). * - `'login'`: part of the onboarding sequence; a login tour that shows up * after the user has been onboarded is played alone. - * - `{ path }`: the first time the current location matches the path. + * - `{ path }`: the first time the current location is the path. With + * `exact: false` any location below the path matches as well. * * @public */ -export type GuidedTourAutoStart = false | 'login' | { path: string }; +export type GuidedTourAutoStart = + | false + | 'login' + | { + /** App-relative path, e.g. `/catalog`. */ + path: string; + /** + * Match the path exactly (default `true`), or also any location + * below it such as `/catalog/default/component/foo` (`false`). + */ + exact?: boolean; + }; /** * A guided tour: an ordered list of steps plus metadata. diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx index 9ee88cff380..0572e57de6f 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.test.tsx @@ -211,4 +211,39 @@ describe('GuidedTourOverlay', () => { status: 'dismissed', }); }); + + it('matches the auto-start path exactly unless exact is false', async () => { + const step = { id: 'one', content: 'Hello' }; + const exact: GuidedTour = { + id: 'catalog/exact', + title: 'Exact', + autoStart: { path: '/catalog' }, + steps: [step], + }; + const prefix: GuidedTour = { + id: 'catalog/prefix', + title: 'Prefix', + autoStart: { path: '/catalog', exact: false }, + steps: [step], + }; + const api = new DefaultGuidedTourApi({ + tours: [exact, prefix], + storageApi: mockApis.storage(), + }); + + // below the path only the prefix tour starts + const below = await renderOverlay({ + api, + path: '/catalog/default/component/foo', + }); + expect(await screen.findByRole('dialog', { name: 'Prefix' })).toBeVisible(); + await userEvent.click(screen.getByRole('button', { name: 'Close tour' })); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + expect(api.getProgress('catalog/exact')).toBeUndefined(); + below.unmount(); + + // on the path itself the exact tour starts + await renderOverlay({ api, path: '/catalog' }); + expect(await screen.findByRole('dialog', { name: 'Exact' })).toBeVisible(); + }); }); diff --git a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx index 08a835fd652..45b99c3c446 100644 --- a/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx +++ b/workspaces/guided-tours/plugins/guided-tours/src/components/overlay/GuidedTourOverlay.tsx @@ -97,7 +97,7 @@ export function GuidedTourOverlay() { typeof t.autoStart === 'object' && t.autoStart !== null && matchPath( - { path: t.autoStart.path, end: false }, + { path: t.autoStart.path, end: t.autoStart.exact !== false }, location.pathname, ) && api.getProgress(t.id) === undefined,